[PATCH 1 of 2] rebase: fix phases movement

alain.leufroy at logilab.fr alain.leufroy at logilab.fr
Wed Jan 18 04:00:00 CST 2012


# HG changeset patch
# User Alain  Leufroy <alain.leufroyATgmailMYDOTcom>
# Date 1326787934 -3600
# Node ID ad5d3de8e84f0f33c46f9b7794bc4eb0fe25e231
# Parent  476a981fdf341f5bedbd958ca6c8e930fe35b5f9
rebase: fix phases movement

Rebase now try to keep the phases of source changesets.

diff -r 476a981fdf34 -r ad5d3de8e84f hgext/rebase.py
--- a/hgext/rebase.py	Mon Jan 16 01:21:30 2012 -0600
+++ b/hgext/rebase.py	Tue Jan 17 09:12:14 2012 +0100
@@ -15,7 +15,7 @@
 '''
 
 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
-from mercurial import extensions, patch, scmutil
+from mercurial import extensions, patch, scmutil, phases
 from mercurial.commands import templateopts
 from mercurial.node import nullrev
 from mercurial.lock import release
@@ -372,6 +372,10 @@
         newrev = repo.commit(text=commitmsg, user=ctx.user(),
                              date=ctx.date(), extra=extra, editor=editor)
         repo.dirstate.setbranch(repo[newrev].branch())
+        targetphase = max(ctx.phase(), phases.draft)
+        # retractboundary doesn't overwrite upper phase inherited from parent
+        newnode = repo[newrev].node()
+        phases.retractboundary(repo, targetphase, [newnode])
         return newrev
     except util.Abort:
         # Invalidate the previous setparents
@@ -548,7 +552,12 @@
 
 def abort(repo, originalwd, target, state):
     'Restore the repository to its original state'
-    if set(repo.changelog.descendants(target)) - set(state.values()):
+    descendants = repo.changelog.descendants
+    if any(repo._phaserev[r] == phases.public for r in descendants(target)):
+        repo.ui.warn("warning: immutable rebased changeset detected, "
+                     "can't abort\n")
+        return -1
+    elif set(descendants(target)) - set(state.values()):
         repo.ui.warn(_("warning: new changesets detected on target branch, "
                                                     "can't abort\n"))
         return -1
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-abort.t
--- a/tests/test-rebase-abort.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-abort.t	Tue Jan 17 09:12:14 2012 +0100
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -35,16 +35,18 @@
   $ mv common.new common
   $ hg ci -m L2
 
+  $ hg phase --force --secret 2
+
   $ hg tglog
-  @  4: 'L2'
+  @  4:draft 'L2'
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
-  | o  2: 'C3'
+  | o  2:secret 'C3'
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 
 Conflicting rebase:
@@ -63,15 +65,15 @@
   rebase aborted
 
   $ hg tglog
-  @  4: 'L2'
+  @  4:draft 'L2'
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
-  | o  2: 'C3'
+  | o  2:secret 'C3'
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
   $ cd ..
 
@@ -104,18 +106,21 @@
   $ hg ci -Am C1
   adding c
 
+  $ hg phase --force --secret 1
+  $ hg phase --public 1
+
 Rebase and abort without generating new changesets:
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
   $ hg rebase -b 4 -d 2
   merging c
@@ -125,27 +130,27 @@
   [255]
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
-  | @  2: 'C'
+  | @  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
   $ hg rebase -a
   rebase aborted
 
   $ hg tglog
-  @  4: 'C1'
+  @  4:draft 'C1'
   |
-  o  3: 'B bis'
+  o  3:draft 'B bis'
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:public 'B'
   |/
-  o  0: 'A'
+  o  0:public 'A'
   
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-check-restore.t
--- a/tests/test-rebase-check-restore.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-check-restore.t	Tue Jan 17 09:12:14 2012 +0100
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -46,23 +46,24 @@
   $ cd ..
 
 
-Rebasing B onto E - check keep:
+Rebasing B onto E - check keep: and phases
 
   $ hg clone -q -u . a a1
   $ cd a1
+  $ hg phase --force --secret 2
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
-  | o  4: 'E'
+  | o  4:draft 'E'
   | |
-  | o  3: 'D'
+  | o  3:draft 'D'
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg rebase -s 1 -d 4 --keep
   merging A
@@ -79,21 +80,21 @@
   $ hg rebase --continue
 
   $ hg tglog
-  @  7: 'C'
+  @  7:secret 'C'
   |
-  o  6: 'B'
+  o  6:draft 'B'
   |
-  | o  5: 'F' notdefault
+  | o  5:draft 'F' notdefault
   | |
-  o |  4: 'E'
+  o |  4:draft 'E'
   | |
-  o |  3: 'D'
+  o |  3:draft 'D'
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ cd ..
 
@@ -102,19 +103,20 @@
 
   $ hg clone -q -u . a a2
   $ cd a2
+  $ hg phase --force --secret 2
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
-  | o  4: 'E'
+  | o  4:draft 'E'
   | |
-  | o  3: 'D'
+  | o  3:draft 'D'
   |/
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg rebase -s 5 -d 4 --keepbranches
   merging A
@@ -132,15 +134,15 @@
   saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
-  @  5: 'F' notdefault
+  @  5:draft 'F' notdefault
   |
-  o  4: 'E'
+  o  4:draft 'E'
   |
-  o  3: 'D'
+  o  3:draft 'D'
   |
-  | o  2: 'C'
+  | o  2:secret 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-collapse.t
--- a/tests/test-rebase-collapse.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-collapse.t	Tue Jan 17 09:12:14 2012 +0100
@@ -8,6 +8,7 @@
   > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 Create repo a:
@@ -43,28 +44,31 @@
   $ cd ..
 
 
-Rebasing B onto H:
+Rebasing B onto H and collapsing changesets with different phases:
+
 
   $ hg clone -q -u 3 a a1
   $ cd a1
 
+  $ hg phase --force --secret 3
+
   $ hg rebase --collapse --keepbranches
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  5: 'Collapsed revision
+  $ hg tglogp
+  @  5:secret 'Collapsed revision
   |  * B
   |  * C
   |  * D'
-  o  4: 'H'
+  o  4:draft 'H'
   |
-  | o  3: 'G'
+  | o  3:draft 'G'
   |/|
-  o |  2: 'F'
+  o |  2:draft 'F'
   | |
-  | o  1: 'E'
+  | o  1:draft 'E'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -82,6 +86,7 @@
   $ hg clone -q -u . a a2
   $ cd a2
 
+  $ hg phase --force --secret 6
   $ hg rebase --source 4 --collapse
   saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
 
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-conflicts.t
--- a/tests/test-rebase-conflicts.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-conflicts.t	Tue Jan 17 09:12:14 2012 +0100
@@ -7,7 +7,7 @@
   > publish=False
   > 
   > [alias]
-  > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
   $ hg init a
@@ -37,18 +37,20 @@
   $ hg add extra2
   $ hg ci -m L3
 
+  $ hg phase --force --secret 4
+
   $ hg tglog
-  @  5: 'L3'
+  @  5:secret 'L3'
   |
-  o  4: 'L2'
+  o  4:secret 'L2'
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
-  | o  2: 'C3'
+  | o  2:draft 'C3'
   |/
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 Try to call --continue:
 
@@ -79,17 +81,17 @@
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
-  @  5: 'L3'
+  @  5:secret 'L3'
   |
-  o  4: 'L2'
+  o  4:secret 'L2'
   |
-  o  3: 'L1'
+  o  3:draft 'L1'
   |
-  o  2: 'C3'
+  o  2:draft 'C3'
   |
-  o  1: 'C2'
+  o  1:draft 'C2'
   |
-  o  0: 'C1'
+  o  0:draft 'C1'
   
 Check correctness:
 
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-detach.t
--- a/tests/test-rebase-detach.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-detach.t	Tue Jan 17 09:12:14 2012 +0100
@@ -47,25 +47,26 @@
   |/
   o  0: 'A'
   
+  $ hg phase --force --secret 3
   $ hg rebase --detach -s 3 -d 7
   saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  7: 'D'
+  $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  7:secret 'D'
   |
-  o  6: 'H'
+  o  6:draft 'H'
   |
-  | o  5: 'G'
+  | o  5:draft 'G'
   |/|
-  o |  4: 'F'
+  o |  4:draft 'F'
   | |
-  | o  3: 'E'
+  | o  3:draft 'E'
   |/
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -185,6 +186,7 @@
 
   $ hg clone -q -u . a a4
   $ cd a4
+  $ hg phase --force --secret 3
 
   $ hg tglog
   @  7: 'H'
@@ -206,21 +208,21 @@
   $ hg rebase --detach --collapse -s 2 -d 7
   saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
 
-  $ hg tglog
-  @  6: 'Collapsed revision
+  $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  6:secret 'Collapsed revision
   |  * C
   |  * D'
-  o  5: 'H'
+  o  5:draft 'H'
   |
-  | o  4: 'G'
+  | o  4:draft 'G'
   |/|
-  o |  3: 'F'
+  o |  3:draft 'F'
   | |
-  | o  2: 'E'
+  | o  2:draft 'E'
   |/
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ hg manifest
   A
@@ -360,13 +362,14 @@
 
   $ cd ..
 
-Ensure --continue restores a correct state (issue3046):
+Ensure --continue restores a correct state (issue3046) and phase:
   $ hg clone -q a a7
   $ cd a7
   $ hg up -q 3
   $ echo 'H2' > H
   $ hg ci -A -m 'H2'
   adding H
+  $ hg phase --force --secret 8
   $ hg rebase -s 8 -d 7 --detach --config ui.merge=internal:fail
   merging H
   warning: conflicts during merge.
@@ -376,23 +379,23 @@
   $ hg resolve --all -t internal:local
   $ hg rebase -c
   saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
-  $ hg tglog
-  @  8: 'H2'
+  $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+  @  8:secret 'H2'
   |
-  o  7: 'H'
+  o  7:draft 'H'
   |
-  | o  6: 'G'
+  | o  6:draft 'G'
   |/|
-  o |  5: 'F'
+  o |  5:draft 'F'
   | |
-  | o  4: 'E'
+  | o  4:draft 'E'
   |/
-  | o  3: 'D'
+  | o  3:draft 'D'
   | |
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
 
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-interruptions.t
--- a/tests/test-rebase-interruptions.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-interruptions.t	Tue Jan 17 09:12:14 2012 +0100
@@ -8,6 +8,7 @@
   > 
   > [alias]
   > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+  > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   > EOF
 
 
@@ -71,20 +72,24 @@
   $ hg add Extra
   $ hg ci -m 'Extra'
 
-  $ hg tglog
-  @  6: 'Extra'
+Force this commit onto secret phase
+
+  $ hg phase --force --secret 6
+
+  $ hg tglogp
+  @  6:secret 'Extra'
   |
-  | o  5: 'B'
+  | o  5:draft 'B'
   | |
-  | o  4: 'E'
+  | o  4:draft 'E'
   | |
-  | o  3: 'D'
+  | o  3:draft 'D'
   | |
-  o |  2: 'C'
+  o |  2:draft 'C'
   | |
-  o |  1: 'B'
+  o |  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
 Resume the rebasing:
 
@@ -104,22 +109,22 @@
   $ hg rebase --continue
   warning: new changesets detected on source branch, not stripping
 
-  $ hg tglog
-  @  7: 'C'
+  $ hg tglogp
+  @  7:draft 'C'
   |
-  | o  6: 'Extra'
+  | o  6:secret 'Extra'
   | |
-  o |  5: 'B'
+  o |  5:draft 'B'
   | |
-  o |  4: 'E'
+  o |  4:draft 'E'
   | |
-  o |  3: 'D'
+  o |  3:draft 'D'
   | |
-  | o  2: 'C'
+  | o  2:draft 'C'
   | |
-  | o  1: 'B'
+  | o  1:draft 'B'
   |/
-  o  0: 'A'
+  o  0:draft 'A'
   
   $ cd ..
 
@@ -195,3 +200,68 @@
   
   $ cd ..
 
+Changes during an interruption - abort (again):
+
+  $ hg clone -q -u . a a3
+  $ cd a3
+
+  $ hg tglogp
+  @  4:draft 'E'
+  |
+  o  3:draft 'D'
+  |
+  | o  2:draft 'C'
+  | |
+  | o  1:draft 'B'
+  |/
+  o  0:draft 'A'
+  
+Rebasing B onto E:
+
+  $ hg rebase -s 1 -d 4
+  merging A
+  warning: conflicts during merge.
+  merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+  abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+  [255]
+
+Change phase on B and B'
+
+  $ hg up -q -C 5
+  $ hg phase --public 1
+  $ hg phase --public 5
+  $ hg phase --secret -f 2
+
+  $ hg tglogp
+  @  5:public 'B'
+  |
+  o  4:public 'E'
+  |
+  o  3:public 'D'
+  |
+  | o  2:secret 'C'
+  | |
+  | o  1:public 'B'
+  |/
+  o  0:public 'A'
+  
+Abort the rebasing:
+
+  $ hg rebase --abort
+  warning: immutable rebased changeset detected, can't abort
+  [255]
+
+  $ hg tglogp
+  @  5:public 'B'
+  |
+  o  4:public 'E'
+  |
+  o  3:public 'D'
+  |
+  | o  2:secret 'C'
+  | |
+  | o  1:public 'B'
+  |/
+  o  0:public 'A'
+  
+  $ cd ..
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-rebase-scenario-global.t
--- a/tests/test-rebase-scenario-global.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-rebase-scenario-global.t	Tue Jan 17 09:12:14 2012 +0100
@@ -282,6 +282,32 @@
   [255]
 
   $ hg rebase -d 5 -b 6 --keep
+
+Check rebasing mutable changeset
+Source phase greater or equal to destination phase: new changeset get the phase of source:
+  $ hg rebase -s9 -d0
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2b23e52411f4-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  draft
+  $ hg rebase -s9 -d1
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2cb10d0cfc6c-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  draft
+  $ hg phase --force --secret 9
+  $ hg rebase -s9 -d0
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c5b12b67163a-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+  $ hg rebase -s9 -d1
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2a0524f868ac-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+Source phase lower than destination phase: new changeset get the phase of destination:
+  $ hg rebase -s7 -d9
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c9659aac0000-backup.hg
+  $ hg log --template "{phase}\n" -r 9
+  secret
+
   $ cd ..
 
 Test for revset
diff -r 476a981fdf34 -r ad5d3de8e84f tests/test-transplant.t
--- a/tests/test-transplant.t	Mon Jan 16 01:21:30 2012 -0600
+++ b/tests/test-transplant.t	Tue Jan 17 09:12:14 2012 +0100
@@ -41,6 +41,8 @@
 
   $ hg up -C 1
   1 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  $ hg phase --force --secret b1
+  $ hg phase --public b1
 
 rebase b onto r1
 
@@ -51,15 +53,15 @@
   722f4667af76 transplanted to 539f377d78df
   applying a53251cdf717
   a53251cdf717 transplanted to ffd6818a3975
-  $ hg log --template '{rev} {parents} {desc}\n'
-  7  b3
-  6  b2
-  5 1:d11e3596cc1a  b1
-  4  b3
-  3  b2
-  2 0:17ab29e464c6  b1
-  1  r2
-  0  r1
+  $ hg log --template '{rev} {phase} {parents} {desc}\n'
+  7 draft  b3
+  6 draft  b2
+  5 draft 1:d11e3596cc1a  b1
+  4 secret  b3
+  3 secret  b2
+  2 public 0:17ab29e464c6  b1
+  1 draft  r2
+  0 public  r1
 
 test transplanted revset
 


More information about the Mercurial-devel mailing list