# HG changeset patch # User Dmitry Neverov # Date 1376907684 -14400 # Node ID f0dce200f02a0ee4a89ca0894914b7898b1f2c8f # Parent e89816840a2e619d6f444947a31c808605a7b7b4 Implement tryMerge diff -r e89816840a2e -r f0dce200f02a mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java --- 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 tryMerge(@NotNull VcsRoot root, @NotNull List 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 results = new HashMap(); + 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 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, diff -r e89816840a2e -r f0dce200f02a mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java --- 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()); }