[PATCH] revert: add an experimental config to use inverted selection

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri May 29 17:30:23 CDT 2015



On 05/29/2015 01:17 PM, Laurent Charignon wrote:
> # HG changeset patch
> # User Laurent Charignon <lcharignon at fb.com>
> # Date 1432930312 25200
> #      Fri May 29 13:11:52 2015 -0700
> # Node ID 395b1b8d437d7c47a8a8435fa16f42edd4ccd83d
> # Parent  a4acf019dd5b72e91a1b1321d80d298033be8111
> revert: add an experimental config to use inverted selection
>
> We had a discussion on the list about the interactive ui for revert. This patch
> adds a flag to allow people to test the second alternative (referred to as
> proposition 2 on the mailing list). It effectively inverts the signs in the
> diff displayed to match the output of hg diff. A test is added to show an
> example.
>
> By setting the following flag in the config, one can try proposition 2:
> [experimental]
>   invertedinteractive=True
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -3138,10 +3138,21 @@
>           diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
>           diffopts.nodates = True
>           diffopts.git = True
> -        diff = patch.diff(repo, None, ctx.node(), m, opts=diffopts)
> +        reversehunks =  repo.ui.configbool('experimental',
> +                                           'invertedinteractive',
> +                                           False)
> +        if reversehunks:
> +            diff = patch.diff(repo, ctx.node(), None, m, opts=diffopts)
> +        else:
> +            diff = patch.diff(repo, None, ctx.node(), m, opts=diffopts)
>           originalchunks = patch.parsepatch(diff)
> +
>           try:
> +
>               chunks = recordfilter(repo.ui, originalchunks)
> +            if reversehunks:
> +                chunks = patch.reversehunks(chunks)
> +
>           except patch.PatchError, err:
>               raise util.Abort(_('error parsing patch: %s') % err)
>
> diff --git a/mercurial/patch.py b/mercurial/patch.py
> --- a/mercurial/patch.py
> +++ b/mercurial/patch.py
> @@ -1383,6 +1383,23 @@
>               return s
>       return s[:i]
>
> +def reversehunks(hunks):

I think we want:
- a docstring
- some doctests, the function job is a bit tricky but very friendly to 
doctest


> +    import crecord as crecordmod
> +    newhunks = []
> +    for c in hunks:
> +        if isinstance(c, crecordmod.uihunk):
> +            # curses hunks encapsulate the record hunk in _hunk
> +            c = c._hunk
> +        if isinstance(c, recordhunk):
> +            for j, line in enumerate(c.hunk):
> +                if line.startswith("-"):
> +                    c.hunk[j] = "+" + c.hunk[j][1:]
> +                elif line.startswith("+"):
> +                    c.hunk[j] = "-" + c.hunk[j][1:]
> +            c.added, c.removed = c.removed, c.added
> +        newhunks.append(c)
> +    return newhunks
> +

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list