log: fix handling of root (or empty) path provided by matcher (
issue6478)
Since
27d6956d386b "match: use '' instead of '.' for root directory",
'.' should be translated to ''. We can't blame repo.file() about this because
an empty string is invalid as a file path, but I found at least two callers
(_makematcher() and revset.filelog()) would crash because of this path[0].
So let's make repo.file() accept an empty string. path[0] == b'/' wouldn't
work on Python 3 anyways.
--- a/mercurial/localrepo.py Thu Feb 25 15:18:00 2021 +0530
+++ b/mercurial/localrepo.py Tue Feb 02 20:20:17 2021 +0900
@@ -1135,7 +1135,7 @@
"""File storage when using revlogs."""
def file(self, path):
- if path[0] == b'/':
+ if path.startswith(b'/'):
path = path[1:]
return filelog.filelog(self.svfs, path)
@@ -1146,7 +1146,7 @@
"""File storage when using revlogs and narrow files."""
def file(self, path):
- if path[0] == b'/':
+ if path.startswith(b'/'):
path = path[1:]
return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
--- a/mercurial/logcmdutil.py Thu Feb 25 15:18:00 2021 +0530
+++ b/mercurial/logcmdutil.py Tue Feb 02 20:20:17 2021 +0900
@@ -845,7 +845,7 @@
# slowpath; otherwise, we can turn off the slowpath
if slowpath:
for path in match.files():
- if path == b'.' or path in repo.store:
+ if not path or path in repo.store:
break
else:
slowpath = False
--- a/tests/test-log.t Thu Feb 25 15:18:00 2021 +0530
+++ b/tests/test-log.t Tue Feb 02 20:20:17 2021 +0900
@@ -102,6 +102,41 @@
summary: c
+log empty path (or repo root) of slow path shouldn't crash (issue6478)
+
+ $ hg log -ql1 '' inexistent
+ 4:7e4639b4691b
+ $ hg log -ql1 . inexistent
+ 4:7e4639b4691b
+ $ hg log -ql1 "`pwd`" inexistent
+ 4:7e4639b4691b
+
+ $ hg log -ql1 '' e
+ 4:7e4639b4691b
+ $ hg log -ql1 . e
+ 4:7e4639b4691b
+ $ hg log -ql1 "`pwd`" e
+ 4:7e4639b4691b
+
+log -f empty path (or repo root) shouldn't crash
+
+ $ hg log -qfl1 '' inexistent
+ abort: cannot follow file not in parent revision: "inexistent"
+ [255]
+ $ hg log -qfl1 . inexistent
+ abort: cannot follow file not in parent revision: "inexistent"
+ [255]
+ $ hg log -qfl1 "`pwd`" inexistent
+ abort: cannot follow file not in parent revision: "inexistent"
+ [255]
+
+ $ hg log -qfl1 '' e
+ 4:7e4639b4691b
+ $ hg log -qfl1 . e
+ 4:7e4639b4691b
+ $ hg log -qfl1 "`pwd`" e
+ 4:7e4639b4691b
+
-X, with explicit path
$ hg log a -X a