rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Before this change, the pseudo-entry returned by `Revlog.get_entry` for
`NULL_REVISION` would trigger errors in application code using it.
For example, this fixes a crash spotted with changelog data
while implementing RHGitaly: `Changelog.data_for_rev(-1)` was already
returning the pseudo content as expected, e.g., for `hg log`, but
`Changelog.entry_for_rev(-1).data()` would still crash with
"corrupted revlog, hash check failed for revision -1". There is
an added test for this scenario.
#require rhg
$ NO_FALLBACK="env RHG_ON_UNSUPPORTED=abort"
Rhg works well when sparse working copy is enabled.
$ cd "$TESTTMP"
$ hg init repo-sparse
$ cd repo-sparse
$ cat > .hg/hgrc <<EOF
> [extensions]
> sparse=
> EOF
$ echo a > show
$ echo x > hide
$ mkdir dir1 dir2
$ echo x > dir1/x
$ echo y > dir1/y
$ echo z > dir2/z
$ hg ci -Aqm 'initial'
$ hg debugsparse --include 'show'
$ ls -A
.hg
show
$ tip=$(hg log -r . --template '{node}')
$ $NO_FALLBACK rhg files -r "$tip"
dir1/x
dir1/y
dir2/z
hide
show
$ $NO_FALLBACK rhg files
show
$ $NO_FALLBACK rhg cat -r "$tip" hide
x
$ cd ..
We support most things when narrow is enabled, too, with a couple of caveats.
$ . "$TESTDIR/narrow-library.sh"
$ real_hg=$RHG_FALLBACK_EXECUTABLE
$ cat >> $HGRCPATH <<EOF
> [extensions]
> narrow=
> EOF
$ hg clone --narrow ./repo-sparse repo-narrow --include dir1
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
new changesets 6d714a4a2998
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd repo-narrow
$ $NO_FALLBACK rhg cat -r "$tip" dir1/x
x
$ "$real_hg" cat -r "$tip" dir1/x
x
TODO: bad error message
$ $NO_FALLBACK rhg cat -r "$tip" hide
abort: invalid revision identifier: 6d714a4a2998cbfd0620db44da58b749f6565d63
[255]
$ "$real_hg" cat -r "$tip" hide
[1]
A naive implementation of `rhg files` would leak the paths that are supposed
to be hidden by narrow.
$ $NO_FALLBACK rhg files -r "$tip"
dir1/x
dir1/y
$ "$real_hg" files -r "$tip"
dir1/x
dir1/y
The working copy version works with narrow correctly
$ $NO_FALLBACK rhg files
dir1/x
dir1/y
$ "$real_hg" files
dir1/x
dir1/y
Hg status needs to do some filtering based on narrow spec
$ mkdir dir2
$ touch dir2/q
$ "$real_hg" status
$ $NO_FALLBACK rhg --config rhg.status=true status
Adding "orphaned" index files:
$ (cd ..; cp repo-sparse/.hg/store/data/hide.i repo-narrow/.hg/store/data/hide.i)
$ (cd ..; mkdir repo-narrow/.hg/store/data/dir2; cp repo-sparse/.hg/store/data/dir2/z.i repo-narrow/.hg/store/data/dir2/z.i)
$ "$real_hg" verify -q
$ "$real_hg" files -r "$tip"
dir1/x
dir1/y
# TODO: even though [hg files] hides the orphaned dir2/z, [hg cat] still shows it.
# rhg has the same issue, but at least it's not specific to rhg.
# This is despite [hg verify] succeeding above.
$ $NO_FALLBACK rhg cat -r "$tip" dir2/z
z
$ "$real_hg" cat -r "$tip" dir2/z
z