changeset 218:ae0d53fe26f2 Eluru-6.0.x

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:23:28 +0400
parents e07386542f69
children 5c1585e791c9
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java
diffstat 1 files changed, 47 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Apr 06 11:01:28 2011 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Apr 06 11:23:28 2011 +0400
@@ -138,10 +138,11 @@
 
   @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);
     CatCommand cc = new CatCommand(settings);
-    cc.setRevId(new ChangeSet(version).getId());
+    cc.setRevId(cset.getId());
     File parentDir = cc.execute(Collections.singletonList(filePath));
     try {
       File file = new File(parentDir, filePath);
@@ -381,6 +382,50 @@
     }
   }
 
+  /**
+   * 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 workDir = settings.getLocalRepositoryDir();
+    lockWorkDir(workDir);
+    try {
+      if (settings.hasCopyOfRepository()) {
+        if (!isChangeSetExist(settings, cset)) {
+          PullCommand pull = new PullCommand(settings);
+          pull.execute();
+        }
+      } else {
+        CloneCommand cl = new CloneCommand(settings);
+        cl.setDestDir(workDir.getAbsolutePath());
+        cl.setUpdateWorkingDir(false);
+        cl.execute();
+      }
+    } finally {
+      unlockWorkDir(workDir);
+    }
+  }
+
+  /**
+   * 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, final ChangeSet cset) {
+    try {
+      File workDir = settings.getLocalRepositoryDir();
+      IdentifyCommand identify = new IdentifyCommand(settings);
+      identify.setWorkingDir(workDir);
+      identify.setInLocalRepository(true);
+      identify.setChangeSet(cset);
+      identify.execute();
+      return true;
+    } catch (VcsException e) {
+      return false;
+    }
+  }
+
   // 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);