changeset 635:f0dce200f02a

Implement tryMerge
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Mon, 19 Aug 2013 14:21:24 +0400
parents e89816840a2e
children 27933884b738
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java
diffstat 2 files changed, 43 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java	Wed Aug 14 19:59:35 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java	Mon Aug 19 14:21:24 2013 +0400
@@ -7,7 +7,9 @@
 import com.intellij.openapi.diagnostic.Logger;
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;
 
@@ -26,6 +28,46 @@
   }
 
   @NotNull
+  public Map<MergeTask, MergeResult> tryMerge(@NotNull VcsRoot root, @NotNull List<MergeTask> tasks, @NotNull MergeOptions options) throws VcsException {
+    File tmpDir = null;
+    try {
+      tmpDir = HgFileUtil.createTempDir();
+      HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
+      myVcs.syncRepository(hgRoot);//sync in caches
+
+      HgVcsRoot tmpRoot = hgRoot.withUrl(myVcs.getWorkingDir(hgRoot).getAbsolutePath());
+      tmpRoot.setCustomWorkingDir(tmpDir);
+      myVcs.syncRepository(tmpRoot);//sync tmp repo
+
+      hgRoot.setCustomWorkingDir(tmpDir);
+      HgRepo repo = myVcs.createRepo(hgRoot);
+      repo.setDefaultPath(hgRoot.getRepository());
+      Map<MergeTask, MergeResult> results = new HashMap<MergeTask, MergeResult>();
+      for (MergeTask task : tasks) {
+        MergeResult result = new MergeResult();
+        try {
+          repo.update().toRevision(task.getDestinationRevision()).call();
+          repo.merge().revision(task.getSourceRevision()).call();
+        } catch (MergeConflictException e) {
+          List<String> conflicts = repo.resolve().call();
+          result.setSuccess(false);
+          result.setConflicts(conflicts);
+        } catch (VcsException e) {
+          result.setSuccess(false);
+        }
+        results.put(task, result);
+      }
+      return results;
+    } catch (Exception e) {
+      if (e instanceof VcsException)
+        throw (VcsException) e;
+      throw new VcsException(e);
+    } finally {
+      deleteDir(tmpDir, LOG);
+    }
+  }
+
+  @NotNull
   public MergeResult merge(@NotNull VcsRoot root,
                            @NotNull String srcRevision,
                            @NotNull String dstBranch,
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Wed Aug 14 19:59:35 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon Aug 19 14:21:24 2013 +0400
@@ -575,7 +575,7 @@
     return label.replace(':', '_').replace('\r', '_').replace('\n', '_');
   }
 
-  File getWorkingDir(HgVcsRoot root) {
+  public File getWorkingDir(HgVcsRoot root) {
     File customDir = root.getCustomWorkingDir();
     return customDir != null ? customDir : myMirrorManager.getMirrorDir(root.getRepository());
   }