@matheusbsbs / matheus-bagliano / commits / 1603ade813
Fork 0

branch: exit status now reflects if branch listing finds an error

If some refs could not be read when listing branches, this can now be observed in the exit status of the "git branch" command. Signed-off-by: Simo Melenius <simo.melenius@iki.fi> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Simo Melenius committed Jun 4, 2010 at 12:50 UTC 1603ade81352a526ccb206f41ff81ecbc855df2d
1 file changed +19 -6
builtin/branch.c
+19 -6
@@ -257,9 +257,15 @@ static char *resolve_symref(const char *src, const char *prefix)
257 return xstrdup(dst);
258 }
259
260 +struct append_ref_cb {
261 + struct ref_list *ref_list;
262 + int ret;
263 +};
264 +
265 static int append_ref(const char *refname, const unsigned char *sha1, int flags, void *cb_data)
266 {
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;
269 struct ref_item *newitem;
270 struct commit *commit;
271 int kind, i;
@@ -293,8 +299,10 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
299 commit = NULL;
300 if (ref_list->verbose || ref_list->with_commit || merge_filter != NO_FILTER) {
301 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 cb->ret;
305 + }
306
307 /* Filter with with_commit if specified */
308 if (!is_descendant_of(commit, ref_list->with_commit))
@@ -484,9 +492,10 @@ static void show_detached(struct ref_list *ref_list)
492 }
493 }
494
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)
496 {
497 int i;
498 + struct append_ref_cb cb;
499 struct ref_list ref_list;
500
501 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
505 ref_list.with_commit = with_commit;
506 if (merge_filter != NO_FILTER)
507 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);
511 if (merge_filter != NO_FILTER) {
512 struct commit *filter;
513 filter = lookup_commit_reference_gently(merge_filter_ref, 0);
@@ -527,6 +538,8 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev, str
538 }
539
540 free_ref_list(&ref_list);
541 +
542 + return cb.ret;
543 }
544
545 static void rename_branch(const char *oldname, const char *newname, int force)
@@ -679,7 +692,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
692 if (delete)
693 return delete_branches(argc, argv, delete > 1, kinds);
694 else if (argc == 0)
682 - print_ref_list(kinds, detached, verbose, abbrev, with_commit);
695 + return print_ref_list(kinds, detached, verbose, abbrev, with_commit);
696 else if (rename && (argc == 1))
697 rename_branch(head, argv[0], rename > 1);
698 else if (rename && (argc == 2))