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.)
--- 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