Skip to content

Commit

Permalink
fsck: exit with non-zero status upon error from fsck_obj()
Browse files Browse the repository at this point in the history
Upon finding a corrupt loose object, we forgot to note the error to
signal it with the exit status of the entire process.

[jc: adjusted t1450 and added another test]

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Sep 10, 2014
1 parent d31f3ad commit 2e770fe
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
3 changes: 2 additions & 1 deletion builtin/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,8 @@ static void fsck_sha1_list(void)
unsigned char *sha1 = entry->sha1;

sha1_list.entry[i] = NULL;
fsck_sha1(sha1);
if (fsck_sha1(sha1))
errors_found |= ERROR_OBJECT;
free(entry);
}
sha1_list.nr = 0;
Expand Down
32 changes: 26 additions & 6 deletions t/t1450-fsck.sh
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ test_expect_success 'object with bad sha1' '
git update-ref refs/heads/bogus $cmt &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
test_might_fail git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "$sha.*corrupt" out
'
Expand Down Expand Up @@ -101,7 +101,7 @@ test_expect_success 'email with embedded > is not okay' '
test_when_finished "remove_object $new" &&
git update-ref refs/heads/bogus "$new" &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "error in commit $new" out
'
Expand All @@ -113,7 +113,7 @@ test_expect_success 'missing < email delimiter is reported nicely' '
test_when_finished "remove_object $new" &&
git update-ref refs/heads/bogus "$new" &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "error in commit $new.* - bad name" out
'
Expand All @@ -125,7 +125,7 @@ test_expect_success 'missing email is reported nicely' '
test_when_finished "remove_object $new" &&
git update-ref refs/heads/bogus "$new" &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "error in commit $new.* - missing email" out
'
Expand All @@ -137,7 +137,7 @@ test_expect_success '> in name is reported' '
test_when_finished "remove_object $new" &&
git update-ref refs/heads/bogus "$new" &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "error in commit $new" out
'
Expand All @@ -151,11 +151,31 @@ test_expect_success 'integer overflow in timestamps is reported' '
test_when_finished "remove_object $new" &&
git update-ref refs/heads/bogus "$new" &&
test_when_finished "git update-ref -d refs/heads/bogus" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "error in commit $new.*integer overflow" out
'

test_expect_success 'malformatted tree object' '
test_when_finished "git update-ref -d refs/tags/wrong" &&
test_when_finished "remove_object \$T" &&
T=$(
GIT_INDEX_FILE=test-index &&
export GIT_INDEX_FILE &&
rm -f test-index &&
>x &&
git add x &&
T=$(git write-tree) &&
(
git cat-file tree $T &&
git cat-file tree $T
) |
git hash-object -w -t tree --stdin
) &&
test_must_fail git fsck 2>out &&
grep "error in tree .*contains duplicate file entries" out
'

test_expect_success 'tag pointing to nonexistent' '
cat >invalid-tag <<-\EOF &&
object ffffffffffffffffffffffffffffffffffffffff
Expand Down
2 changes: 1 addition & 1 deletion t/t4212-log-corrupt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ test_expect_success 'setup' '
'

test_expect_success 'fsck notices broken commit' '
git fsck 2>actual &&
test_must_fail git fsck 2>actual &&
test_i18ngrep invalid.author actual
'

Expand Down

0 comments on commit 2e770fe

Please sign in to comment.