revset: make head() honor order of subset
authorMartin von Zweigbergk <martinvonz@google.com>
Thu, 23 Jun 2016 12:37:09 -0700
changeset 29408 785cadec2091
parent 29407 20fabe814f89
child 29409 d2c375071d16
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.
mercurial/revset.py
tests/test-revset.t
--- 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: