Merge branch 'rc/for-each-ref-tracking'
authorJunio C Hamano <gitster@pobox.com>
Wed, 14 Jan 2015 20:39:02 +0000 (12:39 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Jan 2015 20:39:02 +0000 (12:39 -0800)
* rc/for-each-ref-tracking:
for-each-ref: always check stat_tracking_info()'s return value

1  2 
builtin/for-each-ref.c
diff --combined builtin/for-each-ref.c
index f3ce004d53c55e3f53d6a90d21d2877368676f08,edf9c3c744a01b46337d7503a46b5686be795ed4..a0123f6146b53de295d01b438b72fb3dc7d76a0c
@@@ -138,8 -138,10 +138,8 @@@ static int parse_atom(const char *atom
        /* Add it in, including the deref prefix */
        at = used_atom_cnt;
        used_atom_cnt++;
 -      used_atom = xrealloc(used_atom,
 -                           (sizeof *used_atom) * used_atom_cnt);
 -      used_atom_type = xrealloc(used_atom_type,
 -                                (sizeof(*used_atom_type) * used_atom_cnt));
 +      REALLOC_ARRAY(used_atom, used_atom_cnt);
 +      REALLOC_ARRAY(used_atom_type, used_atom_cnt);
        used_atom[at] = xmemdupz(atom, ep - atom);
        used_atom_type[at] = valid_atom[i].cmp_type;
        if (*atom == '*')
@@@ -191,7 -193,7 +191,7 @@@ static int verify_format(const char *fo
                at = parse_atom(sp + 2, ep);
                cp = ep + 1;
  
 -              if (!memcmp(used_atom[at], "color:", 6))
 +              if (starts_with(used_atom[at], "color:"))
                        need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset);
        }
        return 0;
@@@ -281,6 -283,18 +281,6 @@@ static void grab_tag_values(struct atom
        }
  }
  
 -static int num_parents(struct commit *commit)
 -{
 -      struct commit_list *parents;
 -      int i;
 -
 -      for (i = 0, parents = commit->parents;
 -           parents;
 -           parents = parents->next)
 -              i++;
 -      return i;
 -}
 -
  /* See grab_values */
  static void grab_commit_values(struct atom_value *val, int deref, struct object *obj, void *buf, unsigned long sz)
  {
                }
                if (!strcmp(name, "numparent")) {
                        char *s = xmalloc(40);
 -                      v->ul = num_parents(commit);
 +                      v->ul = commit_list_count(commit->parents);
                        sprintf(s, "%lu", v->ul);
                        v->s = s;
                }
                else if (!strcmp(name, "parent")) {
 -                      int num = num_parents(commit);
 +                      int num = commit_list_count(commit->parents);
                        int i;
                        struct commit_list *parents;
                        char *s = xmalloc(41 * num + 1);
@@@ -631,12 -645,11 +631,12 @@@ static void populate_value(struct refin
        unsigned long size;
        const unsigned char *tagged;
  
 -      ref->value = xcalloc(sizeof(struct atom_value), used_atom_cnt);
 +      ref->value = xcalloc(used_atom_cnt, sizeof(struct atom_value));
  
        if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
                unsigned char unused1[20];
 -              ref->symref = resolve_refdup(ref->refname, unused1, 1, NULL);
 +              ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING,
 +                                           unused1, NULL);
                if (!ref->symref)
                        ref->symref = "";
        }
                } else if (starts_with(name, "color:")) {
                        char color[COLOR_MAXLEN] = "";
  
 -                      color_parse(name + 6, "--format", color);
 +                      if (color_parse(name + 6, color) < 0)
 +                              die(_("unable to parse format"));
                        v->s = xstrdup(color);
                        continue;
                } else if (!strcmp(name, "flag")) {
                        const char *head;
                        unsigned char sha1[20];
  
 -                      head = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
 +                      head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
 +                                                sha1, NULL);
                        if (!strcmp(ref->refname, head))
                                v->s = "*";
                        else
                                 starts_with(name, "upstream")) {
                                char buf[40];
  
-                               stat_tracking_info(branch, &num_ours, &num_theirs);
+                               if (stat_tracking_info(branch, &num_ours,
+                                                      &num_theirs) != 1)
+                                       continue;
                                if (!num_ours && !num_theirs)
                                        v->s = "";
                                else if (!num_ours) {
                        } else if (!strcmp(formatp, "trackshort") &&
                                   starts_with(name, "upstream")) {
                                assert(branch);
-                               stat_tracking_info(branch, &num_ours, &num_theirs);
+                               if (stat_tracking_info(branch, &num_ours,
+                                                       &num_theirs) != 1)
+                                       continue;
                                if (!num_ours && !num_theirs)
                                        v->s = "=";
                                else if (!num_ours)
@@@ -840,11 -858,6 +847,11 @@@ static int grab_single_ref(const char *
        struct refinfo *ref;
        int cnt;
  
 +      if (flag & REF_BAD_NAME) {
 +                warning("ignoring ref with broken name %s", refname);
 +                return 0;
 +      }
 +
        if (*cb->grab_pattern) {
                const char **pattern;
                int namelen = strlen(refname);
        ref->flag = flag;
  
        cnt = cb->grab_cnt;
 -      cb->grab_array = xrealloc(cb->grab_array,
 -                                sizeof(*cb->grab_array) * (cnt + 1));
 +      REALLOC_ARRAY(cb->grab_array, cnt + 1);
        cb->grab_array[cnt++] = ref;
        cb->grab_cnt = cnt;
        return 0;
@@@ -1012,8 -1026,7 +1019,8 @@@ static void show_ref(struct refinfo *in
                struct atom_value resetv;
                char color[COLOR_MAXLEN] = "";
  
 -              color_parse("reset", "--format", color);
 +              if (color_parse("reset", color) < 0)
 +                      die("BUG: couldn't parse 'reset' as a color");
                resetv.s = color;
                print_value(&resetv, quote_style);
        }
@@@ -1075,7 -1088,7 +1082,7 @@@ int cmd_for_each_ref(int argc, const ch
                OPT_BIT(0 , "python", &quote_style,
                        N_("quote placeholders suitably for python"), QUOTE_PYTHON),
                OPT_BIT(0 , "tcl",  &quote_style,
 -                      N_("quote placeholders suitably for tcl"), QUOTE_TCL),
 +                      N_("quote placeholders suitably for Tcl"), QUOTE_TCL),
  
                OPT_GROUP(""),
                OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")),