[PATCH 3/6] t1450: test fsck of packed objects
- From
Jeff King <peff@peff.net>
- Date
- Jan 13, 2017, 17:55 UTC
- Message-ID
- <20170113175555.3xlkk27ozniiql3h@sigill.intra.peff.net>
- In-Reply-To
- <20170113175258.e66taigy4wpokohk@sigill.intra.peff.net>
The code paths in fsck for packed and loose objects are quite different, and it is not immediately obvious that the packed case behaves well. In particular:
1. The fsck_loose() function always returns "0" to tell the
iterator to keep checking more objects. Whereas
fsck_obj_buffer() (which handles packed objects)
returns -1. This is OK, because the callback machinery
for verify_pack() does not stop when it sees a non-zero
return. 2. The fsck_loose() function sets the ERROR_OBJECT bit
when fsck_obj() fails, whereas fsck_obj_buffer() sets it
only when it sees a corrupt object. This turns out not
to matter. We don't actually do anything with this bit
except exit the program with a non-zero code, and that
is handled already by the non-zero return from the
function.So there are no bugs here, but it was certainly confusing to me. And we do not test either of the properties in t1450 (neither that a non-corruption error will caused a non-zero exit for a packed object, nor that we keep going after seeing the first error). Let's test both of those conditions, so that we'll notice if any of those assumptions becomes invalid.
Signed-off-by: Jeff King <peff@peff.net> --- t/t1450-fsck.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index f95174c9d..c39d42120 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -560,4 +560,25 @@ test_expect_success 'alternate objects are correctly blamed' ' grep alt.git out ' +test_expect_success 'fsck errors in packed objects' ' + git cat-file commit HEAD >basis && + sed "s/</one/" basis >one && + sed "s/</foo/" basis >two && + one=$(git hash-object -t commit -w one) && + two=$(git hash-object -t commit -w two) && + pack=$( + { + echo $one && + echo $two + } | git pack-objects .git/objects/pack/pack + ) && + test_when_finished "rm -f .git/objects/pack/pack-$pack.*" && + remove_object $one && + remove_object $two && + test_must_fail git fsck 2>out && + grep "error in commit $one.* - bad name" out && + grep "error in commit $two.* - bad name" out && + ! grep corrupt out +' + test_done
-- 2.11.0.629.g10075098c