[PATCH] rebase: --abort doesn't strip away the target changeset (issue2220)

Stefano Tortarolo stefano.tortarolo at gmail.com
Tue Jun 8 11:18:46 CDT 2010


# HG changeset patch
# User Stefano Tortarolo <stefano.tortarolo at gmail.com>
# Date 1276012867 -7200
# Node ID fffc9a60ba9607fda2ae316e80bfbc275decc62e
# Parent  7f72031d4047624271cd90d1396a0bf2709c29e9
rebase: --abort doesn't strip away the target changeset (issue2220)

When a changeset is skipped, rebase keeps the previous target as next
target and if the skipped cset is the first one, the recorded target is
actually the original target.
--abort did not detect this situation but simply stripped away the cset.

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -427,7 +427,7 @@
     else:
         # Strip from the first rebased revision
         merge.update(repo, repo[originalwd].rev(), False, True, False)
-        rebased = filter(lambda x: x > -1, state.values())
+        rebased = filter(lambda x: x > -1 and x != target, state.values())
         if rebased:
             strippoint = min(rebased)
             # no backup of rebased cset versions needed
diff --git a/tests/test-rebase-abort b/tests/test-rebase-abort
--- a/tests/test-rebase-abort
+++ b/tests/test-rebase-abort
@@ -6,35 +6,71 @@
 echo "graphlog=" >> $HGRCPATH
 echo "rebase=" >> $HGRCPATH
 
-hg init a
-cd a
-echo 'c1' >common
-hg add common
-hg commit -d '0 0' -m "C1"
+createrepo() {
+    rm -rf repo
+    hg init repo
+    cd repo
+    echo 'c1' >common
+    hg add common
+    hg commit -d '0 0' -m "C1"
 
-echo 'c2' >>common
-hg commit -d '1 0' -m "C2"
+    echo 'c2' >>common
+    hg commit -d '1 0' -m "C2"
 
-echo 'c3' >>common
-hg commit -d '2 0' -m "C3"
+    echo 'c3' >>common
+    hg commit -d '2 0' -m "C3"
 
-hg update -C 1
-echo 'l1' >>extra
-hg add extra
-hg commit -d '3 0' -m "L1"
+    hg update -C 1
+    echo 'l1' >>extra
+    hg add extra
+    hg commit -d '3 0' -m "L1"
 
-sed -e 's/c2/l2/' common > common.new
-mv common.new common
-hg commit -d '4 0' -m "L2"
+    sed -e 's/c2/l2/' common > common.new
+    mv common.new common
+    hg commit -d '4 0' -m "L2"
+}
 
-hg glog  --template '{rev}: {desc}\n'
+echo
+createrepo > /dev/null 2>&1
+hg --config extensions.hgext.graphlog= glog --template '{rev}: {desc}\n'
 
 echo
 echo '% Conflicting rebase'
-hg rebase -s 3 -d 2 | cleanrebase
+hg --config extensions.hgext.rebase= rebase -s 3 -d 2 | cleanrebase
 
 echo
 echo '% Abort'
-hg rebase --abort | cleanrebase
+hg --config extensions.hgext.rebase= rebase --abort | cleanrebase
 
-hg glog  --template '{rev}: {desc}\n'
+hg --config extensions.hgext.graphlog= glog  --template '{rev}: {desc}\n'
+
+createrepo() {
+    rm -rf repo
+    hg init repo
+    cd repo
+    echo "a">a
+    hg ci -A -m'A'
+    echo "b">b
+    hg ci -A -m'B'
+    echo "c">c
+    hg ci -A -m'C'
+    hg up 0
+    echo "b">b
+    hg ci -A -m'B bis'
+    echo "c1">c
+    hg ci -A -m'C1'
+}
+echo
+echo '% Rebase and abort without generating new changesets'
+
+echo
+createrepo > /dev/null 2>&1
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{desc|short}\n'
+
+hg --config extensions.hgext.rebase= rebase -b 4 -d 2 | cleanrebase
+
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{desc|short}\n'
+
+hg rebase -a | cleanrebase
+hg glog --template '{rev}:{desc|short}\n'
+
diff --git a/tests/test-rebase-abort.out b/tests/test-rebase-abort.out
--- a/tests/test-rebase-abort.out
+++ b/tests/test-rebase-abort.out
@@ -1,5 +1,4 @@
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-created new head
+
 @  4: L2
 |
 o  3: L1
@@ -30,3 +29,41 @@
 |
 o  0: C1
 
+
+% Rebase and abort without generating new changesets
+
+@  4:C1
+|
+o  3:B bis
+|
+| o  2:C
+| |
+| o  1:B
+|/
+o  0:A
+
+warning: conflicts during merge.
+merging c failed!
+abort: fix unresolved conflicts with hg resolve then run hg rebase --continue
+merging c
+@  4:C1
+|
+o  3:B bis
+|
+| @  2:C
+| |
+| o  1:B
+|/
+o  0:A
+
+rebase aborted
+@  4:C1
+|
+o  3:B bis
+|
+| o  2:C
+| |
+| o  1:B
+|/
+o  0:A
+


More information about the Mercurial-devel mailing list