log: map --removed to walkopts.force_changelog_traversal
authorYuya Nishihara <yuya@tcha.org>
Sat, 12 Sep 2020 21:54:58 +0900
changeset 45625 c11099cc1de4
parent 45624 fb000408bca5
child 45626 8fe09005ed88
log: map --removed to walkopts.force_changelog_traversal This is the flag to forcibly enable the slowpath. I'm not sure if the slowpath parameter should be merged with this flag, so let's keep it as an immutable flag for now. I'll add another flag to support "grep --all-files". These two will be the flags which aren't directly mapped from the command-line options.
mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py	Fri Sep 25 14:33:05 2020 +0200
+++ b/mercurial/logcmdutil.py	Sat Sep 12 21:54:58 2020 +0900
@@ -693,6 +693,10 @@
     # 0: no follow, 1: follow first, 2: follow both parents
     follow = attr.ib(default=0)  # type: int
 
+    # do not attempt filelog-based traversal, which may be fast but cannot
+    # include revisions where files were removed
+    force_changelog_traversal = attr.ib(default=False)  # type: bool
+
     # limit number of changes displayed; None means unlimited
     limit = attr.ib(default=None)  # type: Optional[int]
 
@@ -715,6 +719,7 @@
         opts=opts,
         revspec=opts.get(b'rev', []),
         follow=follow,
+        force_changelog_traversal=bool(opts.get(b'removed')),
         limit=getlimit(opts),
     )
 
@@ -736,7 +741,7 @@
     wctx = repo[None]
     match, pats = scmutil.matchandpats(wctx, wopts.pats, wopts.opts)
     slowpath = match.anypats() or (
-        not match.always() and wopts.opts.get(b'removed')
+        not match.always() and wopts.force_changelog_traversal
     )
     if not slowpath:
         if wopts.follow and wopts.revspec:
@@ -923,6 +928,7 @@
     revs = _initialrevs(repo, wopts)
     if not revs:
         return smartset.baseset(), None
+    # TODO: might want to merge slowpath with wopts.force_changelog_traversal
     match, pats, slowpath = _makematcher(repo, revs, wopts)
     wopts = attr.evolve(wopts, pats=pats)
 
@@ -931,6 +937,7 @@
         if slowpath or match.always():
             revs = dagop.revancestors(repo, revs, followfirst=wopts.follow == 1)
         else:
+            assert not wopts.force_changelog_traversal
             revs, filematcher = _fileancestors(
                 repo, revs, match, followfirst=wopts.follow == 1
             )