# HG changeset patch # User Yuya Nishihara # Date 2020-09-09 08:04:44 # Node ID c10c87c8fe79a7c1f7e6097928fa4de5e2fec953 # Parent 87c35b5a14eb66bd4b1937bb65f948a3abe41d79 grep: extract public function to register file to be skipped The main grep loop will be extracted to a searcher method, but this skipping condition depends on the result of display() function. diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -3549,9 +3549,7 @@ def grep(ui, repo, pattern, *pats, **opt r = display(fm, fn, ctx, pstates, states) found = found or r if r and not diff and not all_files: - skip.add(fn) - if copy: - skip.add(copy) + searcher.skipfile(fn, rev) del revfiles[rev] # We will keep the matches dict for the duration of the window # clear the matches dict once the window is over diff --git a/mercurial/grep.py b/mercurial/grep.py --- a/mercurial/grep.py +++ b/mercurial/grep.py @@ -107,6 +107,14 @@ class grepsearcher(object): self._skip = set() self._revfiles = {} + def skipfile(self, fn, rev): + """Exclude the given file (and the copy at the specified revision) + from future search""" + copy = self._copies.get(rev, {}).get(fn) + self._skip.add(fn) + if copy: + self._skip.add(copy) + def _grepbody(self, fn, rev, body): self._matches[rev].setdefault(fn, []) m = self._matches[rev][fn]