mercurial/logcmdutil.py
changeset 45625 c11099cc1de4
parent 45568 9a26fea2b518
child 45626 8fe09005ed88
--- 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
             )