# HG changeset patch # User Yuya Nishihara # Date 2021-02-02 11:20:17 # Node ID 9842c00f02520d93a8301762a816eb17a9dc8e2c # Parent 0492002560f3616a744275ca7ffec3ae2275382c 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. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1135,7 +1135,7 @@ class revlogfilestorage(object): """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 @@ class revlognarrowfilestorage(object): """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) diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py --- a/mercurial/logcmdutil.py +++ b/mercurial/logcmdutil.py @@ -845,7 +845,7 @@ def _makematcher(repo, revs, wopts): # 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 diff --git a/tests/test-log.t b/tests/test-log.t --- a/tests/test-log.t +++ b/tests/test-log.t @@ -102,6 +102,41 @@ log on directory 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