changeset 9815:49efeed49c94

rebase: make sure the newancestor is used during the whole update (issue1561) Before this change, newancestor was used only once as a replacement for ancestor.ancestor, but merge.update calls ancestor.ancestor several times, so it ends up with the "wrong" ancestor (the real ancestor, but we want the parent of the rebased changeset for all but the first rebased changeset). Added a new test case for this: test-rebase-newancestor. Also, in one scenario in test-rebase-collapse, there was a spurious conflict caused by the same issue, so that test case was fixed by removing the now unneeded conflict resolution and the output was adapted accordingly.
author Christian Boos <cboos@bct-technology.com>
date Mon, 09 Nov 2009 20:15:49 +0100
parents 5070e4d57276
children ea26ac58bbe3
files hgext/rebase.py tests/test-rebase-collapse tests/test-rebase-collapse.out tests/test-rebase-newancestor tests/test-rebase-newancestor.out
diffstat 5 files changed, 58 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/rebase.py	Fri Nov 06 10:06:08 2009 +0100
+++ b/hgext/rebase.py	Mon Nov 09 20:15:49 2009 +0100
@@ -27,17 +27,19 @@
     oldancestor = ancestor.ancestor
 
     def newancestor(a, b, pfunc):
-        ancestor.ancestor = oldancestor
         if b == rev:
             return repo[rev].parents()[0].rev()
-        return ancestor.ancestor(a, b, pfunc)
+        return oldancestor(a, b, pfunc)
 
     if not first:
         ancestor.ancestor = newancestor
     else:
         repo.ui.debug("first revision, do not change ancestor\n")
-    stats = merge.update(repo, rev, True, True, False)
-    return stats
+    try:
+        stats = merge.update(repo, rev, True, True, False)
+        return stats
+    finally:
+        ancestor.ancestor = oldancestor
 
 def rebase(ui, repo, **opts):
     """move changeset (and descendants) to a different branch
--- a/tests/test-rebase-collapse	Fri Nov 06 10:06:08 2009 +0100
+++ b/tests/test-rebase-collapse	Mon Nov 09 20:15:49 2009 +0100
@@ -130,12 +130,7 @@
 
 echo
 echo '% Rebase and collapse - E onto I'
-hg rebase -s 4 --collapse 
-
-echo '% Fix conflict and continue'
-echo 'Resolved merge' > E
-hg resolve -m E
-hg rebase -c 2>&1 | sed 's/\(saving bundle to \).*/\1/'
+hg rebase -s 4 --collapse 2>&1 | sed 's/\(saving bundle to \).*/\1/'
 
 hg glog  --template '{rev}: {desc}\n'
 
--- a/tests/test-rebase-collapse.out	Fri Nov 06 10:06:08 2009 +0100
+++ b/tests/test-rebase-collapse.out	Mon Nov 09 20:15:49 2009 +0100
@@ -145,10 +145,6 @@
 
 % Rebase and collapse - E onto I
 merging E
-warning: conflicts during merge.
-merging E failed!
-abort: fix unresolved conflicts with hg resolve then run hg rebase --continue
-% Fix conflict and continue
 saving bundle to 
 adding branch
 adding changesets
@@ -179,7 +175,7 @@
 G
 I
 Cat E:
-Resolved merge
+F
 
 @  5: F
 |
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebase-newancestor	Mon Nov 09 20:15:49 2009 +0100
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+echo "[extensions]" >> $HGRCPATH
+echo "graphlog=" >> $HGRCPATH
+echo "rebase=" >> $HGRCPATH
+
+rm -rf repo
+hg init repo
+cd repo
+
+echo A > a
+echo >> a
+hg commit -AmA -u test -d '0 0'
+
+echo B > a
+echo >> a
+hg commit -mB -u test -d '1 0'
+
+echo C > a
+echo >> a
+hg commit -mC -u test -d '2 0'
+
+hg up -C 0
+echo D >> a
+hg commit -AmAD -u test -d '3 0'
+
+hg glog --template '{rev}:{desc} {node|short}\n'
+hg rebase -q -s 1 -d 3 2>&1 | grep -v 'saving bundle'
+hg glog --template '{rev}:{desc} {node|short}\n'
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebase-newancestor.out	Mon Nov 09 20:15:49 2009 +0100
@@ -0,0 +1,19 @@
+adding a
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+created new head
+@  3:AD 1d4e82ed3c2a
+|
+| o  2:C 7e1afe9214b2
+| |
+| o  1:B 0a6620c3c26a
+|/
+o  0:A 1e635d440a73
+
+@  3:C 0c5887756284
+|
+o  2:B 4f208f4a1507
+|
+o  1:AD 1d4e82ed3c2a
+|
+o  0:A 1e635d440a73
+