Mercurial > hg > mercurial
changeset 213:8ec94ce51d84
Do init+pull instead of clone in agent-side checkout
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Mon, 04 Apr 2011 18:01:45 +0400 |
parents | a813cc021b13 |
children | a4f19be86fed |
files | mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Init.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java |
diffstat | 3 files changed, 51 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java Thu Mar 31 09:47:49 2011 +0400 +++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java Mon Apr 04 18:01:45 2011 +0400 @@ -31,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; +import java.io.IOException; public class MercurialAgentSideVcsSupport extends AgentVcsSupport implements UpdateByIncludeRules2 { @@ -47,12 +48,10 @@ public void process(@NotNull final IncludeRule includeRule, @NotNull final File workingDir) throws VcsException { checkRuleIsValid(includeRule); Settings settings = new Settings(vcsRoot); - if (useLocalMirrors) updateLocalMirror(vcsRoot, logger); - if (settings.isValidRepository(workingDir)) { - updateRepository(workingDir, settings, logger, useLocalMirrors); - } else { - cloneRepository(workingDir, settings, logger, useLocalMirrors); + if (useLocalMirrors) { + updateLocalMirror(vcsRoot, logger); } + updateRepository(workingDir, settings, logger, useLocalMirrors); updateWorkingDir(settings, workingDir, toVersion, logger); } @@ -78,54 +77,49 @@ return "true".equals(value); } - private void cloneRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException { - String message = "No repository in working directory found, start cloning from " + (useLocalMirrors ? "local mirror" : "remote repository"); - logger.message(message); - if (useLocalMirrors) { - cloneFromLocalMirror(settings, workingDir); - } else { - cloneFromRemote(settings, workingDir); + private void initRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException { + try { + logger.message("Init repository at " + workingDir.getAbsolutePath()); + String defaultPullUrl = getDefaultPullUrl(settings, useLocalMirrors); + new Init(settings, workingDir, defaultPullUrl).execute(); + } catch (IOException e) { + throw new VcsException("Error while initializing repository at " + workingDir.getAbsolutePath(), e); } - logger.message("Repository successfully cloned to working directory: " + workingDir.getAbsolutePath()); } private void updateRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException { - if (useLocalMirrors) { - if (isClonedFromLocalMirror(settings, workingDir)) { - logger.message("Repository in working directory found, start pulling changes"); - new PullCommand(settings, workingDir).execute(); - logger.message("Changes successfully pulled"); - } else { - logger.message("Repository in working directory is cloned from remote repository, clone it from local mirror"); - FileUtil.delete(workingDir); - cloneFromLocalMirror(settings, workingDir); - } + if (!Settings.isValidRepository(workingDir)) { + initRepository(workingDir, settings, logger, useLocalMirrors); } else { - if (isClonedFromLocalMirror(settings, workingDir)) { - logger.message("Repository in working directory is cloned from local mirror, clone it from remote repository"); - FileUtil.delete(workingDir); - cloneFromRemote(settings, workingDir); - } else { - logger.message("Repository in working directory found, start pulling changes"); - new PullCommand(settings, workingDir).execute(); - logger.message("Changes successfully pulled"); - } + ensureUseRightRepository(workingDir, settings, logger, useLocalMirrors); + } + logger.message("Start pulling changes"); + new PullCommand(settings, workingDir).execute(); + logger.message("Changes successfully pulled"); + } + + private void ensureUseRightRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException { + boolean clonedFromWrongRepository = useLocalMirrors && !isClonedFromLocalMirror(settings, workingDir) + || !useLocalMirrors && isClonedFromLocalMirror(settings, workingDir); + + if (clonedFromWrongRepository) { + String rightRepository = useLocalMirrors ? "local mirror" : "remote repository"; + String wrongRepository = useLocalMirrors ? "remote repository" : "local mirror"; + logger.message("Repository in working directory is cloned from " + wrongRepository + ", clone it from " + rightRepository); + FileUtil.delete(workingDir); + initRepository(workingDir, settings, logger, useLocalMirrors); } } private void updateLocalMirror(VcsRoot root, BuildProgressLogger logger) throws VcsException { Settings settings = new Settings(root); File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl()); - if (Settings.isValidRepository(mirrorDir)) { - logger.message("Start pulling changes to local mirror at " + mirrorDir); - new PullCommand(settings, mirrorDir).execute(); - logger.message("Local mirror changes successfully pulled"); - } else { - logger.message("No local mirror found for " + settings.getRepositoryUrl() + ", create mirror at " + mirrorDir.getAbsolutePath()); - logger.message("Clone local mirror at " + mirrorDir); - cloneRepository(settings, mirrorDir, settings.getRepositoryUrl()); - logger.message("Local mirror successfully cloned to " + mirrorDir); + if (!Settings.isValidRepository(mirrorDir)) { + initRepository(mirrorDir, settings, logger, false); } + logger.message("Start pulling changes to local mirror at " + mirrorDir); + new PullCommand(settings, mirrorDir).execute(); + logger.message("Local mirror changes successfully pulled"); } private void updateWorkingDir(final Settings settings, File workingDir, final String version, final BuildProgressLogger logger) throws VcsException { @@ -137,30 +131,15 @@ logger.message("Working directory updated successfully"); } - private void cloneFromLocalMirror(final Settings settings, File workingDir) throws VcsException { - File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl()); - try { - cloneRepository(settings, workingDir, mirrorDir.getCanonicalPath()); - } catch (Exception e) { - throw new VcsException("Failed to clone from local mirror at " + mirrorDir.getAbsolutePath(), e); + private String getDefaultPullUrl(Settings settings, boolean useLocalMirror) throws IOException { + if (useLocalMirror) { + File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl()); + return mirrorDir.getCanonicalPath(); + } else { + return settings.getRepositoryUrl(); } } - private void cloneFromRemote(final Settings settings, File workingDir) throws VcsException { - try { - cloneRepository(settings, workingDir, settings.getRepositoryUrl()); - } catch (Exception e) { - throw new VcsException("Failed to clone from remote repository " + settings.getRepositoryUrl(), e); - } - } - - private void cloneRepository(final Settings settings, File workingDir, String url) throws VcsException { - CloneCommand cc = new CloneCommand(settings, workingDir); - cc.setRepository(url); - cc.setUpdateWorkingDir(false); - cc.execute(); - } - private void checkRuleIsValid(IncludeRule includeRule) throws VcsException { if (includeRule.getTo() != null && includeRule.getTo().length() > 0) { if (!".".equals(includeRule.getFrom()) && includeRule.getFrom().length() != 0) {
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Init.java Thu Mar 31 09:47:49 2011 +0400 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Init.java Mon Apr 04 18:01:45 2011 +0400 @@ -11,8 +11,12 @@ * @author dmitry.neverov */ public class Init extends BaseCommand { - public Init(@NotNull final Settings settings, @NotNull File workingDir) { + + private final String myDefaultPullUrl; + + public Init(@NotNull final Settings settings, @NotNull File workingDir, @NotNull String defaultPullUrl) { super(settings, workingDir); + myDefaultPullUrl = defaultPullUrl; } public void execute() throws VcsException { @@ -26,8 +30,7 @@ private void writeDefaultPath() { File hgrc = new File(new File(getWorkDirectory(), ".hg"), "hgrc"); - String repository = getSettings().getRepository(); - String content = "[paths]\ndefault = " + repository; + String content = "[paths]\ndefault = " + myDefaultPullUrl; FileUtil.writeFile(hgrc, content); } }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java Thu Mar 31 09:47:49 2011 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java Mon Apr 04 18:01:45 2011 +0400 @@ -145,7 +145,10 @@ VcsRoot root = createVcsRoot(simpleRepo()); doUpdate(root, "3:9522278aa38d", new IncludeRule(".", ".", null)); mirrors = FileUtil.getSubDirectories(myMirrorsRootDir); - assertTrue(mirrors.isEmpty()); + //though some dirs are created - they are empty => there were no clones into local mirrors + for (File mirror : mirrors) { + assertTrue(FileUtil.getSubDirectories(mirror).isEmpty()); + } } public void local_mirror_is_created() throws IOException, VcsException {