# HG changeset patch # User Dmitry Neverov # Date 1379434415 -14400 # Node ID 60425d39da84a695c79cd34f3f646ecba36e55b1 # Parent 4cf1ab3cd1623c5c7eda27d3d8405ae637a728f5 Report conflicts from subrepos diff -r 4cf1ab3cd162 -r 60425d39da84 mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java --- 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 unresolvedFiles = new ArrayList(); for (String line: stdout.split("[\r\n]+")) { unresolvedFiles.add(line); diff -r 4cf1ab3cd162 -r 60425d39da84 mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialMergeSupport.java --- 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 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 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 detectConflicts(@NotNull HgVcsRoot root, @NotNull String prefix, @NotNull HgRepo repo) throws VcsException { + List conflicts = new ArrayList(); + for (String conflict : repo.resolve().call()) { + conflicts.add(prefix + conflict); + } + + List parents = repo.parents().call(); + if (parents.isEmpty()) + return conflicts; + + Map 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; + } } diff -r 4cf1ab3cd162 -r 60425d39da84 mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MergeSupportSubreposTest.java --- 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")); + } }