grep: add stub class that maintains cache and states of grep operation
Prepares for extracting stateful functions from commands.grep().
--- a/mercurial/commands.py Wed Sep 09 15:23:49 2020 +0900
+++ b/mercurial/commands.py Wed Sep 09 15:56:40 2020 +0900
@@ -3398,9 +3398,11 @@
if opts.get(b'print0'):
sep = eol = b'\0'
- getfile = util.lrucachefunc(repo.file)
- matches = {}
- copies = {}
+ searcher = grepmod.grepsearcher(ui, repo, regexp)
+
+ getfile = searcher._getfile
+ matches = searcher._matches
+ copies = searcher._copies
def grepbody(fn, rev, body):
matches[rev].setdefault(fn, [])
@@ -3520,12 +3522,12 @@
fm.data(matched=False)
fm.end()
- skip = set()
- revfiles = {}
+ skip = searcher._skip
+ revfiles = searcher._revfiles
found = False
follow = opts.get(b'follow')
- getrenamed = scmutil.getrenamedfn(repo)
+ getrenamed = searcher._getrenamed
def readfile(ctx, fn):
rev = ctx.rev()
--- a/mercurial/grep.py Wed Sep 09 15:23:49 2020 +0900
+++ b/mercurial/grep.py Wed Sep 09 15:56:40 2020 +0900
@@ -9,7 +9,11 @@
import difflib
-from . import pycompat
+from . import (
+ pycompat,
+ scmutil,
+ util,
+)
def matchlines(body, regexp):
@@ -69,3 +73,20 @@
yield (b'-', a[i])
for i in pycompat.xrange(blo, bhi):
yield (b'+', b[i])
+
+
+class grepsearcher(object):
+ """Search files and revisions for lines matching the given pattern"""
+
+ def __init__(self, ui, repo, regexp):
+ self._ui = ui
+ self._repo = repo
+ self._regexp = regexp
+
+ self._getfile = util.lrucachefunc(repo.file)
+ self._getrenamed = scmutil.getrenamedfn(repo)
+
+ self._matches = {}
+ self._copies = {}
+ self._skip = set()
+ self._revfiles = {}