[PATCH 1 of 1] subrepo: fix multiple merges with subrepos (issue 1986)

Steve Losh steve at stevelosh.com
Thu Jan 14 18:43:16 CST 2010


# HG changeset patch
# User Benoit Boissinot <benoit.boissinot at ens-lyon.org>
# Date 1263516152 18000
# Node ID 0fa750e8da72b37aaa1942bfb6269df3eac3df0f
# Parent  4441e8d7f04f1784dd2bdadddff43ba45dec60bd
subrepo: fix multiple merges with subrepos (issue 1986)

This fixes a bug seen when merging a main repo which contains a subrepo when
both repos have been merged before. It's in the BTS as issue 1986.

Each repo (main and sub) has two branches, both of which have been merged
before. When trying to merge the main repo branches a second time, the merge
fails with "abort: can't merge with ancestor" when trying to merge the
subrepo, even though the subrepo should not need to be merged at all.

diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -231,9 +231,12 @@
         self._get(state)
         cur = self._repo['.']
         dst = self._repo[state[1]]
-        if dst.ancestor(cur) == cur:
+        anc = dst.ancestor(cur)
+        if anc == cur:
             self._repo.ui.debug("updating subrepo %s\n" % self._path)
             hg.update(self._repo, state[1])
+        elif anc == dst:
+            self._repo.ui.debug("skipping subrepo %s\n" % self._path)
         else:
             self._repo.ui.debug("merging subrepo %s\n" % self._path)
             hg.merge(self._repo, state[1], remind=False)
diff --git a/tests/test-subrepo b/tests/test-subrepo
--- a/tests/test-subrepo
+++ b/tests/test-subrepo
@@ -109,4 +109,56 @@
 echo 'bogus=[boguspath' >> .hgsub
 hg ci -m 'bogus subrepo path'
 
+# issue 1986
+cd ..
+rm -rf sub
+hg init main
+cd main
+
+hg init s           # subrepo layout
+cd s                #
+echo a > a          #   o   5 br
+hg ci -Am1          #  /|
+hg branch br        # o |   4 default
+echo a >> a         # | |
+hg ci -m1           # | o   3 br
+hg up default       # |/|
+echo b > b          # o |   2 default
+hg ci -Am1          # | |
+hg up br            # | o   1 br
+hg merge tip        # |/
+hg ci -m1           # o     0 default
+hg up 2
+echo c > c
+hg ci -Am1
+hg up 3
+hg merge 4
+hg ci -m1
+
+cd ..                         # main repo layout:
+echo 's = s' > .hgsub         #
+hg -R s up 2                  #   * <-- try to merge default into br again
+hg ci -Am1                    # .`|
+hg branch br                  # . o   5 br      --> substate = 5
+echo b > b                    # . |
+hg -R s up 3                  # o |   4 default --> substate = 4
+hg ci -Am1                    # | |
+hg up default                 # | o   3 br      --> substate = 2
+echo c > c                    # |/|
+hg ci -Am1                    # o |   2 default --> substate = 2
+hg up 1                       # | |     
+hg merge 2                    # | o   1 br      --> substate = 3
+hg ci -m1                     # |/    
+hg up 2                       # o     0 default --> substate = 2
+hg -R s up 4
+echo d > d
+hg ci -Am1
+hg up 3
+hg -R s up 5
+echo e > e
+hg ci -Am1
+
+hg up 5
+hg merge 4    # try to merge default into br again
+
 exit 0
diff --git a/tests/test-subrepo.out b/tests/test-subrepo.out
--- a/tests/test-subrepo.out
+++ b/tests/test-subrepo.out
@@ -203,3 +203,42 @@
 blah
 % bogus subrepo path aborts
 abort: missing ] in subrepo source
+adding a
+marked working directory as branch br
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding b
+created new head
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding c
+created new head
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding .hgsub
+committing subrepository s
+marked working directory as branch br
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding b
+committing subrepository s
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding c
+created new head
+2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding d
+committing subrepository s
+created new head
+2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding e
+committing subrepository s
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)


More information about the Mercurial-devel mailing list