Patchwork [2,of,2] rebase: allow rebasing children of wd to wd if a new branch has been set

login
register
mail settings
Submitter Mads Kiilerich
Date March 12, 2017, 11:44 p.m.
Message ID <e3ac848788e45a0530ab.1489362246@localhost.localdomain>
Download mbox | patch
Permalink /patch/19260/
State Accepted
Headers show

Comments

Mads Kiilerich - March 12, 2017, 11:44 p.m.
# HG changeset patch
# User Mads Kiilerich <mads@kiilerich.com>
# Date 1489362241 25200
#      Sun Mar 12 16:44:01 2017 -0700
# Node ID e3ac848788e45a0530abfa8705740824db6f3444
# Parent  42083ac9c3ed1b3be205e0f3a621787071587ae5
rebase: allow rebasing children of wd to wd if a new branch has been set

The named branch of the leaf changeset can be changed by updating to it,
setting the branch, and amending.

But previously, there was no good way to *just* change the branch of several
linear changes. If rebasing changes with another parent to '.', it would pick
up a pending branch change up. But when rebasing changes that have the same
parent, it would fail with 'nothing to rebase', even when the branch name was
set differently.

To fix this, allow rebasing to same parent when a branch has been set.
Augie Fackler - March 13, 2017, 12:14 a.m.
On Sun, Mar 12, 2017 at 04:44:06PM -0700, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <mads@kiilerich.com>
> # Date 1489362241 25200
> #      Sun Mar 12 16:44:01 2017 -0700
> # Node ID e3ac848788e45a0530abfa8705740824db6f3444
> # Parent  42083ac9c3ed1b3be205e0f3a621787071587ae5
> rebase: allow rebasing children of wd to wd if a new branch has been set

Queued, but added a (bc) on this one. Thanks!

>
> The named branch of the leaf changeset can be changed by updating to it,
> setting the branch, and amending.
>
> But previously, there was no good way to *just* change the branch of several
> linear changes. If rebasing changes with another parent to '.', it would pick
> up a pending branch change up. But when rebasing changes that have the same
> parent, it would fail with 'nothing to rebase', even when the branch name was
> set differently.
>
> To fix this, allow rebasing to same parent when a branch has been set.
>
> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -1224,7 +1224,12 @@ def buildstate(repo, dest, rebaseset, co
>          if commonbase == root:
>              raise error.Abort(_('source is ancestor of destination'))
>          if commonbase == dest:
> -            samebranch = root.branch() == dest.branch()
> +            wctx = repo[None]
> +            if dest == wctx.p1():
> +                # when rebasing to '.', it will use the current wd branch name
> +                samebranch = root.branch() == wctx.branch()
> +            else:
> +                samebranch = root.branch() == dest.branch()
>              if not collapse and samebranch and root in dest.children():
>                  repo.ui.debug('source is a child of destination\n')
>                  return None
> diff --git a/tests/test-rebase-named-branches.t b/tests/test-rebase-named-branches.t
> --- a/tests/test-rebase-named-branches.t
> +++ b/tests/test-rebase-named-branches.t
> @@ -387,4 +387,23 @@ rebase 'c1' to the branch head 'c2' that
>    o  0: '0'
>
>
> +  $ hg up -cr 1
> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg branch x
> +  marked working directory as branch x
> +  $ hg rebase -r 3:: -d .
> +  rebasing 3:76abc1c6f8c7 "b1"
> +  rebasing 4:8427af5d86f2 "c2 closed" (tip)
> +  note: rebase of 4:8427af5d86f2 created no changes to commit
> +  saved backup bundle to $TESTTMP/case2/.hg/strip-backup/76abc1c6f8c7-cd698d13-backup.hg (glob)
> +  $ hg tglog
> +  o  3: 'b1' x
> +  |
> +  | o  2: 'c1' c
> +  | |
> +  @ |  1: 'b2' b
> +  |/
> +  o  0: '0'
> +
> +
>    $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -1224,7 +1224,12 @@  def buildstate(repo, dest, rebaseset, co
         if commonbase == root:
             raise error.Abort(_('source is ancestor of destination'))
         if commonbase == dest:
-            samebranch = root.branch() == dest.branch()
+            wctx = repo[None]
+            if dest == wctx.p1():
+                # when rebasing to '.', it will use the current wd branch name
+                samebranch = root.branch() == wctx.branch()
+            else:
+                samebranch = root.branch() == dest.branch()
             if not collapse and samebranch and root in dest.children():
                 repo.ui.debug('source is a child of destination\n')
                 return None
diff --git a/tests/test-rebase-named-branches.t b/tests/test-rebase-named-branches.t
--- a/tests/test-rebase-named-branches.t
+++ b/tests/test-rebase-named-branches.t
@@ -387,4 +387,23 @@  rebase 'c1' to the branch head 'c2' that
   o  0: '0'
   
 
+  $ hg up -cr 1
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg branch x
+  marked working directory as branch x
+  $ hg rebase -r 3:: -d .
+  rebasing 3:76abc1c6f8c7 "b1"
+  rebasing 4:8427af5d86f2 "c2 closed" (tip)
+  note: rebase of 4:8427af5d86f2 created no changes to commit
+  saved backup bundle to $TESTTMP/case2/.hg/strip-backup/76abc1c6f8c7-cd698d13-backup.hg (glob)
+  $ hg tglog
+  o  3: 'b1' x
+  |
+  | o  2: 'c1' c
+  | |
+  @ |  1: 'b2' b
+  |/
+  o  0: '0'
+  
+
   $ cd ..