changeset 646:60425d39da84

Report conflicts from subrepos
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Tue, 17 Sep 2013 20:13:35 +0400
parents 4cf1ab3cd162
children 7d0d70557b48
files mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MergeSupportSubreposTest.java
diffstat 3 files changed, 37 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java	Tue Sep 17 18:48:51 2013 +0400
+++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java	Tue Sep 17 20:13:35 2013 +0400
@@ -7,6 +7,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import static java.util.Collections.emptyList;
+
 public class ResolveCommand extends BaseCommand {
 
   public ResolveCommand(@NotNull CommandSettings commandSettings,
@@ -20,6 +22,8 @@
     cmd.addParameters("resolve", "--no-status", "--list");
     CommandResult result = runCommand(cmd);
     String stdout = result.getStdout();
+    if (stdout.length() == 0)
+      return emptyList();
     List<String> unresolvedFiles = new ArrayList<String>();
     for (String line: stdout.split("[\r\n]+")) {
       unresolvedFiles.add(line);
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java	Tue Sep 17 18:48:51 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java	Tue Sep 17 20:13:35 2013 +0400
@@ -8,6 +8,7 @@
 import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -50,9 +51,8 @@
                   .setRevision(task.getDestinationRevision()).checkout();
           repo.merge().revision(task.getSourceRevision()).call();
         } catch (MergeConflictException e) {
-          List<String> conflicts = repo.resolve().call();
           result.setSuccess(false);
-          result.setConflicts(conflicts);
+          result.setConflicts(detectConflicts(hgRoot, "", repo));
         } catch (MergeWithWorkingDirAncestor e) {
           //ignore
         } catch (VcsException e) {
@@ -92,11 +92,8 @@
       try {
         repo.merge().revision(srcRevision).call();
       } catch (MergeConflictException e) {
-        List<String> conflicts = repo.resolve().call();
         mergeResult.setSuccess(false);
-        for (String conflict : conflicts) {
-          mergeResult.addConflict(conflict);
-        }
+        mergeResult.setConflicts(detectConflicts(hgRoot, "", repo));
         return mergeResult;
       } catch (MergeWithWorkingDirAncestor e) {
         return mergeResult;
@@ -114,4 +111,24 @@
       deleteDir(tmpDir, LOG);
     }
   }
+
+
+  private List<String> detectConflicts(@NotNull HgVcsRoot root, @NotNull String prefix, @NotNull HgRepo repo) throws VcsException {
+    List<String> conflicts = new ArrayList<String>();
+    for (String conflict : repo.resolve().call()) {
+      conflicts.add(prefix + conflict);
+    }
+
+    List<String> parents = repo.parents().call();
+    if (parents.isEmpty())
+      return conflicts;
+
+    Map<String, SubRepo> subrepos = repo.getSubrepositories(parents.get(0));
+    for (SubRepo subrepo : subrepos.values()) {
+      HgVcsRoot subrepoRoot = root.withUrl(subrepo.url());
+      HgRepo hgSubrepo = myHgRepoFactory.createRepo(subrepoRoot, new File(repo.getWorkingDir(), subrepo.path()));
+      conflicts.addAll(detectConflicts(subrepoRoot, prefix + subrepo.path() + "/", hgSubrepo));
+    }
+    return conflicts;
+  }
 }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MergeSupportSubreposTest.java	Tue Sep 17 18:48:51 2013 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MergeSupportSubreposTest.java	Tue Sep 17 20:13:35 2013 +0400
@@ -13,6 +13,7 @@
 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.VcsRootBuilder.vcsRoot;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasItem;
+import static org.testng.AssertJUnit.assertFalse;
 
 @Test
 public class MergeSupportSubreposTest extends BaseMercurialTestCase {
@@ -55,4 +56,13 @@
     assertThat("Cannot find subrepo merge commit", ms, hasItem(modificationData().withDescription("merge into default")
             .withParentRevisions("675fa105b184", "1532dee5d922")));
   }
+
+
+  public void should_report_conflicts_from_subrepos() throws Exception {
+    VcsRoot root = vcsRoot().withUrl(mySubrepo1).withSubrepoChanges(true).build();
+    MergeResult result = myMergeSupport.merge(root, "3e43f76179ed", "default", "merge into default", new MergeOptions());
+    assertFalse(result.isSuccess());
+    assertThat("conflict from main repo is not reported", result.getConflicts(), hasItem("b/c"));
+    assertThat("conflict from subrepo is not reported", result.getConflicts(), hasItem("subrepo2/b/c"));
+  }
 }