From: Junio C Hamano Date: Mon, 21 Jun 2010 13:02:47 +0000 (-0700) Subject: Merge branch 'sm/branch-broken-ref' X-Git-Tag: v1.7.2-rc0~25 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/1623191be4ec91b3d2fb5ef85b1e77b7adef24af?hp=-c Merge branch 'sm/branch-broken-ref' * sm/branch-broken-ref: branch: don't fail listing branches if one of the commits wasn't found branch: exit status now reflects if branch listing finds an error --- 1623191be4ec91b3d2fb5ef85b1e77b7adef24af diff --combined builtin/branch.c index f594af0b3b,a92de9a066..87976f0921 --- a/builtin/branch.c +++ b/builtin/branch.c @@@ -43,13 -43,13 +43,13 @@@ enum color_branch BRANCH_COLOR_PLAIN = 1, BRANCH_COLOR_REMOTE = 2, BRANCH_COLOR_LOCAL = 3, - BRANCH_COLOR_CURRENT = 4, + BRANCH_COLOR_CURRENT = 4 }; static enum merge_filter { NO_FILTER = 0, SHOW_NOT_MERGED, - SHOW_MERGED, + SHOW_MERGED } merge_filter; static unsigned char merge_filter_ref[20]; @@@ -257,9 -257,15 +257,15 @@@ static char *resolve_symref(const char return xstrdup(dst); } + struct append_ref_cb { + struct ref_list *ref_list; + int ret; + }; + static int append_ref(const char *refname, const unsigned char *sha1, int flags, void *cb_data) { - struct ref_list *ref_list = (struct ref_list*)(cb_data); + struct append_ref_cb *cb = (struct append_ref_cb *)(cb_data); + struct ref_list *ref_list = cb->ref_list; struct ref_item *newitem; struct commit *commit; int kind, i; @@@ -293,8 -299,10 +299,10 @@@ commit = NULL; if (ref_list->verbose || ref_list->with_commit || merge_filter != NO_FILTER) { commit = lookup_commit_reference_gently(sha1, 1); - if (!commit) - return error("branch '%s' does not point at a commit", refname); + if (!commit) { + cb->ret = error("branch '%s' does not point at a commit", refname); + return 0; + } /* Filter with with_commit if specified */ if (!is_descendant_of(commit, ref_list->with_commit)) @@@ -484,9 -492,10 +492,10 @@@ static void show_detached(struct ref_li } } - static void print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit) + static int print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit) { int i; + struct append_ref_cb cb; struct ref_list ref_list; memset(&ref_list, 0, sizeof(ref_list)); @@@ -496,7 -505,9 +505,9 @@@ ref_list.with_commit = with_commit; if (merge_filter != NO_FILTER) init_revisions(&ref_list.revs, NULL); - for_each_rawref(append_ref, &ref_list); + cb.ref_list = &ref_list; + cb.ret = 0; + for_each_rawref(append_ref, &cb); if (merge_filter != NO_FILTER) { struct commit *filter; filter = lookup_commit_reference_gently(merge_filter_ref, 0); @@@ -527,6 -538,11 +538,11 @@@ } free_ref_list(&ref_list); + + if (cb.ret) + error("some refs could not be read"); + + return cb.ret; } static void rename_branch(const char *oldname, const char *newname, int force) @@@ -679,7 -695,7 +695,7 @@@ int cmd_branch(int argc, const char **a if (delete) return delete_branches(argc, argv, delete > 1, kinds); else if (argc == 0) - print_ref_list(kinds, detached, verbose, abbrev, with_commit); + return print_ref_list(kinds, detached, verbose, abbrev, with_commit); else if (rename && (argc == 1)) rename_branch(head, argv[0], rename > 1); else if (rename && (argc == 2))