Patchwork [v4] rebase: rebase changesets in topo order (issue5370) (BC)

login
register
mail settings
Submitter Xidorn Quan
Date Sept. 23, 2016, 11:17 p.m.
Message ID <2aaff71d4ea74c38a239.1474672650@upsuper-mbp2.local>
Download mbox | patch
Permalink /patch/16775/
State Accepted
Headers show

Comments

Xidorn Quan - Sept. 23, 2016, 11:17 p.m.
# HG changeset patch
# User Xidorn Quan <me@upsuper.org>
# Date 1474095776 -36000
#      Sat Sep 17 17:02:56 2016 +1000
# Node ID 2aaff71d4ea74c38a2397033654ebb3567957ae2
# Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
rebase: rebase changesets in topo order (issue5370) (BC)

There are two reasons that rebase should be done this way:
1. This would make rebasing faster because it would minimize the total
   number of files to be checked out in the process, as it don't need
   to switch back and forth between branches.
2. It makes resolving conflicts easier as user has a better context.

This commit changes the behavior in "Test multiple root handling" of
test-rebase-obsolete.t. It is an expected change which reflects the new
behavior that commits in a branch are grouped together when rebased.
Pierre-Yves David - Sept. 24, 2016, 1:01 a.m.
On 09/24/2016 01:17 AM, Xidorn Quan wrote:
> # HG changeset patch
> # User Xidorn Quan <me@upsuper.org>
> # Date 1474095776 -36000
> #      Sat Sep 17 17:02:56 2016 +1000
> # Node ID 2aaff71d4ea74c38a2397033654ebb3567957ae2
> # Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
> rebase: rebase changesets in topo order (issue5370) (BC)
>
> There are two reasons that rebase should be done this way:
> 1. This would make rebasing faster because it would minimize the total
>    number of files to be checked out in the process, as it don't need
>    to switch back and forth between branches.
> 2. It makes resolving conflicts easier as user has a better context.
>
> This commit changes the behavior in "Test multiple root handling" of
> test-rebase-obsolete.t. It is an expected change which reflects the new
> behavior that commits in a branch are grouped together when rebased.

Pushed, thank you very much.

> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -330,17 +330,17 @@ class rebaseruntime(object):
>                                                                 inclusive=True)
>
>          # Keep track of the current bookmarks in order to reset them later
>          self.currentbookmarks = repo._bookmarks.copy()
>          self.activebookmark = self.activebookmark or repo._activebookmark
>          if self.activebookmark:
>              bookmarks.deactivate(repo)
>
> -        sortedrevs = sorted(self.state)
> +        sortedrevs = repo.revs('sort(%ld, -topo)', self.state)
>          cands = [k for k, v in self.state.iteritems() if v == revtodo]
>          total = len(cands)
>          pos = 0
>          for rev in sortedrevs:
>              ctx = repo[rev]
>              desc = '%d:%s "%s"' % (ctx.rev(), ctx,
>                                     ctx.description().split('\n', 1)[0])
>              names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
> diff --git a/tests/test-rebase-obsolete.t b/tests/test-rebase-obsolete.t
> --- a/tests/test-rebase-obsolete.t
> +++ b/tests/test-rebase-obsolete.t
> @@ -413,26 +413,26 @@ Test that rewriting leaving instability
>    o  0:cd010b8cd998 A
>
>
>
>  Test multiple root handling
>  ------------------------------------
>
>    $ hg rebase --dest 4 --rev '7+11+9'
> +  rebasing 9:cf44d2f5a9f4 "D"
>    rebasing 7:02de42196ebe "H"
> -  rebasing 9:cf44d2f5a9f4 "D"
>    not rebasing ignored 10:7c6027df6a99 "B"
>    rebasing 11:0d8f238b634c "C" (tip)
>    $ hg log -G
>    o  14:1e8370e38cca C
>    |
> -  | o  13:102b4c1d889b D
> -  | |
> -  @ |  12:bfe264faf697 H
> +  @  13:bfe264faf697 H
> +  |
> +  | o  12:102b4c1d889b D
>    |/
>    | o  10:7c6027df6a99 B
>    | |
>    | x  7:02de42196ebe H
>    | |
>    +---o  6:eea13746799a G
>    | |/
>    | o  5:24b6387c8c8c F
> diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
> --- a/tests/test-rebase-scenario-global.t
> +++ b/tests/test-rebase-scenario-global.t
> @@ -756,16 +756,79 @@ Test that rebase is not confused by $CWD
>    $ touch subfile
>    $ hg add subfile
>    $ hg commit -m 'second source with subdir'
>    $ hg rebase -b . -d 1 --traceback
>    rebasing 2:779a07b1b7a0 "first source commit"
>    rebasing 3:a7d6f3a00bf3 "second source with subdir" (tip)
>    saved backup bundle to $TESTTMP/cwd-vanish/.hg/strip-backup/779a07b1b7a0-853e0073-backup.hg (glob)
>
> +Test that rebase is done in topo order (issue5370)
> +
> +  $ cd ..
> +  $ hg init order
> +  $ cd order
> +  $ touch a && hg add a && hg ci -m A
> +  $ touch b && hg add b && hg ci -m B
> +  $ touch c && hg add c && hg ci -m C
> +  $ hg up 1
> +  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> +  $ touch d && hg add d && hg ci -m D
> +  created new head
> +  $ hg up 2
> +  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
> +  $ touch e && hg add e && hg ci -m E
> +  $ hg up 3
> +  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
> +  $ touch f && hg add f && hg ci -m F
> +  $ hg up 0
> +  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
> +  $ touch g && hg add g && hg ci -m G
> +  created new head
> +
> +  $ hg tglog
> +  @  6: 'G'
> +  |
> +  | o  5: 'F'
> +  | |
> +  | | o  4: 'E'
> +  | | |
> +  | o |  3: 'D'
> +  | | |
> +  | | o  2: 'C'
> +  | |/
> +  | o  1: 'B'
> +  |/
> +  o  0: 'A'
> +
> +
> +  $ hg rebase -s 1 -d 6
> +  rebasing 1:76035bbd54bd "B"
> +  rebasing 2:d84f5cfaaf14 "C"
> +  rebasing 4:82ae8dc7a9b7 "E"
> +  rebasing 3:ab709c9f7171 "D"
> +  rebasing 5:412b391de760 "F"
> +  saved backup bundle to $TESTTMP/cwd-vanish/order/.hg/strip-backup/76035bbd54bd-e341bc99-backup.hg (glob)
> +
> +  $ hg tglog
> +  o  6: 'F'
> +  |
> +  o  5: 'D'
> +  |
> +  | o  4: 'E'
> +  | |
> +  | o  3: 'C'
> +  |/
> +  o  2: 'B'
> +  |
> +  @  1: 'G'
> +  |
> +  o  0: 'A'
> +
> +
>  Test experimental revset
>  ========================
>
>    $ cd ..
>
>  Make the repo a bit more interresting
>
>    $ hg up 1
Xidorn Quan - Sept. 24, 2016, 1:03 a.m.
On Sat, Sep 24, 2016, at 11:01 AM, Pierre-Yves David wrote:
> On 09/24/2016 01:17 AM, Xidorn Quan wrote:
> > # HG changeset patch
> > # User Xidorn Quan <me@upsuper.org>
> > # Date 1474095776 -36000
> > #      Sat Sep 17 17:02:56 2016 +1000
> > # Node ID 2aaff71d4ea74c38a2397033654ebb3567957ae2
> > # Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
> > rebase: rebase changesets in topo order (issue5370) (BC)
> >
> > There are two reasons that rebase should be done this way:
> > 1. This would make rebasing faster because it would minimize the total
> >    number of files to be checked out in the process, as it don't need
> >    to switch back and forth between branches.
> > 2. It makes resolving conflicts easier as user has a better context.
> >
> > This commit changes the behavior in "Test multiple root handling" of
> > test-rebase-obsolete.t. It is an expected change which reflects the new
> > behavior that commits in a branch are grouped together when rebased.
> 
> Pushed, thank you very much.

Thanks for your review.

- Xidorn

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -330,17 +330,17 @@  class rebaseruntime(object):
                                                                inclusive=True)
 
         # Keep track of the current bookmarks in order to reset them later
         self.currentbookmarks = repo._bookmarks.copy()
         self.activebookmark = self.activebookmark or repo._activebookmark
         if self.activebookmark:
             bookmarks.deactivate(repo)
 
