revlog: use the user facing filename as the display_id for filelogs
I had trouble isolating some LFS blob corruption detected by `hg verify` because
the traceback referenced a file, but with the `data/` prefix in the `.hg/store`
path, so it couldn't be located with the `file()` revset:
```
Traceback (most recent call last):
File "/mnt/d/mercurial/mercurial/revlog.py", line 3209, in verifyintegrity
_verify_revision(self, skipflags, state, node)
File "/mnt/d/mercurial/hgext/lfs/wrapper.py", line 246, in _verify_revision
orig(rl, skipflags, state, node)
File "/mnt/d/mercurial/mercurial/revlog.py", line 158, in _verify_revision
rl.revision(node)
File "/mnt/d/mercurial/mercurial/revlog.py", line 1816, in revision
return self._revisiondata(nodeorrev, _df)
File "/mnt/d/mercurial/mercurial/revlog.py", line 1870, in _revisiondata
self.checkhash(text, node, rev=rev)
File "/mnt/d/mercurial/mercurial/revlog.py", line 1996, in checkhash
% (self.display_id, pycompat.bytestr(revornode))
mercurial.error.RevlogError: integrity check failed on data/EXE/PPC/shrinksrec.exe:0
```
(I'm a little surprised it resulted in a stacktrace instead of just a message,
but that's a different issue. I'm also not sure how to trigger the simplestore
case, since IIUC, it's also a revlog based store.)
It's not clear how to handle the changelog and manifest (because the user
doesn't interact with them as a file), so those cases are left alone. The other
thing that would be nice to improve somehow is to indicate that the ":0" is a
revlog revision, not the changeset revision that users are used to. I'm not
sure how to handle the "or node" part though.
--- a/mercurial/revlog.py Wed Oct 19 11:24:20 2022 -0400
+++ b/mercurial/revlog.py Wed Oct 19 11:50:40 2022 -0400
@@ -44,6 +44,7 @@
FLAG_INLINE_DATA,
INDEX_HEADER,
KIND_CHANGELOG,
+ KIND_FILELOG,
RANK_UNKNOWN,
REVLOGV0,
REVLOGV1,
@@ -652,9 +653,12 @@
@util.propertycache
def display_id(self):
"""The public facing "ID" of the revlog that we use in message"""
- # Maybe we should build a user facing representation of
- # revlog.target instead of using `self.radix`
- return self.radix
+ if self.revlog_kind == KIND_FILELOG:
+ # Reference the file without the "data/" prefix, so it is familiar
+ # to the user.
+ return self.target[1]
+ else:
+ return self.radix
def _get_decompressor(self, t):
try:
--- a/tests/test-convert-filemap.t Wed Oct 19 11:24:20 2022 -0400
+++ b/tests/test-convert-filemap.t Wed Oct 19 11:50:40 2022 -0400
@@ -292,12 +292,12 @@
$ rm -rf source/.hg/store/data/dir/file4
#endif
$ hg -q convert --filemap renames.fmap --datesort source dummydest
- abort: data/dir/file3@e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c: no match found (reporevlogstore !)
+ abort: dir/file3@e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c: no match found (reporevlogstore !)
abort: data/dir/file3/index@e96dce0bc6a2: no node (reposimplestore !)
[50]
$ hg -q convert --filemap renames.fmap --datesort --config convert.hg.ignoreerrors=1 source renames.repo
- ignoring: data/dir/file3@e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c: no match found (reporevlogstore !)
- ignoring: data/dir/file4@6edd55f559cdce67132b12ca09e09cee08b60442: no match found (reporevlogstore !)
+ ignoring: dir/file3@e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c: no match found (reporevlogstore !)
+ ignoring: dir/file4@6edd55f559cdce67132b12ca09e09cee08b60442: no match found (reporevlogstore !)
ignoring: data/dir/file3/index@e96dce0bc6a2: no node (reposimplestore !)
ignoring: data/dir/file4/index@6edd55f559cd: no node (reposimplestore !)
$ hg up -q -R renames.repo
--- a/tests/test-convert-hg-source.t Wed Oct 19 11:24:20 2022 -0400
+++ b/tests/test-convert-hg-source.t Wed Oct 19 11:50:40 2022 -0400
@@ -182,7 +182,7 @@
sorting...
converting...
4 init
- ignoring: data/b@1e88685f5ddec574a34c70af492f95b6debc8741: no match found (reporevlogstore !)
+ ignoring: b@1e88685f5ddec574a34c70af492f95b6debc8741: no match found (reporevlogstore !)
ignoring: data/b/index@1e88685f5dde: no node (reposimplestore !)
3 changeall
2 changebagain
--- a/tests/test-lfs.t Wed Oct 19 11:24:20 2022 -0400
+++ b/tests/test-lfs.t Wed Oct 19 11:50:40 2022 -0400
@@ -787,8 +787,8 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- l@1: unpacking 46a2f24864bc: integrity check failed on data/l:0
- large@0: unpacking 2c531e0992ff: integrity check failed on data/large:0
+ l@1: unpacking 46a2f24864bc: integrity check failed on l:0
+ large@0: unpacking 2c531e0992ff: integrity check failed on large:0
checked 5 changesets with 10 changes to 4 files
2 integrity errors encountered!
(first damaged changeset appears to be 0)
@@ -897,9 +897,9 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- l@1: unpacking 46a2f24864bc: integrity check failed on data/l:0
+ l@1: unpacking 46a2f24864bc: integrity check failed on l:0
lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
- large@0: unpacking 2c531e0992ff: integrity check failed on data/large:0
+ large@0: unpacking 2c531e0992ff: integrity check failed on large:0
lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
checked 5 changesets with 10 changes to 4 files
@@ -941,8 +941,8 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- l@1: unpacking 46a2f24864bc: integrity check failed on data/l:0
- large@0: unpacking 2c531e0992ff: integrity check failed on data/large:0
+ l@1: unpacking 46a2f24864bc: integrity check failed on l:0
+ large@0: unpacking 2c531e0992ff: integrity check failed on large:0
checked 5 changesets with 10 changes to 4 files
2 integrity errors encountered!
(first damaged changeset appears to be 0)
@@ -967,9 +967,9 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- l@1: unpacking 46a2f24864bc: integrity check failed on data/l:0
+ l@1: unpacking 46a2f24864bc: integrity check failed on l:0
lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
- large@0: unpacking 2c531e0992ff: integrity check failed on data/large:0
+ large@0: unpacking 2c531e0992ff: integrity check failed on large:0
lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
checked 5 changesets with 10 changes to 4 files
@@ -987,7 +987,7 @@
Accessing a corrupt file will complain
$ hg --cwd fromcorrupt2 cat -r 0 large
- abort: integrity check failed on data/large:0
+ abort: integrity check failed on large:0
[50]
lfs -> normal -> lfs round trip conversions are possible. The 'none()'
--- a/tests/test-narrow-exchange.t Wed Oct 19 11:24:20 2022 -0400
+++ b/tests/test-narrow-exchange.t Wed Oct 19 11:50:40 2022 -0400
@@ -218,8 +218,8 @@
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 0 changes to 0 files (no-lfs-on !)
- remote: error: pretxnchangegroup.lfs hook raised an exception: data/inside2/f@f59b4e0218355383d2789196f1092abcf2262b0c: no match found (lfs-on !)
+ remote: error: pretxnchangegroup.lfs hook raised an exception: inside2/f@f59b4e0218355383d2789196f1092abcf2262b0c: no match found (lfs-on !)
remote: transaction abort! (lfs-on !)
remote: rollback completed (lfs-on !)
- remote: abort: data/inside2/f@f59b4e0218355383d2789196f1092abcf2262b0c: no match found (lfs-on !)
+ remote: abort: inside2/f@f59b4e0218355383d2789196f1092abcf2262b0c: no match found (lfs-on !)
abort: stream ended unexpectedly (got 0 bytes, expected 4) (lfs-on !)
--- a/tests/test-verify.t Wed Oct 19 11:24:20 2022 -0400
+++ b/tests/test-verify.t Wed Oct 19 11:50:40 2022 -0400
@@ -297,7 +297,7 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- a@1: broken revlog! (index data/a is corrupted)
+ a@1: broken revlog! (index a is corrupted)
warning: orphan data file 'data/a.i'
checked 2 changesets with 0 changes to 1 files
1 warnings encountered!
@@ -350,7 +350,7 @@
checking manifests
crosschecking files in changesets and manifests
checking files
- base64@0: unpacking 794cee7777cb: integrity check failed on data/base64:0
+ base64@0: unpacking 794cee7777cb: integrity check failed on base64:0
checked 1 changesets with 1 changes to 1 files
1 integrity errors encountered!
(first damaged changeset appears to be 0)