Merge branch 'sp/describe-tag'
authorJunio C Hamano <gitster@pobox.com>
Sun, 2 Mar 2008 23:19:59 +0000 (15:19 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 2 Mar 2008 23:19:59 +0000 (15:19 -0800)
* sp/describe-tag:
Teach git-describe to verify annotated tag names before output

Conflicts:

builtin-describe.c

1  2 
builtin-describe.c
diff --combined builtin-describe.c
index 2342913df622f6759fd45b58e5ee2899ade9fbfb,08d18507ac99a6c852f04d5b069857347dc5c0b8..2f1e7ba150098dfa85c8ffe009b318c22bedcbbd
@@@ -17,13 -17,14 +17,15 @@@ static const char * const describe_usag
  static int debug;     /* Display lots of verbose info */
  static int all;       /* Default to annotated tags only */
  static int tags;      /* But allow any tags if --tags is specified */
 +static int longformat;
  static int abbrev = DEFAULT_ABBREV;
  static int max_candidates = 10;
  const char *pattern = NULL;
  
  struct commit_name {
+       struct tag *tag;
        int prio; /* annotated tag = 2, tag = 1, head = 0 */
+       unsigned char sha1[20];
        char path[FLEX_ARRAY]; /* more */
  };
  static const char *prio_names[] = {
  
  static void add_to_known_names(const char *path,
                               struct commit *commit,
-                              int prio)
+                              int prio,
+                              const unsigned char *sha1)
  {
        struct commit_name *e = commit->util;
        if (!e || e->prio < prio) {
                size_t len = strlen(path)+1;
                free(e);
                e = xmalloc(sizeof(struct commit_name) + len);
+               e->tag = NULL;
                e->prio = prio;
+               hashcpy(e->sha1, sha1);
                memcpy(e->path, path, len);
                commit->util = e;
        }
@@@ -90,7 -94,7 +95,7 @@@ static int get_name(const char *path, c
                if (!tags && prio < 2)
                        return 0;
        }
-       add_to_known_names(all ? path + 5 : path + 10, commit, prio);
+       add_to_known_names(all ? path + 5 : path + 10, commit, prio, sha1);
        return 0;
  }
  
@@@ -147,6 -151,22 +152,25 @@@ static unsigned long finish_depth_compu
        return seen_commits;
  }
  
+ static void display_name(struct commit_name *n)
+ {
+       if (n->prio == 2 && !n->tag) {
+               n->tag = lookup_tag(n->sha1);
+               if (!n->tag || !n->tag->tag)
+                       die("annotated tag %s not available", n->path);
+               if (strcmp(n->tag->tag, n->path))
+                       warning("tag '%s' is really '%s' here", n->tag->tag, n->path);
+       }
+       if (n->tag)
+               printf("%s", n->tag->tag);
+       else
+               printf("%s", n->path);
++      if (longformat)
++              printf("-0-g%s",
++                     find_unique_abbrev(n->tag->tagged->sha1, abbrev));
+ }
  static void describe(const char *arg, int last_one)
  {
        unsigned char sha1[20];
  
        n = cmit->util;
        if (n) {
-               if (!longformat)
-                       printf("%s\n", n->path);
-               else
-                       printf("%s-0-g%s\n", n->path,
-                               find_unique_abbrev(cmit->object.sha1, abbrev));
+               display_name(n);
+               printf("\n");
                return;
        }
  
                                sha1_to_hex(gave_up_on->object.sha1));
                }
        }
-       if (abbrev == 0)
-               printf("%s\n", all_matches[0].name->path );
-       else
-               printf("%s-%d-g%s\n", all_matches[0].name->path,
-                      all_matches[0].depth,
+       display_name(all_matches[0].name);
+       if (abbrev)
+               printf("-%d-g%s", all_matches[0].depth,
                       find_unique_abbrev(cmit->object.sha1, abbrev));
+       printf("\n");
  
        if (!last_one)
                clear_commit_marks(cmit, -1);
@@@ -276,7 -293,6 +297,7 @@@ int cmd_describe(int argc, const char *
                OPT_BOOLEAN(0, "debug",      &debug, "debug search strategy on stderr"),
                OPT_BOOLEAN(0, "all",        &all, "use any ref in .git/refs"),
                OPT_BOOLEAN(0, "tags",       &tags, "use any tag in .git/refs/tags"),
 +              OPT_BOOLEAN(0, "long",       &longformat, "always use long format"),
                OPT__ABBREV(&abbrev),
                OPT_SET_INT(0, "exact-match", &max_candidates,
                            "only output exact matches", 0),
  
        save_commit_buffer = 0;
  
 +      if (longformat && abbrev == 0)
 +              die("--long is incompatible with --abbrev=0");
 +
        if (contains) {
                const char **args = xmalloc((6 + argc) * sizeof(char*));
                int i = 0;