t: add lib-loose.sh
This commit adds a shell library for writing raw loose objects into the object database. Normally this is done with hash-object, but the specific intent here is to allow broken objects that hash-object may not support. We'll convert several cases that use "hash-object --literally" to write objects with invalid types. That works currently, but dropping this dependency will allow us to remove that feature and simplify the object-writing code. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
f2ed511a2f
commit
b5643b60ac
30
t/lib-loose.sh
Normal file
30
t/lib-loose.sh
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Support routines for hand-crafting loose objects.
|
||||||
|
|
||||||
|
# Write a loose object into the odb at $1, with object type $2 and contents
|
||||||
|
# from stdin. Writes the oid to stdout. Example:
|
||||||
|
#
|
||||||
|
# oid=$(echo foo | loose_obj .git/objects blob)
|
||||||
|
#
|
||||||
|
loose_obj () {
|
||||||
|
cat >tmp_loose.content &&
|
||||||
|
size=$(wc -c <tmp_loose.content) &&
|
||||||
|
{
|
||||||
|
# Do not quote $size here; we want the shell
|
||||||
|
# to strip whitespace that "wc" adds on some platforms.
|
||||||
|
printf "%s %s\0" "$2" $size &&
|
||||||
|
cat tmp_loose.content
|
||||||
|
} >tmp_loose.raw &&
|
||||||
|
|
||||||
|
oid=$(test-tool $test_hash_algo <tmp_loose.raw) &&
|
||||||
|
suffix=${oid#??} &&
|
||||||
|
prefix=${oid%$suffix} &&
|
||||||
|
dir=$1/$prefix &&
|
||||||
|
file=$dir/$suffix &&
|
||||||
|
|
||||||
|
test-tool zlib deflate <tmp_loose.raw >tmp_loose.zlib &&
|
||||||
|
mkdir -p "$dir" &&
|
||||||
|
mv tmp_loose.zlib "$file" &&
|
||||||
|
|
||||||
|
rm tmp_loose.raw tmp_loose.content &&
|
||||||
|
echo "$oid"
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
test_description='git cat-file'
|
test_description='git cat-file'
|
||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
. "$TEST_DIRECTORY/lib-loose.sh"
|
||||||
|
|
||||||
test_cmdmode_usage () {
|
test_cmdmode_usage () {
|
||||||
test_expect_code 129 "$@" 2>err &&
|
test_expect_code 129 "$@" 2>err &&
|
||||||
@@ -657,12 +658,12 @@ test_expect_success 'setup bogus data' '
|
|||||||
bogus_short_type="bogus" &&
|
bogus_short_type="bogus" &&
|
||||||
bogus_short_content="bogus" &&
|
bogus_short_content="bogus" &&
|
||||||
bogus_short_size=$(strlen "$bogus_short_content") &&
|
bogus_short_size=$(strlen "$bogus_short_content") &&
|
||||||
bogus_short_oid=$(echo_without_newline "$bogus_short_content" | git hash-object -t $bogus_short_type --literally -w --stdin) &&
|
bogus_short_oid=$(echo_without_newline "$bogus_short_content" | loose_obj .git/objects $bogus_short_type) &&
|
||||||
|
|
||||||
bogus_long_type="abcdefghijklmnopqrstuvwxyz1234679" &&
|
bogus_long_type="abcdefghijklmnopqrstuvwxyz1234679" &&
|
||||||
bogus_long_content="bogus" &&
|
bogus_long_content="bogus" &&
|
||||||
bogus_long_size=$(strlen "$bogus_long_content") &&
|
bogus_long_size=$(strlen "$bogus_long_content") &&
|
||||||
bogus_long_oid=$(echo_without_newline "$bogus_long_content" | git hash-object -t $bogus_long_type --literally -w --stdin)
|
bogus_long_oid=$(echo_without_newline "$bogus_long_content" | loose_obj .git/objects $bogus_long_type)
|
||||||
'
|
'
|
||||||
|
|
||||||
for arg1 in -s -t -p
|
for arg1 in -s -t -p
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ test_description='git fsck random collection of tests
|
|||||||
'
|
'
|
||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
. "$TEST_DIRECTORY/lib-loose.sh"
|
||||||
|
|
||||||
test_expect_success setup '
|
test_expect_success setup '
|
||||||
git config gc.auto 0 &&
|
git config gc.auto 0 &&
|
||||||
@@ -973,7 +974,7 @@ test_expect_success 'fsck error and recovery on invalid object type' '
|
|||||||
(
|
(
|
||||||
cd garbage-type &&
|
cd garbage-type &&
|
||||||
|
|
||||||
garbage_blob=$(git hash-object --stdin -w -t garbage --literally </dev/null) &&
|
garbage_blob=$(loose_obj objects garbage </dev/null) &&
|
||||||
|
|
||||||
test_must_fail git fsck 2>err &&
|
test_must_fail git fsck 2>err &&
|
||||||
grep -e "^error" -e "^fatal" err >errors &&
|
grep -e "^error" -e "^fatal" err >errors &&
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|||||||
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
. "$TEST_DIRECTORY/lib-loose.sh"
|
||||||
|
|
||||||
test_cmp_failed_rev_parse () {
|
test_cmp_failed_rev_parse () {
|
||||||
dir=$1
|
dir=$1
|
||||||
@@ -67,8 +68,8 @@ test_expect_success 'ambiguous loose bad object parsed as OBJ_BAD' '
|
|||||||
cd blob.bad &&
|
cd blob.bad &&
|
||||||
|
|
||||||
# Both have the prefix "bad0"
|
# Both have the prefix "bad0"
|
||||||
echo xyzfaowcoh | git hash-object -t bad -w --stdin --literally &&
|
echo xyzfaowcoh | loose_obj objects bad &&
|
||||||
echo xyzhjpyvwl | git hash-object -t bad -w --stdin --literally
|
echo xyzhjpyvwl | loose_obj objects bad
|
||||||
) &&
|
) &&
|
||||||
|
|
||||||
test_cmp_failed_rev_parse blob.bad bad0 <<-\EOF
|
test_cmp_failed_rev_parse blob.bad bad0 <<-\EOF
|
||||||
|
|||||||
Reference in New Issue
Block a user