[Updated] D8582: grep: reduce the cost of pathauditor checks when grepping working copy
valentin.gatienbaron (Valentin Gatien-Baron)
phabricator at mercurial-scm.org
Thu May 28 16:24:51 UTC 2020
Closed by commit rHG233ee525dcef: grep: reduce the cost of pathauditor checks when grepping working copy (authored by valentin.gatienbaron).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D8582?vs=21469&id=21495
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D8582/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D8582
AFFECTED FILES
mercurial/commands.py
mercurial/pathutil.py
CHANGE DETAILS
diff --git a/mercurial/pathutil.py b/mercurial/pathutil.py
--- a/mercurial/pathutil.py
+++ b/mercurial/pathutil.py
@@ -1,5 +1,6 @@
from __future__ import absolute_import
+import contextlib
import errno
import os
import posixpath
@@ -148,6 +149,19 @@
except (OSError, error.Abort):
return False
+ @contextlib.contextmanager
+ def cached(self):
+ if self._cached:
+ yield
+ else:
+ try:
+ self._cached = True
+ yield
+ finally:
+ self.audited.clear()
+ self.auditeddir.clear()
+ self._cached = False
+
def canonpath(root, cwd, myname, auditor=None):
'''return the canonical path of myname, given cwd and root
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3609,31 +3609,38 @@
parent = pctx.rev()
matches.setdefault(parent, {})
files = revfiles.setdefault(rev, [])
- for fn in fns:
- # fn might not exist in the revision (could be a file removed by the
- # revision). We could check `fn not in ctx` even when rev is None,
- # but it's less racy to protect againt that in readfile.
- if rev is not None and fn not in ctx:
- continue
-
- copy = None
- if follow:
- copy = getrenamed(fn, rev)
- if copy:
- copies.setdefault(rev, {})[fn] = copy
- if fn in skip:
- skip.add(copy)
- if fn in skip:
- continue
- files.append(fn)
-
- if fn not in matches[rev]:
- grepbody(fn, rev, readfile(ctx, fn))
-
- if diff:
- pfn = copy or fn
- if pfn not in matches[parent] and pfn in pctx:
- grepbody(pfn, parent, readfile(pctx, pfn))
+ if rev is None:
+ # in `hg grep pattern`, 2/3 of the time is spent is spent in
+ # pathauditor checks without this in mozilla-central
+ contextmanager = repo.wvfs.audit.cached
+ else:
+ contextmanager = util.nullcontextmanager
+ with contextmanager():
+ for fn in fns:
+ # fn might not exist in the revision (could be a file removed by
+ # the revision). We could check `fn not in ctx` even when rev is
+ # None, but it's less racy to protect againt that in readfile.
+ if rev is not None and fn not in ctx:
+ continue
+
+ copy = None
+ if follow:
+ copy = getrenamed(fn, rev)
+ if copy:
+ copies.setdefault(rev, {})[fn] = copy
+ if fn in skip:
+ skip.add(copy)
+ if fn in skip:
+ continue
+ files.append(fn)
+
+ if fn not in matches[rev]:
+ grepbody(fn, rev, readfile(ctx, fn))
+
+ if diff:
+ pfn = copy or fn
+ if pfn not in matches[parent] and pfn in pctx:
+ grepbody(pfn, parent, readfile(pctx, pfn))
ui.pager(b'grep')
fm = ui.formatter(b'grep', opts)
To: valentin.gatienbaron, #hg-reviewers, marmoute
Cc: marmoute, mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20200528/453c2e2b/attachment-0002.html>
More information about the Mercurial-patches
mailing list