X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-describe.c;h=ec404c839b6542deb4e15ca342fd3c0afbbedd2e;hb=5190d73d1e83d6ac982da2a793043c2b012fad40;hp=7a5ab012b1fabe3f67cd2d9bc776794e34431d80;hpb=d33046c1ed2182a4f73b741e47ab28b1570805c5;p=git.git diff --git a/builtin-describe.c b/builtin-describe.c index 7a5ab012b..ec404c839 100644 --- a/builtin-describe.c +++ b/builtin-describe.c @@ -10,7 +10,7 @@ #define MAX_TAGS (FLAG_BITS - 1) static const char * const describe_usage[] = { - "git-describe [options] *", + "git describe [options] *", NULL }; @@ -20,7 +20,8 @@ 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; +static const char *pattern; +static int always; struct commit_name { struct tag *tag; @@ -79,12 +80,13 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void * Otherwise only annotated tags are used. */ if (might_be_tag) { - if (is_tag) { + if (is_tag) prio = 2; - if (pattern && fnmatch(pattern, path + 10, 0)) - prio = 0; - } else + else prio = 1; + + if (pattern && fnmatch(pattern, path + 10, 0)) + prio = 0; } else prio = 0; @@ -202,7 +204,7 @@ static void describe(const char *arg, int last_one) */ display_name(n); if (longformat) - show_suffix(0, n->tag->tagged->sha1); + show_suffix(0, n->tag ? n->tag->tagged->sha1 : sha1); printf("\n"); return; } @@ -257,8 +259,14 @@ static void describe(const char *arg, int last_one) } } - if (!match_cnt) - die("cannot describe '%s'", sha1_to_hex(cmit->object.sha1)); + if (!match_cnt) { + const unsigned char *sha1 = cmit->object.sha1; + if (always) { + printf("%s\n", find_unique_abbrev(sha1, abbrev)); + return; + } + die("cannot describe '%s'", sha1_to_hex(sha1)); + } qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt); @@ -311,6 +319,8 @@ int cmd_describe(int argc, const char **argv, const char *prefix) "consider most recent tags (default: 10)"), OPT_STRING(0, "match", &pattern, "pattern", "only consider tags matching "), + OPT_BOOLEAN(0, "always", &always, + "show abbreviated commit object as fallback"), OPT_END(), }; @@ -326,11 +336,13 @@ int cmd_describe(int argc, const char **argv, const char *prefix) die("--long is incompatible with --abbrev=0"); if (contains) { - const char **args = xmalloc((6 + argc) * sizeof(char*)); + const char **args = xmalloc((7 + argc) * sizeof(char*)); int i = 0; args[i++] = "name-rev"; args[i++] = "--name-only"; args[i++] = "--no-undefined"; + if (always) + args[i++] = "--always"; if (!all) { args[i++] = "--tags"; if (pattern) {