log: extract function that builds (revs, makefilematcher) from walkopts
authorYuya Nishihara <yuya@tcha.org>
Thu, 10 Sep 2020 17:44:34 +0900
changeset 45628 7f033a587414
parent 45627 224c786f4fce
child 45629 292962570857
log: extract function that builds (revs, makefilematcher) from walkopts "hg grep" and "hg churn" will use this interface.
mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py	Sat Sep 12 22:42:58 2020 +0900
+++ b/mercurial/logcmdutil.py	Thu Sep 10 17:44:34 2020 +0900
@@ -47,13 +47,14 @@
 if pycompat.TYPE_CHECKING:
     from typing import (
         Any,
+        Callable,
         Dict,
         List,
         Optional,
         Tuple,
     )
 
-    for t in (Any, Dict, List, Optional, Tuple):
+    for t in (Any, Callable, Dict, List, Optional, Tuple):
         assert t
 
 
@@ -721,7 +722,7 @@
     # type: (Any, List[bytes], Dict[bytes, Any]) -> walkopts
     """Parse log command options into walkopts
 
-    The returned walkopts will be passed in to getrevs().
+    The returned walkopts will be passed in to getrevs() or makewalker().
     """
     if opts.get(b'follow_first'):
         follow = 1
@@ -956,11 +957,12 @@
     return revs
 
 
-def getrevs(repo, wopts):
-    # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
-    """Return (revs, differ) where revs is a smartset
+def makewalker(repo, wopts):
+    # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[Callable[[Any], matchmod.basematcher]]]
+    """Build (revs, makefilematcher) to scan revision/file history
 
-    differ is a changesetdiffer with pre-configured file matcher.
+    - revs is the smartset to be traversed.
+    - makefilematcher is a function to map ctx to a matcher for that revision
     """
     revs = _initialrevs(repo, wopts)
     if not revs:
@@ -1003,6 +1005,18 @@
     if wopts.limit is not None:
         revs = revs.slice(0, wopts.limit)
 
+    return revs, filematcher
+
+
+def getrevs(repo, wopts):
+    # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
+    """Return (revs, differ) where revs is a smartset
+
+    differ is a changesetdiffer with pre-configured file matcher.
+    """
+    revs, filematcher = makewalker(repo, wopts)
+    if not revs:
+        return revs, None
     differ = changesetdiffer()
     differ._makefilematcher = filematcher
     return revs, differ