Skip to content

Commit

Permalink
Merge branch 'jc/fsck-dropped-errors' into maint
Browse files Browse the repository at this point in the history
There were some classes of errors that "git fsck" diagnosed to its
standard error that did not cause it to exit with non-zero status.

* jc/fsck-dropped-errors:
  fsck: exit with non-zero when problems are found
  • Loading branch information
Junio C Hamano committed Oct 16, 2015
2 parents 8f6f177 + 122f76f commit 1c7dc12
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
18 changes: 14 additions & 4 deletions builtin/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ static int show_dangling = 1;
#define ERROR_OBJECT 01
#define ERROR_REACHABLE 02
#define ERROR_PACK 04
#define ERROR_REFS 010

#ifdef NO_D_INO_IN_DIRENT
#define SORT_DIRENT 0
Expand Down Expand Up @@ -521,8 +522,10 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid,
/* We'll continue with the rest despite the error.. */
return 0;
}
if (obj->type != OBJ_COMMIT && is_branch(refname))
if (obj->type != OBJ_COMMIT && is_branch(refname)) {
error("%s: not a commit", refname);
errors_found |= ERROR_REFS;
}
default_refs++;
obj->used = 1;
mark_object_reachable(obj);
Expand Down Expand Up @@ -585,17 +588,23 @@ static int fsck_head_link(void)
fprintf(stderr, "Checking HEAD link\n");

head_points_at = resolve_ref_unsafe("HEAD", 0, head_oid.hash, &flag);
if (!head_points_at)
if (!head_points_at) {
errors_found |= ERROR_REFS;
return error("Invalid HEAD");
}
if (!strcmp(head_points_at, "HEAD"))
/* detached HEAD */
null_is_error = 1;
else if (!starts_with(head_points_at, "refs/heads/"))
else if (!starts_with(head_points_at, "refs/heads/")) {
errors_found |= ERROR_REFS;
return error("HEAD points to something strange (%s)",
head_points_at);
}
if (is_null_oid(&head_oid)) {
if (null_is_error)
if (null_is_error) {
errors_found |= ERROR_REFS;
return error("HEAD: detached HEAD points at nothing");
}
fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n",
head_points_at + 11);
}
Expand All @@ -615,6 +624,7 @@ static int fsck_cache_tree(struct cache_tree *it)
if (!obj) {
error("%s: invalid sha1 pointer in cache-tree",
sha1_to_hex(it->sha1));
errors_found |= ERROR_REFS;
return 1;
}
obj->used = 1;
Expand Down
22 changes: 21 additions & 1 deletion t/t1450-fsck.sh
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,31 @@ test_expect_success 'object with bad sha1' '
test_expect_success 'branch pointing to non-commit' '
git rev-parse HEAD^{tree} >.git/refs/heads/invalid &&
test_when_finished "git update-ref -d refs/heads/invalid" &&
git fsck 2>out &&
test_must_fail git fsck 2>out &&
cat out &&
grep "not a commit" out
'

test_expect_success 'HEAD link pointing at a funny object' '
test_when_finished "mv .git/SAVED_HEAD .git/HEAD" &&
mv .git/HEAD .git/SAVED_HEAD &&
echo 0000000000000000000000000000000000000000 >.git/HEAD &&
# avoid corrupt/broken HEAD from interfering with repo discovery
test_must_fail env GIT_DIR=.git git fsck 2>out &&
cat out &&
grep "detached HEAD points" out
'

test_expect_success 'HEAD link pointing at a funny place' '
test_when_finished "mv .git/SAVED_HEAD .git/HEAD" &&
mv .git/HEAD .git/SAVED_HEAD &&
echo "ref: refs/funny/place" >.git/HEAD &&
# avoid corrupt/broken HEAD from interfering with repo discovery
test_must_fail env GIT_DIR=.git git fsck 2>out &&
cat out &&
grep "HEAD points to something strange" out
'

test_expect_success 'email without @ is okay' '
git cat-file commit HEAD >basis &&
sed "s/@/AT/" basis >okay &&
Expand Down

0 comments on commit 1c7dc12

Please sign in to comment.