changeset 225:1ef1baff91af

TW-15861: do pull in getContent() only if local repository does not contain revision of interest
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Wed, 06 Apr 2011 11:46:39 +0400
parents 65dc850d16af
children 2b2dab847ac8
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java
diffstat 1 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Apr 06 11:40:22 2011 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Apr 06 11:46:39 2011 +0400
@@ -140,11 +140,12 @@
 
   @NotNull
   public byte[] getContent(@NotNull final String filePath, @NotNull final VcsRoot vcsRoot, @NotNull final String version) throws VcsException {
-    syncClonedRepository(vcsRoot);
+    ChangeSet cset = new ChangeSet(version);
+    syncClonedRepository(vcsRoot, cset);
     Settings settings = createSettings(vcsRoot);
     File workingDir = getWorkingDir(settings);
     CatCommand cc = new CatCommand(settings, workingDir);
-    cc.setRevId(new ChangeSet(version).getId());
+    cc.setRevId(cset.getId());
     File parentDir = cc.execute(Collections.singletonList(filePath));
     try {
       File file = new File(parentDir, filePath);
@@ -383,6 +384,29 @@
     }
   }
 
+  /**
+   * clone the repo if it doesn't exist, pull the repo if it doesn't contain specified changeSet
+   */
+  private void syncClonedRepository(final VcsRoot root, final ChangeSet cset) throws VcsException {
+    Settings settings = createSettings(root);
+    File workingDir = getWorkingDir(settings);
+    lockWorkDir(workingDir);
+    try {
+      if (Settings.isValidRepository(workingDir)) {
+        if (!isChangeSetExist(settings, workingDir, cset)) {
+          PullCommand pull = new PullCommand(settings, workingDir);
+          pull.execute();
+        }
+      } else {
+        CloneCommand cl = new CloneCommand(settings, workingDir);
+        cl.setUpdateWorkingDir(false);
+        cl.execute();
+      }
+    } finally {
+      unlockWorkDir(workingDir);
+    }
+  }
+
   // updates current working copy of repository by pulling changes from the repository specified in VCS root
   private void syncClonedRepository(final VcsRoot root) throws VcsException {
     Settings settings = createSettings(root);
@@ -402,6 +426,24 @@
     }
   }
 
+  /**
+   * Check if changeSet is present in local repository.
+   * @param settings root settings
+   * @param cset change set of interest
+   * @return true if changeSet is present in local repository
+   */
+  private boolean isChangeSetExist(Settings settings, File workDir, ChangeSet cset) {
+    try {
+      IdentifyCommand identify = new IdentifyCommand(settings, workDir);
+      identify.setInLocalRepository(true);
+      identify.setChangeSet(cset);
+      identify.execute();
+      return true;
+    } catch (VcsException e) {
+      return false;
+    }
+  }
+
   @Override
   public LabelingSupport getLabelingSupport() {
     return this;