Speed up hg grep by avoiding useless manifest parsing
In the kernel repo (tip = 2b89f7111b96), a "hg grep mpm MAINTAINERS" goes
from ~165s to 0.7s. This could get even a bit faster if we broke out of
the loop after the first match, but I'm not sure how that would interact
with the --follow code.
This is obviously an extreme example, but other cases should also benefit
from this patch.
--- a/mercurial/commands.py Tue Feb 19 19:20:10 2008 -0300
+++ b/mercurial/commands.py Tue Feb 19 19:20:10 2008 -0300
@@ -1072,19 +1072,19 @@
if st == 'window':
matches.clear()
elif st == 'add':
- mf = repo.changectx(rev).manifest()
+ ctx = repo.changectx(rev)
matches[rev] = {}
for fn in fns:
if fn in skip:
continue
try:
- grepbody(fn, rev, getfile(fn).read(mf[fn]))
+ grepbody(fn, rev, getfile(fn).read(ctx.filenode(fn)))
fstate.setdefault(fn, [])
if follow:
- copied = getfile(fn).renamed(mf[fn])
+ copied = getfile(fn).renamed(ctx.filenode(fn))
if copied:
copies.setdefault(rev, {})[fn] = copied[0]
- except KeyError:
+ except revlog.LookupError:
pass
elif st == 'iter':
states = matches[rev].items()