Skip to content

Commit 469e2eb

Browse files
committed
fsck: HEAD is part of refs
By default we looked at all refs but not HEAD. The only thing that made fsck not lose sight of commits that are only reachable from a detached HEAD was the reflog for the HEAD. This fixes it, with a new test. Signed-off-by: Junio C Hamano <[email protected]>
1 parent a34a9db commit 469e2eb

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

builtin-fsck.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ static int check_full;
2323
static int check_strict;
2424
static int keep_cache_objects;
2525
static unsigned char head_sha1[20];
26+
static const char *head_points_at;
2627
static int errors_found;
2728
static int write_lost_and_found;
2829
static int verbose;
@@ -473,6 +474,8 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
473474

474475
static void get_default_heads(void)
475476
{
477+
if (head_points_at && !is_null_sha1(head_sha1))
478+
fsck_handle_ref("HEAD", head_sha1, 0, NULL);
476479
for_each_ref(fsck_handle_ref, NULL);
477480
if (include_reflogs)
478481
for_each_reflog(fsck_handle_reflog, NULL);
@@ -512,14 +515,13 @@ static void fsck_object_dir(const char *path)
512515

513516
static int fsck_head_link(void)
514517
{
515-
unsigned char sha1[20];
516518
int flag;
517519
int null_is_error = 0;
518-
const char *head_points_at = resolve_ref("HEAD", sha1, 0, &flag);
519520

520521
if (verbose)
521522
fprintf(stderr, "Checking HEAD link\n");
522523

524+
head_points_at = resolve_ref("HEAD", head_sha1, 0, &flag);
523525
if (!head_points_at)
524526
return error("Invalid HEAD");
525527
if (!strcmp(head_points_at, "HEAD"))
@@ -528,7 +530,7 @@ static int fsck_head_link(void)
528530
else if (prefixcmp(head_points_at, "refs/heads/"))
529531
return error("HEAD points to something strange (%s)",
530532
head_points_at);
531-
if (is_null_sha1(sha1)) {
533+
if (is_null_sha1(head_sha1)) {
532534
if (null_is_error)
533535
return error("HEAD: detached HEAD points at nothing");
534536
fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n",
@@ -624,8 +626,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
624626
heads = 0;
625627
for (i = 0; i < argc; i++) {
626628
const char *arg = argv[i];
627-
if (!get_sha1(arg, head_sha1)) {
628-
struct object *obj = lookup_object(head_sha1);
629+
unsigned char sha1[20];
630+
if (!get_sha1(arg, sha1)) {
631+
struct object *obj = lookup_object(sha1);
629632

630633
/* Error is printed by lookup_object(). */
631634
if (!obj)

t/t1450-fsck.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/sh
2+
3+
test_description='git fsck random collection of tests'
4+
5+
. ./test-lib.sh
6+
7+
test_expect_success setup '
8+
test_commit A fileA one &&
9+
git checkout HEAD^0 &&
10+
test_commit B fileB two &&
11+
git tag -d A B &&
12+
git reflog expire --expire=now --all
13+
'
14+
15+
test_expect_success 'HEAD is part of refs' '
16+
test 0 = $(git fsck | wc -l)
17+
'
18+
19+
test_done

0 commit comments

Comments
 (0)