[Reviewers] [PATCH STABLE] log: fix order of revisions filtered by multiple OR options (issue5100)

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Feb 16 01:16:30 UTC 2016


[to reviewers]
I'm planning to have a look at that

On 02/15/2016 02:34 PM, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1455543967 -32400
> #      Mon Feb 15 22:46:07 2016 +0900
> # Branch stable
> # Node ID ae36fdcb20ae3b7b0d8b2e7f868a1c3eb104e34e
> # Parent  8da94662afe51a836eda500652097772c34002e8
> log: fix order of revisions filtered by multiple OR options (issue5100)
>
> This is the simplest workaround for the issue of the ordering of revset, which
> is that the expression "x or y" takes over the ordering specified by the input
> set (or the left-hand-side expression.) For example, the following expression
>
>    A & (x | y)
>
> will be evaluated as if
>
>    (A & x) | (A & y)
>
> It is wrong because revset has ordering. Ideally, we should fix the revset
> computation, but that would require a long patch series. So, for now, this
> patch just works around the common log cases.
>
> Since this change might have some impact on performance, it is enabled only
> if the expression seems to have ' or ' expression.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -2139,9 +2139,14 @@ def getlogrevs(repo, pats, opts):
>           # Revset matches can reorder revisions. "A or B" typically returns
>           # returns the revision matching A then the revision matching B. Sort
>           # again to fix that.
> +        oldrevs = revs
>           revs = matcher(repo, revs)
>           if not opts.get('rev'):
>               revs.sort(reverse=True)
> +        elif ' or ' in expr:
> +            # XXX "A or B" is known to change the order; fix it by filtering
> +            # matched set again (issue5100)
> +            revs = oldrevs & revs
>       if limit is not None:
>           limitedrevs = []
>           for idx, r in enumerate(revs):
> diff --git a/tests/test-log.t b/tests/test-log.t
> --- a/tests/test-log.t
> +++ b/tests/test-log.t
> @@ -918,6 +918,44 @@ log -r tip --stat
>      1 files changed, 1 insertions(+), 0 deletions(-)
>
>
> +Test that log should respect the order of -rREV even if multiple OR conditions
> +are specified (issue5100):
> +
> + summary of revisions:
> +
> +  $ hg log -r0:6 -T '{rev} {pad(files, 6)} {desc|firstline}\n'
> +  0 base   base
> +  1 base   r1
> +  2 base   r2
> +  3 b1     b1
> +  4 b2     b2
> +  5        m12
> +  6 b1     b1.1
> +
> + log FILE in ascending order:
> +
> +  $ hg log -r0:6 -T '{rev} {files}\n' b1 b2
> +  3 b1
> +  4 b2
> +  6 b1
> +  $ hg log -r0:6 -T '{rev} {files}\n' b2 b1
> +  3 b1
> +  4 b2
> +  6 b1
> +
> + log -k TEXT in descending order:
> +
> +  $ hg log -r6:0 -T '{rev} {desc|firstline}\n' -k r1 -k r2 -k b1
> +  6 b1.1
> +  3 b1
> +  2 r2
> +  1 r1
> +  $ hg log -r6:0 -T '{rev} {desc|firstline}\n' -k r2 -k b1 -k r1
> +  6 b1.1
> +  3 b1
> +  2 r2
> +  1 r1
> +
>     $ cd ..
>
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>

-- 
Pierre-Yves David


More information about the Reviewers mailing list