[PATCH 4 of 5] revset: make head() honor order of subset
Martin von Zweigbergk
martinvonz at google.com
Fri Jun 24 18:10:16 EDT 2016
# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1466710629 25200
# Thu Jun 23 12:37:09 2016 -0700
# Node ID 87950985ede58fc03fb4a207cd45f197f1690cb8
# Parent 4fc03f313a06f6f1ba9638d2692351de064e8482
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.
diff -r 4fc03f313a06 -r 87950985ede5 mercurial/revset.py
--- a/mercurial/revset.py Thu Jun 23 13:08:10 2016 -0700
+++ b/mercurial/revset.py Thu Jun 23 12:37:09 2016 -0700
@@ -1145,9 +1145,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):
diff -r 4fc03f313a06 -r 87950985ede5 tests/test-revset.t
--- 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:
More information about the Mercurial-devel
mailing list