From: Junio C Hamano Date: Sun, 2 Mar 2008 23:19:59 +0000 (-0800) Subject: Merge branch 'sp/describe-tag' X-Git-Tag: v1.5.5-rc0~86 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/b00ac8c729258f7117c74838133d57c40536b48b?ds=inline;hp=-c Merge branch 'sp/describe-tag' * sp/describe-tag: Teach git-describe to verify annotated tag names before output Conflicts: builtin-describe.c --- b00ac8c729258f7117c74838133d57c40536b48b diff --combined builtin-describe.c index 2342913df6,08d18507ac..2f1e7ba150 --- a/builtin-describe.c +++ b/builtin-describe.c @@@ -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[] = { @@@ -32,14 -33,17 +34,17 @@@ 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]; @@@ -171,11 -191,8 +195,8 @@@ 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; } @@@ -257,12 -274,12 +278,12 @@@ 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), @@@ -295,9 -311,6 +316,9 @@@ 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;