clone: test for our behavior on odd objects/* content
Add tests for what happens when we perform a local clone on a repo containing odd files at .git/object directory, such as symlinks to other dirs, or unknown files. I'm bending over backwards here to avoid a SHA-1 dependency. See [1] for an earlier and simpler version that hardcoded SHA-1s. This behavior has been the same for a *long* time, but hasn't been tested for. There's a good post-hoc argument to be made for copying over unknown things, e.g. I'd like a git version that doesn't know about the commit-graph to copy it under "clone --local" so a newer git version can make use of it. In follow-up commits we'll look at changing some of this behavior, but for now, let's just assert it as-is so we'll notice what we'll change later. 1. https://public-inbox.org/git/20190226002625.13022-5-avarab@gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> [matheus.bernardino: improved and split tests in more than one patch] Helped-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
c0e78f7e46
commit
0315616927
|
@ -221,4 +221,115 @@ test_expect_success 'clone, dissociate from alternates' '
|
|||
( cd C && git fsck )
|
||||
'
|
||||
|
||||
test_expect_success 'setup repo with garbage in objects/*' '
|
||||
git init S &&
|
||||
(
|
||||
cd S &&
|
||||
test_commit A &&
|
||||
|
||||
cd .git/objects &&
|
||||
>.some-hidden-file &&
|
||||
>some-file &&
|
||||
mkdir .some-hidden-dir &&
|
||||
>.some-hidden-dir/some-file &&
|
||||
>.some-hidden-dir/.some-dot-file &&
|
||||
mkdir some-dir &&
|
||||
>some-dir/some-file &&
|
||||
>some-dir/.some-dot-file
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'clone a repo with garbage in objects/*' '
|
||||
for option in --local --no-hardlinks --shared --dissociate
|
||||
do
|
||||
git clone $option S S$option || return 1 &&
|
||||
git -C S$option fsck || return 1
|
||||
done &&
|
||||
find S-* -name "*some*" | sort >actual &&
|
||||
cat >expected <<-EOF &&
|
||||
S--dissociate/.git/objects/.some-hidden-file
|
||||
S--dissociate/.git/objects/some-dir
|
||||
S--dissociate/.git/objects/some-dir/.some-dot-file
|
||||
S--dissociate/.git/objects/some-dir/some-file
|
||||
S--dissociate/.git/objects/some-file
|
||||
S--local/.git/objects/.some-hidden-file
|
||||
S--local/.git/objects/some-dir
|
||||
S--local/.git/objects/some-dir/.some-dot-file
|
||||
S--local/.git/objects/some-dir/some-file
|
||||
S--local/.git/objects/some-file
|
||||
S--no-hardlinks/.git/objects/.some-hidden-file
|
||||
S--no-hardlinks/.git/objects/some-dir
|
||||
S--no-hardlinks/.git/objects/some-dir/.some-dot-file
|
||||
S--no-hardlinks/.git/objects/some-dir/some-file
|
||||
S--no-hardlinks/.git/objects/some-file
|
||||
EOF
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success SYMLINKS 'setup repo with manually symlinked dirs and unknown files at objects/' '
|
||||
git init T &&
|
||||
(
|
||||
cd T &&
|
||||
git config gc.auto 0 &&
|
||||
test_commit A &&
|
||||
git gc &&
|
||||
test_commit B &&
|
||||
|
||||
cd .git/objects &&
|
||||
mv pack packs &&
|
||||
ln -s packs pack &&
|
||||
find ?? -type d >loose-dirs &&
|
||||
last_loose=$(tail -n 1 loose-dirs) &&
|
||||
rm -f loose-dirs &&
|
||||
mv $last_loose a-loose-dir &&
|
||||
ln -s a-loose-dir $last_loose &&
|
||||
find . -type f | sort >../../../T.objects-files.raw &&
|
||||
echo unknown_content >unknown_file
|
||||
) &&
|
||||
git -C T fsck &&
|
||||
git -C T rev-list --all --objects >T.objects
|
||||
'
|
||||
|
||||
|
||||
test_expect_success SYMLINKS 'clone repo with symlinked dirs and unknown files at objects/' '
|
||||
for option in --local --no-hardlinks --shared --dissociate
|
||||
do
|
||||
git clone $option T T$option || return 1 &&
|
||||
git -C T$option fsck || return 1 &&
|
||||
git -C T$option rev-list --all --objects >T$option.objects &&
|
||||
test_cmp T.objects T$option.objects &&
|
||||
(
|
||||
cd T$option/.git/objects &&
|
||||
find . -type f | sort >../../../T$option.objects-files.raw
|
||||
)
|
||||
done &&
|
||||
|
||||
for raw in $(ls T*.raw)
|
||||
do
|
||||
sed -e "s!/../!/Y/!; s![0-9a-f]\{38,\}!Z!" -e "/commit-graph/d" \
|
||||
-e "/multi-pack-index/d" <$raw >$raw.de-sha || return 1
|
||||
done &&
|
||||
|
||||
cat >expected-files <<-EOF &&
|
||||
./Y/Z
|
||||
./Y/Z
|
||||
./a-loose-dir/Z
|
||||
./Y/Z
|
||||
./info/packs
|
||||
./pack/pack-Z.idx
|
||||
./pack/pack-Z.pack
|
||||
./packs/pack-Z.idx
|
||||
./packs/pack-Z.pack
|
||||
./unknown_file
|
||||
EOF
|
||||
|
||||
for option in --local --dissociate --no-hardlinks
|
||||
do
|
||||
test_cmp expected-files T$option.objects-files.raw.de-sha || return 1
|
||||
done &&
|
||||
|
||||
echo ./info/alternates >expected-files &&
|
||||
test_cmp expected-files T--shared.objects-files.raw
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Loading…
Reference in New Issue