[PATCH] rebase: don't rebase obsolete commit whose successor is already rebased

Durham Goode durham at fb.com
Sat Sep 19 02:52:58 CDT 2015



On 9/17/15 6:40 PM, Laurent Charignon wrote:
> # HG changeset patch
> # User Laurent Charignon <lcharignon at fb.com>
> # Date 1442277108 25200
> #      Mon Sep 14 17:31:48 2015 -0700
> # Node ID 9edbea23f78b19fb5cbb5b8e00f9c3aa8ecde617
> # Parent  836291420d535cae069acb3b671b980ac97bcce4
> rebase: don't rebase obsolete commit whose successor is already rebased
>   +def _computeobsoletenotrebased(repo, rebasesetrevs, dest):
> +    """return a mapping obsolete => successor for all obsolete nodes to be
> +    rebased that have a successors in the destination"""
> +    obsoletenotrebased = {}
> +
> +    # Build a mapping succesor => obsolete nodes for the obsolete
> +    # nodes to be rebased
> +    allsuccessors = {}
> +    for r in rebasesetrevs:
> +        n = repo[r]
> +        if n.obsolete():
> +            node = repo.changelog.node(r)
> +            for s in obsolete.allsuccessors(repo.obsstore, [node]):
> +                allsuccessors[repo[s].rev()] = repo.changelog.rev(node)
Kind of odd to use different ways of getting the rev in the same line 
(repo[s].rev() vs repo.changelog.rev(node)).  I'd probably lean towards 
the changelog way, to avoid building contexts.
> +
> +    if allsuccessors:
> +        # Look for successors of obsolete nodes to be rebased among
> +        # the ancestors of dest
> +        ancs = repo.changelog.ancestors([repo[dest].rev()],
> +                                        stoprev=min(allsuccessors),
> +                                        inclusive=True)
> +        for s in ancs:
> +            if s in allsuccessors:
> +                obsoletenotrebased[allsuccessors[s]] = s
Can we reverse this loop so we loop over allsuccessors and test against 
ancs?  ancs may be huge so iteration will be expensive on large rebases, 
but it is a lazily set so testing against it will be optimally minimal.



More information about the Mercurial-devel mailing list