Code

Merge branch 'sm/branch-broken-ref'
authorJunio C Hamano <gitster@pobox.com>
Mon, 21 Jun 2010 13:02:47 +0000 (06:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Jun 2010 13:02:47 +0000 (06:02 -0700)
* 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

1  2 
builtin/branch.c

diff --combined builtin/branch.c
index f594af0b3b88e5c44545022fb8ed66cb8e302fe0,a92de9a066892ef98c7a33232c83532edf94973a..87976f0921d87f2a8564eb54aa3b81d30ee7f214
@@@ -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;
        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));
        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);
        }
  
        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))