changeset 45625:c11099cc1de4

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.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 12 Sep 2020 21:54:58 +0900
parents fb000408bca5
children 8fe09005ed88
files mercurial/logcmdutil.py
diffstat 1 files changed, 8 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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
             )