diff --git a/Documentation/fsck-msgids.adoc b/Documentation/fsck-msgids.adoc index acac9683af..76609321f6 100644 --- a/Documentation/fsck-msgids.adoc +++ b/Documentation/fsck-msgids.adoc @@ -41,6 +41,9 @@ `badRefName`:: (ERROR) A ref has an invalid format. +`badRefOid`:: + (ERROR) A ref points to an invalid object ID. + `badReferentName`:: (ERROR) The referent name of a symref is invalid. diff --git a/builtin/fsck.c b/builtin/fsck.c index 4979bc795e..4dd4d74d1e 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -564,9 +564,9 @@ static int fsck_handle_ref(const struct reference *ref, void *cb_data UNUSED) return 0; } -static int fsck_head_link(const char *head_ref_name, - const char **head_points_at, - struct object_id *head_oid); +static void fsck_head_link(const char *head_ref_name, + const char **head_points_at, + struct object_id *head_oid); static void get_default_heads(void) { @@ -713,12 +713,10 @@ static void fsck_source(struct odb_source *source) stop_progress(&progress); } -static int fsck_head_link(const char *head_ref_name, - const char **head_points_at, - struct object_id *head_oid) +static void fsck_head_link(const char *head_ref_name, + const char **head_points_at, + struct object_id *head_oid) { - int null_is_error = 0; - if (verbose) fprintf_ln(stderr, _("Checking %s link"), head_ref_name); @@ -727,27 +725,18 @@ static int fsck_head_link(const char *head_ref_name, NULL); if (!*head_points_at) { errors_found |= ERROR_REFS; - return error(_("invalid %s"), head_ref_name); + error(_("invalid %s"), head_ref_name); + return; } - if (!strcmp(*head_points_at, head_ref_name)) - /* detached HEAD */ - null_is_error = 1; - else if (!starts_with(*head_points_at, "refs/heads/")) { + if (strcmp(*head_points_at, head_ref_name) && + !starts_with(*head_points_at, "refs/heads/")) { errors_found |= ERROR_REFS; - return error(_("%s points to something strange (%s)"), - head_ref_name, *head_points_at); + error(_("%s points to something strange (%s)"), + head_ref_name, *head_points_at); + return; } - if (is_null_oid(head_oid)) { - if (null_is_error) { - errors_found |= ERROR_REFS; - return error(_("%s: detached HEAD points at nothing"), - head_ref_name); - } - fprintf_ln(stderr, - _("notice: %s points to an unborn branch (%s)"), - head_ref_name, *head_points_at + 11); - } - return 0; + + return; } static int fsck_cache_tree(struct cache_tree *it, const char *index_path) diff --git a/fsck.h b/fsck.h index bfe0d9c6d2..1f472b7daa 100644 --- a/fsck.h +++ b/fsck.h @@ -39,6 +39,7 @@ enum fsck_msg_type { FUNC(BAD_REF_CONTENT, ERROR) \ FUNC(BAD_REF_FILETYPE, ERROR) \ FUNC(BAD_REF_NAME, ERROR) \ + FUNC(BAD_REF_OID, ERROR) \ FUNC(BAD_TIMEZONE, ERROR) \ FUNC(BAD_TREE, ERROR) \ FUNC(BAD_TREE_SHA1, ERROR) \ diff --git a/refs.c b/refs.c index 4fc1317cb3..c3528862c6 100644 --- a/refs.c +++ b/refs.c @@ -320,10 +320,15 @@ int check_refname_format(const char *refname, int flags) return check_or_sanitize_refname(refname, flags, NULL); } -int refs_fsck_ref(struct ref_store *refs UNUSED, struct fsck_options *o UNUSED, - struct fsck_ref_report *report UNUSED, - const char *refname UNUSED, const struct object_id *oid UNUSED) +int refs_fsck_ref(struct ref_store *refs UNUSED, struct fsck_options *o, + struct fsck_ref_report *report, + const char *refname UNUSED, const struct object_id *oid) { + if (is_null_oid(oid)) + return fsck_report_ref(o, report, FSCK_MSG_BAD_REF_OID, + "points to invalid object ID '%s'", + oid_to_hex(oid)); + return 0; } diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index c4b651c2dc..900c1b2eb2 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -105,7 +105,7 @@ test_expect_success REFFILES 'HEAD link pointing at a funny object' ' echo $ZERO_OID >.git/HEAD && # avoid corrupt/broken HEAD from interfering with repo discovery test_must_fail env GIT_DIR=.git git fsck 2>out && - test_grep "detached HEAD points" out + test_grep "HEAD: badRefOid: points to invalid object ID ${SQ}$ZERO_OID${SQ}" out ' test_expect_success 'HEAD link pointing at a funny place' ' @@ -123,7 +123,7 @@ test_expect_success REFFILES 'HEAD link pointing at a funny object (from differe echo $ZERO_OID >.git/HEAD && # avoid corrupt/broken HEAD from interfering with repo discovery test_must_fail git -C wt fsck 2>out && - test_grep "main-worktree/HEAD: detached HEAD points" out + test_grep "HEAD: badRefOid: points to invalid object ID ${SQ}$ZERO_OID${SQ}" out ' test_expect_success REFFILES 'other worktree HEAD link pointing at a funny object' ' @@ -131,7 +131,7 @@ test_expect_success REFFILES 'other worktree HEAD link pointing at a funny objec git worktree add other && echo $ZERO_OID >.git/worktrees/other/HEAD && test_must_fail git fsck 2>out && - test_grep "worktrees/other/HEAD: detached HEAD points" out + test_grep "worktrees/other/HEAD: badRefOid: points to invalid object ID ${SQ}$ZERO_OID${SQ}" out ' test_expect_success 'other worktree HEAD link pointing at missing object' '