revset: handle wdir() in `sort(..., -topo)`
authorMatt Harbison <matt_harbison@yahoo.com>
Tue, 04 Oct 2022 12:34:50 -0400
changeset 49511 117dcc4a0e67
parent 49510 e02dcc625171
child 49512 6939d5ed20e0
revset: handle wdir() in `sort(..., -topo)` The last apparent usage of `repo.changelog.parentrevs` in revsets is in `children()`, but since the sets being operated on never include wdir(), it's never called with `wdirrev` and the wdir() arg on the command line is effectively ignored instead of aborting there. I'm not sure how to fix that. Before (on a clone of hg): $ python3.8 hg perf::revset --config extensions.perf=contrib/perf.py 'sort(all(), -topo)' ! wall 0.123663 comb 0.130000 user 0.130000 sys 0.000000 (best of 76) After: $ python3.8 hg perf::revset --config extensions.perf=contrib/perf.py 'sort(all(), -topo)' ! wall 0.123838 comb 0.130000 user 0.130000 sys 0.000000 (best of 75)
mercurial/revset.py
tests/test-revset2.t
--- a/mercurial/revset.py	Mon Oct 03 17:24:52 2022 -0400
+++ b/mercurial/revset.py	Tue Oct 04 12:34:50 2022 -0400
@@ -2474,10 +2474,20 @@
         return revs
     elif keyflags[0][0] == b"topo":
         firstbranch = ()
+        parentrevs = repo.changelog.parentrevs
+        parentsfunc = parentrevs
+        if wdirrev in revs:
+
+            def parentsfunc(r):
+                try:
+                    return parentrevs(r)
+                except error.WdirUnsupported:
+                    return [p.rev() for p in repo[None].parents()]
+
         if b'topo.firstbranch' in opts:
             firstbranch = getset(repo, subset, opts[b'topo.firstbranch'])
         revs = baseset(
-            dagop.toposort(revs, repo.changelog.parentrevs, firstbranch),
+            dagop.toposort(revs, parentsfunc, firstbranch),
             istopo=True,
         )
         if keyflags[0][1]:
--- a/tests/test-revset2.t	Mon Oct 03 17:24:52 2022 -0400
+++ b/tests/test-revset2.t	Tue Oct 04 12:34:50 2022 -0400
@@ -1487,6 +1487,13 @@
   -1
   $ log 'roots(wdir())'
   2147483647
+  $ log 'sort(., -topo)'
+  -1
+  $ log 'sort(. or wdir(), -topo)'
+  -1
+  2147483647
+  $ log 'sort(wdir(), -topo)'
+  2147483647
 
   $ echo default0 >> a
   $ hg ci -Aqm0
@@ -1509,6 +1516,12 @@
   5
   $ log 'roots(wdir())'
   2147483647
+  $ log 'sort(. or wdir() or .^, -topo)'
+  4
+  5
+  2147483647
+  $ log 'sort(wdir(), -topo)'
+  2147483647
 
 "null" revision belongs to "default" branch (issue4683)