scmutil: speed up relativization of paths when it's a no-op
Running commands from the root is commmon, in particular for
automation. Running `hg files > /tmp/a` from the root of
mozilla-central on linux:
before:
real 0m1,510s
user 0m1,387s
sys 0m0,090s
after:
real 0m1,266s
user 0m1,165s
sys 0m0,073s
(there are 280k paths, so this was costing ~1us per path somehow)
Differential Revision: https://phab.mercurial-scm.org/D8585
--- a/mercurial/scmutil.py Mon May 18 16:00:26 2020 -0400
+++ b/mercurial/scmutil.py Tue May 26 07:03:11 2020 -0400
@@ -803,9 +803,12 @@
if relative:
cwd = repo.getcwd()
- pathto = repo.pathto
- return lambda f: pathto(f, cwd)
- elif repo.ui.configbool(b'ui', b'slash'):
+ if cwd != b'':
+ # this branch is correct when cwd == b'', ie cwd = repo root,
+ # but it's slower
+ pathto = repo.pathto
+ return lambda f: pathto(f, cwd)
+ if repo.ui.configbool(b'ui', b'slash'):
return lambda f: f
else:
return util.localpath