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)
--- 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)