Merge branch 'kn/for-each-branch'
authorJunio C Hamano <gitster@pobox.com>
Tue, 3 Nov 2015 23:12:55 +0000 (15:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Nov 2015 23:12:57 +0000 (15:12 -0800)
Using the timestamp based criteria in "git branch --sort" did not
tiebreak branches that point at commits with the same timestamp (or
the same commit), making the resulting output unstable.

* kn/for-each-branch:
ref-filter: fallback on alphabetical comparison

1  2 
ref-filter.c
t/t3203-branch-output.sh
diff --combined ref-filter.c
index 1194f10ed60f2bb476e1d95d0cc11b4ad4265c7f,f9c9d3692c33c106d32a902279a5942b5eb812fa..e205dd2f689ee5aeafe6ea66343fd01b85d2e354
@@@ -343,7 -343,9 +343,7 @@@ static int grab_objectname(const char *
                            struct atom_value *v)
  {
        if (!strcmp(name, "objectname")) {
 -              char *s = xmalloc(41);
 -              strcpy(s, sha1_to_hex(sha1));
 -              v->s = s;
 +              v->s = xstrdup(sha1_to_hex(sha1));
                return 1;
        }
        if (!strcmp(name, "objectname:short")) {
@@@ -368,8 -370,10 +368,8 @@@ static void grab_common_values(struct a
                if (!strcmp(name, "objecttype"))
                        v->s = typename(obj->type);
                else if (!strcmp(name, "objectsize")) {
 -                      char *s = xmalloc(40);
 -                      sprintf(s, "%lu", sz);
                        v->ul = sz;
 -                      v->s = s;
 +                      v->s = xstrfmt("%lu", sz);
                }
                else if (deref)
                        grab_objectname(name, obj->sha1, v);
@@@ -393,8 -397,11 +393,8 @@@ static void grab_tag_values(struct atom
                        v->s = tag->tag;
                else if (!strcmp(name, "type") && tag->tagged)
                        v->s = typename(tag->tagged->type);
 -              else if (!strcmp(name, "object") && tag->tagged) {
 -                      char *s = xmalloc(41);
 -                      strcpy(s, sha1_to_hex(tag->tagged->sha1));
 -                      v->s = s;
 -              }
 +              else if (!strcmp(name, "object") && tag->tagged)
 +                      v->s = xstrdup(sha1_to_hex(tag->tagged->sha1));
        }
  }
  
@@@ -412,22 -419,32 +412,22 @@@ static void grab_commit_values(struct a
                if (deref)
                        name++;
                if (!strcmp(name, "tree")) {
 -                      char *s = xmalloc(41);
 -                      strcpy(s, sha1_to_hex(commit->tree->object.sha1));
 -                      v->s = s;
 +                      v->s = xstrdup(sha1_to_hex(commit->tree->object.sha1));
                }
 -              if (!strcmp(name, "numparent")) {
 -                      char *s = xmalloc(40);
 +              else if (!strcmp(name, "numparent")) {
                        v->ul = commit_list_count(commit->parents);
 -                      sprintf(s, "%lu", v->ul);
 -                      v->s = s;
 +                      v->s = xstrfmt("%lu", v->ul);
                }
                else if (!strcmp(name, "parent")) {
 -                      int num = commit_list_count(commit->parents);
 -                      int i;
                        struct commit_list *parents;
 -                      char *s = xmalloc(41 * num + 1);
 -                      v->s = s;
 -                      for (i = 0, parents = commit->parents;
 -                           parents;
 -                           parents = parents->next, i = i + 41) {
 +                      struct strbuf s = STRBUF_INIT;
 +                      for (parents = commit->parents; parents; parents = parents->next) {
                                struct commit *parent = parents->item;
 -                              strcpy(s+i, sha1_to_hex(parent->object.sha1));
 -                              if (parents->next)
 -                                      s[i+40] = ' ';
 +                              if (parents != commit->parents)
 +                                      strbuf_addch(&s, ' ');
 +                              strbuf_addstr(&s, sha1_to_hex(parent->object.sha1));
                        }
 -                      if (!i)
 -                              *s = '\0';
 +                      v->s = strbuf_detach(&s, NULL);
                }
        }
  }
@@@ -917,6 -934,7 +917,6 @@@ static void populate_value(struct ref_a
                        else if (!strcmp(formatp, "track") &&
                                 (starts_with(name, "upstream") ||
                                  starts_with(name, "push"))) {
 -                              char buf[40];
  
                                if (stat_tracking_info(branch, &num_ours,
                                                       &num_theirs, NULL))
  
                                if (!num_ours && !num_theirs)
                                        v->s = "";
 -                              else if (!num_ours) {
 -                                      sprintf(buf, "[behind %d]", num_theirs);
 -                                      v->s = xstrdup(buf);
 -                              } else if (!num_theirs) {
 -                                      sprintf(buf, "[ahead %d]", num_ours);
 -                                      v->s = xstrdup(buf);
 -                              } else {
 -                                      sprintf(buf, "[ahead %d, behind %d]",
 -                                              num_ours, num_theirs);
 -                                      v->s = xstrdup(buf);
 -                              }
 +                              else if (!num_ours)
 +                                      v->s = xstrfmt("[behind %d]", num_theirs);
 +                              else if (!num_theirs)
 +                                      v->s = xstrfmt("[ahead %d]", num_ours);
 +                              else
 +                                      v->s = xstrfmt("[ahead %d, behind %d]",
 +                                                     num_ours, num_theirs);
                                continue;
                        } else if (!strcmp(formatp, "trackshort") &&
                                   (starts_with(name, "upstream") ||
  
                if (!deref)
                        v->s = refname;
 -              else {
 -                      int len = strlen(refname);
 -                      char *s = xmalloc(len + 4);
 -                      sprintf(s, "%s^{}", refname);
 -                      v->s = s;
 -              }
 +              else
 +                      v->s = xstrfmt("%s^{}", refname);
        }
  
        for (i = 0; i < used_atom_cnt; i++) {
@@@ -1457,7 -1483,7 +1457,7 @@@ static int cmp_ref_sorting(struct ref_s
                if (va->ul < vb->ul)
                        cmp = -1;
                else if (va->ul == vb->ul)
-                       cmp = 0;
+                       cmp = strcmp(a->refname, b->refname);
                else
                        cmp = 1;
        }
diff --combined t/t3203-branch-output.sh
index 9454423ca02af98ad50a089e0c0dc2bc1e952bd0,2aa199607e193aac37a4d6d9a358fdd0c642be97..d3913f9088950a3ca848b8994abfddfecd3f6706
@@@ -106,19 -106,6 +106,19 @@@ EO
        test_i18ncmp expect actual
  '
  
 +test_expect_success 'git branch shows detached HEAD properly after checkout --detach' '
 +      git checkout master &&
 +      cat >expect <<EOF &&
 +* (HEAD detached at $(git rev-parse --short HEAD^0))
 +  branch-one
 +  branch-two
 +  master
 +EOF
 +      git checkout --detach &&
 +      git branch >actual &&
 +      test_i18ncmp expect actual
 +'
 +
  test_expect_success 'git branch shows detached HEAD properly after moving' '
        cat >expect <<EOF &&
  * (HEAD detached from $(git rev-parse --short HEAD))
@@@ -158,8 -145,8 +158,8 @@@ EO
  
  test_expect_success 'git branch `--sort` option' '
        cat >expect <<-\EOF &&
-         branch-two
        * (HEAD detached from fromtag)
+         branch-two
          branch-one
          master
        EOF