Mercurial > hg
changeset 29408:785cadec2091
revset: make head() honor order of subset
The ordering of 'x & head()' was broken in 6a1a4c212d50 (revset:
improve head revset performance, 2014-03-13). Presumably due to other
optimizations since then, undoing that change to fix the order does
not slow down the simple case of "hg log -r 'head()'" mentioned in
that commit. I see a small slowdown from ~0.16s to about ~0.19s with
'not 0 & head()', but I'd say it's worth it for the correct output.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 23 Jun 2016 12:37:09 -0700 |
parents | 20fabe814f89 |
children | d2c375071d16 |
files | mercurial/revset.py tests/test-revset.t |
diffstat | 2 files changed, 4 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revset.py Thu Jun 23 13:08:10 2016 -0700 +++ b/mercurial/revset.py Thu Jun 23 12:37:09 2016 -0700 @@ -1147,9 +1147,7 @@ cl = repo.changelog for ls in repo.branchmap().itervalues(): hs.update(cl.rev(h) for h in ls) - # XXX We should combine with subset first: 'subset & baseset(...)'. This is - # necessary to ensure we preserve the order in subset. - return baseset(hs) & subset + return subset & baseset(hs) @predicate('heads(set)', safe=True) def heads(repo, subset, x):
--- a/tests/test-revset.t Thu Jun 23 13:08:10 2016 -0700 +++ b/tests/test-revset.t Thu Jun 23 12:37:09 2016 -0700 @@ -952,13 +952,12 @@ 1 0 - 'head()' combines sets in wrong order: + 'head()' combines sets in right order: $ log '2:0 & head()' - 0 + 2 1 - 2 - BROKEN: should be '2 1 0' + 0 'a + b', which is optimized to '_list(a b)', should take the ordering of the left expression: