changeset 13158:9e7e24052745

merge: fast-forward merge with descendant issue2538 gives a case where a changeset is merged with its child (which is on another branch), and to my surprise the result is a real merge with two parents, not just a "fast forward" "merge" with only the child as parent. That is essentially the same as issue619. Is the existing behaviour as intended and correct? Or is the following fix correct? Some extra "created new head" pops up with this fix, but it seems to me like they could be considered correct. The old branch head has been superseeded by changes on the other branch, and when the changes on the other branch is merged back to the branch it will introduce a new head not directly related to the previous branch head. (I guess the intention with existing behaviour could be to ensure that the changesets on the branch are directly connected and that no new heads pops up on merges.)
author Mads Kiilerich <mads@kiilerich.com>
date Tue, 07 Dec 2010 03:29:21 +0100
parents 82f840109f76
children 3172da69ff37
files mercurial/merge.py tests/test-issue619.t tests/test-newbranch.t tests/test-push-warn.t
diffstat 4 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/merge.py	Wed Dec 08 22:14:18 2010 -0600
+++ b/mercurial/merge.py	Tue Dec 07 03:29:21 2010 +0100
@@ -524,7 +524,7 @@
         action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
 
         ### apply phase
-        if not branchmerge: # just jump to the new rev
+        if not branchmerge or fastforward: # just jump to the new rev
             fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
         if not partial:
             repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
@@ -533,7 +533,7 @@
 
         if not partial:
             repo.dirstate.setparents(fp1, fp2)
-            recordupdates(repo, action, branchmerge)
+            recordupdates(repo, action, branchmerge and not fastforward)
             if not branchmerge and not fastforward:
                 repo.dirstate.setbranch(p2.branch())
     finally:
--- a/tests/test-issue619.t	Wed Dec 08 22:14:18 2010 -0600
+++ b/tests/test-issue619.t	Tue Dec 07 03:29:21 2010 +0100
@@ -19,7 +19,12 @@
   $ hg merge b
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
+  $ hg branch
+  default
+  $ hg parent --template '{rev}:{node|short} {branches}: {desc}\n'
+  1:06c2121185be b: b
   $ hg ci -Ammerge
+  created new head
 
 Bogus fast-forward should fail:
 
--- a/tests/test-newbranch.t	Wed Dec 08 22:14:18 2010 -0600
+++ b/tests/test-newbranch.t	Tue Dec 07 03:29:21 2010 +0100
@@ -208,12 +208,11 @@
   $ hg branch
   foo
   $ hg commit -m'Merge ff into foo'
+  created new head
   $ hg parents
-  changeset:   6:917eb54e1b4b
+  changeset:   6:6af8030670c9
   branch:      foo
   tag:         tip
-  parent:      4:98d14f698afe
-  parent:      5:6683a60370cb
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     Merge ff into foo
--- a/tests/test-push-warn.t	Wed Dec 08 22:14:18 2010 -0600
+++ b/tests/test-push-warn.t	Tue Dec 07 03:29:21 2010 +0100
@@ -413,6 +413,7 @@
   (branch merge, don't forget to commit)
 
   $ hg -R k ci -m merge
+  created new head
 
   $ hg -R k push -r a j
   pushing to j