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))