@@ -257,9 +257,15 @@ static char *resolve_symref(const char *src, const char *prefix)
257257 return xstrdup (dst );
258258}
259259
260+ struct append_ref_cb {
261+ struct ref_list * ref_list ;
262+ int ret ;
263+ };
264+
260265static int append_ref (const char * refname , const unsigned char * sha1 , int flags , void * cb_data )
261266{
262- struct ref_list * ref_list = (struct ref_list * )(cb_data );
267+ struct append_ref_cb * cb = (struct append_ref_cb * )(cb_data );
268+ struct ref_list * ref_list = cb -> ref_list ;
263269 struct ref_item * newitem ;
264270 struct commit * commit ;
265271 int kind , i ;
@@ -293,8 +299,10 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
293299 commit = NULL ;
294300 if (ref_list -> verbose || ref_list -> with_commit || merge_filter != NO_FILTER ) {
295301 commit = lookup_commit_reference_gently (sha1 , 1 );
296- if (!commit )
297- return error ("branch '%s' does not point at a commit" , refname );
302+ if (!commit ) {
303+ cb -> ret = error ("branch '%s' does not point at a commit" , refname );
304+ return 0 ;
305+ }
298306
299307 /* Filter with with_commit if specified */
300308 if (!is_descendant_of (commit , ref_list -> with_commit ))
@@ -484,9 +492,10 @@ static void show_detached(struct ref_list *ref_list)
484492 }
485493}
486494
487- static void print_ref_list (int kinds , int detached , int verbose , int abbrev , struct commit_list * with_commit )
495+ static int print_ref_list (int kinds , int detached , int verbose , int abbrev , struct commit_list * with_commit )
488496{
489497 int i ;
498+ struct append_ref_cb cb ;
490499 struct ref_list ref_list ;
491500
492501 memset (& ref_list , 0 , sizeof (ref_list ));
@@ -496,7 +505,9 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev, str
496505 ref_list .with_commit = with_commit ;
497506 if (merge_filter != NO_FILTER )
498507 init_revisions (& ref_list .revs , NULL );
499- for_each_rawref (append_ref , & ref_list );
508+ cb .ref_list = & ref_list ;
509+ cb .ret = 0 ;
510+ for_each_rawref (append_ref , & cb );
500511 if (merge_filter != NO_FILTER ) {
501512 struct commit * filter ;
502513 filter = lookup_commit_reference_gently (merge_filter_ref , 0 );
@@ -527,6 +538,11 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev, str
527538 }
528539
529540 free_ref_list (& ref_list );
541+
542+ if (cb .ret )
543+ error ("some refs could not be read" );
544+
545+ return cb .ret ;
530546}
531547
532548static void rename_branch (const char * oldname , const char * newname , int force )
@@ -679,7 +695,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
679695 if (delete )
680696 return delete_branches (argc , argv , delete > 1 , kinds );
681697 else if (argc == 0 )
682- print_ref_list (kinds , detached , verbose , abbrev , with_commit );
698+ return print_ref_list (kinds , detached , verbose , abbrev , with_commit );
683699 else if (rename && (argc == 1 ))
684700 rename_branch (head , argv [0 ], rename > 1 );
685701 else if (rename && (argc == 2 ))
0 commit comments