[PATCH] rebase: handle succesor targets (issue5198)

Pierre-Yves David pierre-yves.david at ens-lyon.org
Mon Apr 11 18:32:10 EDT 2016



On 04/11/2016 02:52 PM, timeless wrote:
> # HG changeset patch
> # User timeless <timeless at mozdev.org>
> # Date 1460410387 0
> #      Mon Apr 11 21:33:07 2016 +0000
> # Node ID eb7a0591138f0b30f445161b624293bbe605cb71
> # Parent  86db5cb55d46db3984e94600f3902f47a16437ae
> rebase: handle succesor targets (issue5198)

Can  you elaborate on what this issue is the chagneset description?

>
> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -386,7 +386,8 @@
>                   ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)),
>                               _('changesets'), total)
>                   p1, p2, base = defineparents(repo, rev, target, state,
> -                                             targetancestors)
> +                                             targetancestors,
> +                                             obsoletenotrebased)
>                   storestatus(repo, originalwd, target, state, collapsef, keepf,
>                               keepbranchesf, external, activebookmark)
>                   storecollapsemsg(repo, collapsemsg)
> @@ -451,7 +452,8 @@
>   
>           if collapsef and not keepopen:
>               p1, p2, _base = defineparents(repo, min(state), target,
> -                                          state, targetancestors)
> +                                          state, targetancestors,
> +                                          obsoletenotrebased)
>               editopt = opts.get('edit')
>               editform = 'rebase.collapse'
>               if collapsemsg:
> @@ -737,10 +739,12 @@
>                    'experimental.rebaseskipobsolete to False')
>           raise error.Abort(msg, hint=hint)
>   
> -def defineparents(repo, rev, target, state, targetancestors):
> +def defineparents(repo, rev, target, state, targetancestors,
> +                  obsoletenotrebased):
>       'Return the new parent relationship of the revision that will be rebased'
>       parents = repo[rev].parents()
>       p1 = p2 = nullrev
> +    rp1 = None
>   
>       p1n = parents[0].rev()
>       if p1n in targetancestors:
> @@ -764,6 +768,8 @@
>           if p2n in state:
>               if p1 == target: # p1n in targetancestors or external
>                   p1 = state[p2n]
> +                if p1 == revprecursor:
> +                    rp1 = obsoletenotrebased[p2n]
>               elif state[p2n] in revskipped:
>                   p2 = nearestrebased(repo, p2n, state)
>                   if p2 is None:
> @@ -777,7 +783,7 @@
>                           'would have 3 parents') % rev)
>               p2 = p2n
>       repo.ui.debug(" future parents are %d and %d\n" %
> -                            (repo[p1].rev(), repo[p2].rev()))
> +                            (repo[rp1 or p1].rev(), repo[p2].rev()))
>   
>       if not any(p.rev() in state for p in parents):
>           # Case (1) root changeset of a non-detaching rebase set.
> @@ -821,6 +827,8 @@
>           # make it feasible to consider different cases separately. In these
>           # other cases we currently just leave it to the user to correctly
>           # resolve an impossible merge using a wrong ancestor.
> +        #
> +        # xx, p1 could be -4, and both parents could probably be -4...
>           for p in repo[rev].parents():
>               if state.get(p.rev()) == p1:
>                   base = p.rev()
> @@ -831,7 +839,7 @@
>               # Raise because this function is called wrong (see issue 4106)
>               raise AssertionError('no base found to rebase on '
>                                    '(defineparents called wrong)')
> -    return p1, p2, base
> +    return rp1 or p1, p2, base
>   
>   def isagitpatch(repo, patchname):
>       'Return true if the given patch is in git format'
> 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
> @@ -863,3 +863,56 @@
>     rebasing 20:b82fb57ea638 "willconflict second version"
>     note: not rebasing 21:8b31da3c4919 "dummy change", already in destination as 19:601db7a18f51 "dummy change successor"
>     rebasing 22:7bdc8a87673d "dummy change" (tip)
> +  $ cd ..
> +
> +rebase source is obsoleted (issue5198)
> +---------------------------------
> +
> +  $ hg clone base amended
> +  updating to branch default
> +  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ cd amended
> +  $ hg up 9520eea781bc
> +  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
> +  $ echo 1 >> E
> +  $ hg commit --amend -m "E'"
> +  $ hg log -G
> +  @  9:69abe8906104 E'
> +  |
> +  | o  7:02de42196ebe H
> +  | |
> +  | | o  6:eea13746799a G
> +  | |/|
> +  | o |  5:24b6387c8c8c F
> +  |/ /
> +  | x  4:9520eea781bc E
> +  |/
> +  | o  3:32af7686d403 D
> +  | |
> +  | o  2:5fddd98957c8 C
> +  | |
> +  | o  1:42ccdea3bb16 B
> +  |/
> +  o  0:cd010b8cd998 A
> +
> +  $ hg rebase -d . -s 9520eea781bc
> +  note: not rebasing 4:9520eea781bc "E", already in destination as 9:69abe8906104 "E'"
> +  rebasing 6:eea13746799a "G"
> +  $ hg log -G
> +  o    10:17be06e82e95 G
> +  |\
> +  | @  9:69abe8906104 E'
> +  | |
> +  +---o  7:02de42196ebe H
> +  | |
> +  o |  5:24b6387c8c8c F
> +  |/
> +  | o  3:32af7686d403 D
> +  | |
> +  | o  2:5fddd98957c8 C
> +  | |
> +  | o  1:42ccdea3bb16 B
> +  |/
> +  o  0:cd010b8cd998 A
> +
> +  $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list