-        sortedrevs = sorted(self.state)
+        sortedrevs = repo.revs('sort(%ld, -topo)', self.state)
         cands = [k for k, v in self.state.iteritems() if v == revtodo]
         total = len(cands)
         pos = 0
         for rev in sortedrevs:
             ctx = repo[rev]
             desc = '%d:%s "%s"' % (ctx.rev(), ctx,
                                    ctx.description().split('\n', 1)[0])
             names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
diff --git a/tests/test-rebase-obsolete.t b/tests/test-rebase-obsolete.t
--- a/tests/test-rebase-obsolete.t
+++ b/tests/test-rebase-obsolete.t
@@ -413,26 +413,26 @@  Test that rewriting leaving instability 
   o  0:cd010b8cd998 A
   
 
 
 Test multiple root handling
 ------------------------------------
 
   $ hg rebase --dest 4 --rev '7+11+9'
+  rebasing 9:cf44d2f5a9f4 "D"
   rebasing 7:02de42196ebe "H"
-  rebasing 9:cf44d2f5a9f4 "D"
   not rebasing ignored 10:7c6027df6a99 "B"
   rebasing 11:0d8f238b634c "C" (tip)
   $ hg log -G
   o  14:1e8370e38cca C
   |
-  | o  13:102b4c1d889b D
-  | |
-  @ |  12:bfe264faf697 H
+  @  13:bfe264faf697 H
+  |
+  | o  12:102b4c1d889b D
   |/
   | o  10:7c6027df6a99 B
   | |
   | x  7:02de42196ebe H
   | |
   +---o  6:eea13746799a G
   | |/
   | o  5:24b6387c8c8c F
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -756,16 +756,79 @@  Test that rebase is not confused by $CWD
   $ touch subfile
   $ hg add subfile
   $ hg commit -m 'second source with subdir'
   $ hg rebase -b . -d 1 --traceback
   rebasing 2:779a07b1b7a0 "first source commit"
   rebasing 3:a7d6f3a00bf3 "second source with subdir" (tip)
   saved backup bundle to $TESTTMP/cwd-vanish/.hg/strip-backup/779a07b1b7a0-853e0073-backup.hg (glob)
 
+Test that rebase is done in topo order (issue5370)
+
+  $ cd ..
+  $ hg init order
+  $ cd order
+  $ touch a && hg add a && hg ci -m A
+  $ touch b && hg add b && hg ci -m B
+  $ touch c && hg add c && hg ci -m C
+  $ hg up 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ touch d && hg add d && hg ci -m D
+  created new head
+  $ hg up 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ touch e && hg add e && hg ci -m E
+  $ hg up 3
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ touch f && hg add f && hg ci -m F
+  $ hg up 0
+  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  $ touch g && hg add g && hg ci -m G
+  created new head
+
+  $ hg tglog
+  @  6: 'G'
+  |
+  | o  5: 'F'
+  | |
+  | | o  4: 'E'
+  | | |
+  | o |  3: 'D'
+  | | |
+  | | o  2: 'C'
+  | |/
+  | o  1: 'B'
+  |/
+  o  0: 'A'
+  
+
+  $ hg rebase -s 1 -d 6
+  rebasing 1:76035bbd54bd "B"
+  rebasing 2:d84f5cfaaf14 "C"
+  rebasing 4:82ae8dc7a9b7 "E"
+  rebasing 3:ab709c9f7171 "D"
+  rebasing 5:412b391de760 "F"
+  saved backup bundle to $TESTTMP/cwd-vanish/order/.hg/strip-backup/76035bbd54bd-e341bc99-backup.hg (glob)
+
+  $ hg tglog
+  o  6: 'F'
+  |
+  o  5: 'D'
+  |
+  | o  4: 'E'
+  | |
+  | o  3: 'C'
+  |/
+  o  2: 'B'
+  |
+  @  1: 'G'
+  |
+  o  0: 'A'
+  
+
 Test experimental revset
 ========================
 
   $ cd ..
 
 Make the repo a bit more interresting
 
   $ hg up 1