#!/bin/sh test_description='git fsck random collection of tests' . ./test-lib.sh test_expect_success setup ' test_commit A fileA one && git checkout HEAD^0 && test_commit B fileB two && git tag -d A B && git reflog expire --expire=now --all ' test_expect_success 'HEAD is part of refs' ' test 0 = $(git fsck | wc -l) ' test_expect_success 'loose objects borrowed from alternate are not missing' ' mkdir another && ( cd another && git init && echo ../../../.git/objects >.git/objects/info/alternates && test_commit C fileC one && git fsck >out && ! grep "missing blob" out ) ' # Corruption tests follow. Make sure to remove all traces of the # specific corruption you test afterwards, lest a later test trip over # it. test_expect_success 'object with bad sha1' ' sha=$(echo blob | git hash-object -w --stdin) && echo $sha && old=$(echo $sha | sed "s+^..+&/+") && new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff && sha="$(dirname $new)$(basename $new)" mv .git/objects/$old .git/objects/$new && git update-index --add --cacheinfo 100644 $sha foo && tree=$(git write-tree) && cmt=$(echo bogus | git commit-tree $tree) && git update-ref refs/heads/bogus $cmt && (git fsck 2>out; true) && grep "$sha.*corrupt" out && rm -f .git/objects/$new && git update-ref -d refs/heads/bogus && git read-tree -u --reset HEAD ' test_expect_success 'branch pointing to non-commit' ' git rev-parse HEAD^{tree} > .git/refs/heads/invalid && git fsck 2>out && grep "not a commit" out && git update-ref -d refs/heads/invalid ' cat > invalid-tag < 1234567890 -0000 This is an invalid tag. EOF test_expect_success 'tag pointing to nonexistent' ' tag=$(git hash-object -t tag -w --stdin < invalid-tag) && echo $tag > .git/refs/tags/invalid && test_must_fail git fsck --tags >out && cat out && grep "broken link" out && rm .git/refs/tags/invalid ' cat > wrong-tag < 1234567890 -0000 This is an invalid tag. EOF test_expect_success 'tag pointing to something else than its type' ' tag=$(git hash-object -t tag -w --stdin < wrong-tag) && echo $tag > .git/refs/tags/wrong && test_must_fail git fsck --tags 2>out && cat out && grep "error in tag.*broken links" out && rm .git/refs/tags/wrong ' test_done