@@ -23,6 +23,7 @@ static int check_full;
2323static int check_strict ;
2424static int keep_cache_objects ;
2525static unsigned char head_sha1 [20 ];
26+ static const char * head_points_at ;
2627static int errors_found ;
2728static int write_lost_and_found ;
2829static int verbose ;
@@ -473,6 +474,8 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
473474
474475static 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
513516static 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" ,
@@ -584,6 +586,7 @@ static struct option fsck_opts[] = {
584586int cmd_fsck (int argc , const char * * argv , const char * prefix )
585587{
586588 int i , heads ;
589+ struct alternate_object_database * alt ;
587590
588591 errors_found = 0 ;
589592
@@ -595,17 +598,19 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
595598
596599 fsck_head_link ();
597600 fsck_object_dir (get_object_directory ());
601+
602+ prepare_alt_odb ();
603+ for (alt = alt_odb_list ; alt ; alt = alt -> next ) {
604+ char namebuf [PATH_MAX ];
605+ int namelen = alt -> name - alt -> base ;
606+ memcpy (namebuf , alt -> base , namelen );
607+ namebuf [namelen - 1 ] = 0 ;
608+ fsck_object_dir (namebuf );
609+ }
610+
598611 if (check_full ) {
599- struct alternate_object_database * alt ;
600612 struct packed_git * p ;
601- prepare_alt_odb ();
602- for (alt = alt_odb_list ; alt ; alt = alt -> next ) {
603- char namebuf [PATH_MAX ];
604- int namelen = alt -> name - alt -> base ;
605- memcpy (namebuf , alt -> base , namelen );
606- namebuf [namelen - 1 ] = 0 ;
607- fsck_object_dir (namebuf );
608- }
613+
609614 prepare_packed_git ();
610615 for (p = packed_git ; p ; p = p -> next )
611616 /* verify gives error messages itself */
@@ -624,8 +629,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
624629 heads = 0 ;
625630 for (i = 0 ; i < argc ; i ++ ) {
626631 const char * arg = argv [i ];
627- if (!get_sha1 (arg , head_sha1 )) {
628- struct object * obj = lookup_object (head_sha1 );
632+ unsigned char sha1 [20 ];
633+ if (!get_sha1 (arg , sha1 )) {
634+ struct object * obj = lookup_object (sha1 );
629635
630636 /* Error is printed by lookup_object(). */
631637 if (!obj )
0 commit comments