mercurial/logcmdutil.py
changeset 45473 5f0eeda2005d
parent 45472 07324227f6b7
child 45563 142f0dcf90d0
--- a/mercurial/logcmdutil.py	Fri Sep 11 15:13:35 2020 +0900
+++ b/mercurial/logcmdutil.py	Sat Sep 12 07:23:47 2020 +0900
@@ -692,13 +692,27 @@
     if not slowpath:
         follow = opts.get(b'follow') or opts.get(b'follow_first')
         if follow and opts.get(b'rev'):
+            # There may be the case that a path doesn't exist in some (but
+            # not all) of the specified start revisions, but let's consider
+            # the path is valid. Missing files will be warned by the matcher.
             startctxs = [repo[r] for r in revs]
             for f in match.files():
-                # No idea if the path was a directory at that revision, so
-                # take the slow path.
-                if any(f not in c for c in startctxs):
-                    slowpath = True
-                    break
+                found = False
+                for c in startctxs:
+                    if f in c:
+                        found = True
+                    elif c.hasdir(f):
+                        # If a directory exists in any of the start revisions,
+                        # take the slow path.
+                        found = slowpath = True
+                if not found:
+                    raise error.Abort(
+                        _(
+                            b'cannot follow file not in any of the specified '
+                            b'revisions: "%s"'
+                        )
+                        % f
+                    )
         elif follow:
             for f in match.files():
                 if f not in wctx: