Mercurial > hg > mercurial
changeset 442:6c43663744d9 Faradi-7.0.x
getCurrentVersion do pull only when remote repository is updated
* * *
Add option that control if we should always pull in getCurrentVersion
* * *
Turn off by default
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Mon, 18 Jun 2012 22:04:51 +0400 |
parents | 4a76645fe087 |
children | 6fb828bf0d87 |
files | mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java |
diffstat | 7 files changed, 116 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java Mon Jun 18 22:04:51 2012 +0400 @@ -34,6 +34,7 @@ private Integer myRevisionNumber; private AuthSettings myAuthSettings; private String myRepositoryUrl; + private String myBranchName; public IdentifyCommand(@NotNull String hgPath, @NotNull File workingDir, @NotNull AuthSettings authSettings) { super(hgPath, workingDir, authSettings); @@ -59,6 +60,11 @@ return this; } + public IdentifyCommand branch(@NotNull String branchName) { + myBranchName = branchName; + return this; + } + public IdentifyCommand withAuthSettings(@NotNull AuthSettings authSettings) { myAuthSettings = authSettings; return this; @@ -83,6 +89,9 @@ } else if (myRevisionNumber != null) { cli.addParameter("--rev"); cli.addParameter(myRevisionNumber.toString()); + } else if (myBranchName != null) { + cli.addParameter("--rev"); + cli.addParameter(myBranchName); } CommandResult res = runCommand(cli, with().failureWhenStderrNotEmpty()); String output = res.getStdout().trim();
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Mon Jun 18 22:04:51 2012 +0400 @@ -213,8 +213,22 @@ @NotNull public String getCurrentVersion(@NotNull final VcsRoot root) throws VcsException { Settings settings = createSettings(root); + if (myConfig.checkRemoteRepositoryUpdateBeforePull()) { + HgRepo repo = createRepo(settings); + if (repo.isValidRepository()) { + String remoteCsetId = repo.id() + .repository(settings.getRepository()) + .withAuthSettings(settings.getAuthSettings()) + .branch(settings.getBranchName()) + .call(); + Map<String, ChangeSet> localBranches = repo.branches().call(); + ChangeSet localCset = localBranches.get(settings.getBranchName()); + if (localCset != null && localCset.getId().equals(remoteCsetId)) + return localCset.getFullVersion(); + } + } syncRepository(settings); - HgRepo repo = createRepo(settings); + HgRepo repo = createRepo(settings);//create new repo because repository cache dir can be changed (when repository became unrelated) Map<String, ChangeSet> result = repo.branches().call(); if (!result.containsKey(settings.getBranchName())) { throw new VcsException("Unable to find current version for the branch: " + settings.getBranchName());
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/RepoFactory.java Mon Jun 18 22:04:51 2012 +0400 @@ -14,7 +14,7 @@ /** * @author dmitry.neverov */ -public final class RepoFactory { +public class RepoFactory { private final ServerPluginConfig myConfig; private File myLogTemplate;
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfig.java Mon Jun 18 22:04:51 2012 +0400 @@ -15,4 +15,6 @@ int getPullTimeout(); public boolean dontUseRevsets(); + + public boolean checkRemoteRepositoryUpdateBeforePull(); }
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigImpl.java Mon Jun 18 22:04:51 2012 +0400 @@ -43,4 +43,8 @@ int timeout = TeamCityProperties.getInteger(PULL_TIMEOUT_SECONDS, DEFAULT_PULL_TIMEOUT_SECONDS); return timeout > 0 ? timeout : DEFAULT_PULL_TIMEOUT_SECONDS; } + + public boolean checkRemoteRepositoryUpdateBeforePull() { + return TeamCityProperties.getBoolean("teamcity.hg.check.repository.updated.before.pull"); + } }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Mon Jun 18 22:04:51 2012 +0400 @@ -31,9 +31,11 @@ import java.io.FilenameFilter; import java.io.IOException; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import static com.intellij.openapi.util.io.FileUtil.copyDir; import static com.intellij.openapi.util.io.FileUtil.moveDirWithContent; +import static jetbrains.buildServer.buildTriggers.vcs.mercurial.ServerPluginConfigBuilder.serverPluginConfig; import static jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder.vcsRoot; @Test @@ -533,6 +535,76 @@ } + public void getCurrentVersion_should_pull_only_when_remote_repository_is_updated() throws IOException, VcsException { + ServerPluginConfig config = serverPluginConfig(). + cachesDir(myTempFiles.createTempDir()) + .checkRemoteRepositoryUpdatedBeforePull() + .build(); + + CustomRepoFactory repoFactory = new CustomRepoFactory(config); + MercurialVcsSupport vcs = Util.createMercurialServerSupport(new Mockery(), config, repoFactory); + VcsRootImpl root = createVcsRoot(simpleRepo()); + + vcs.getCurrentVersion(root); + + AtomicInteger fetchCount = repoFactory.getFetchCount(); + assertEquals(fetchCount.get(), 1); + + vcs.getCurrentVersion(root); + + fetchCount = repoFactory.getFetchCount(); + assertEquals(fetchCount.get(), 1); + } + + + private class CustomRepoFactory extends RepoFactory { + private final ServerPluginConfig myConfig; + private final AtomicInteger myFetchCount; + + private CustomRepoFactory(@NotNull ServerPluginConfig config) throws IOException { + super(config); + myConfig = config; + myFetchCount = new AtomicInteger(0); + } + + @NotNull + @Override + public ServerHgRepo create(@NotNull File workingDir, @NotNull String hgPath, @NotNull AuthSettings authSettings) throws VcsException { + return new PullCountingHgRepo(myConfig, workingDir, hgPath, authSettings, myFetchCount); + } + + AtomicInteger getFetchCount() { + return myFetchCount; + } + } + + private class PullCountingHgRepo extends ServerHgRepo { + + private final AtomicInteger myPullCount; + + private PullCountingHgRepo(@NotNull ServerPluginConfig config, + @NotNull File workingDir, + @NotNull String hgPath, + @NotNull AuthSettings authSettings, + @NotNull AtomicInteger pullCount) { + super(config, workingDir, hgPath, authSettings); + myPullCount = pullCount; + } + + @Override + public PullCommand pull() { + myPullCount.incrementAndGet(); + return super.pull(); + } + + @Override + public CloneCommand doClone() { + myPullCount.incrementAndGet(); + return super.doClone(); + } + } + + private void assertFiles(final List<String> expectedFiles, final ModificationData modificationData) { Set<String> actualFiles = new HashSet<String>(); for (VcsChange vc: modificationData.getChanges()) {
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Tue May 15 10:21:05 2012 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ServerPluginConfigBuilder.java Mon Jun 18 22:04:51 2012 +0400 @@ -13,6 +13,7 @@ private String myHgPath; private File myCachesDir; private boolean myDontUseRevsets = false; + private boolean myCheckRemoteRepositoryUpdatedBeforePull = false; @NotNull public ServerPluginConfig build() { @@ -40,9 +41,16 @@ public boolean dontUseRevsets() { return myDontUseRevsets; } + + public boolean checkRemoteRepositoryUpdateBeforePull() { + return myCheckRemoteRepositoryUpdatedBeforePull; + } }; } + public static ServerPluginConfigBuilder serverPluginConfig() { + return new ServerPluginConfigBuilder(); + } public ServerPluginConfigBuilder userPullProtocol(boolean doUse) { myUsePullProtocol = doUse; @@ -63,4 +71,9 @@ myDontUseRevsets = true; return this; } + + public ServerPluginConfigBuilder checkRemoteRepositoryUpdatedBeforePull() { + myCheckRemoteRepositoryUpdatedBeforePull = true; + return this; + } }