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 {