Mercurial > hg > mercurial
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")); + } }