Skip to content

Commit

Permalink
describe --always: fall back to showing an abbreviated object name
Browse files Browse the repository at this point in the history
Some callers may find it useful if "git describe" always gave back a
string that can be used as a shorter name for a commit object, rather than
checking its exit status (while squelching its error message, which could
potentially talk about more grave errors that should not be squelched) and
implementing a fallback themselves.

This teaches describe/name-rev a new option, --always, to use an
abbreviated object name when no tags or refs to use is found.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Mar 3, 2008
1 parent 34cd62e commit da2478d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 32 deletions.
17 changes: 14 additions & 3 deletions builtin-describe.c
Expand Up @@ -21,6 +21,7 @@ static int longformat;
static int abbrev = DEFAULT_ABBREV;
static int max_candidates = 10;
const char *pattern = NULL;
static int always;

struct commit_name {
struct tag *tag;
Expand Down Expand Up @@ -250,8 +251,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);

Expand Down Expand Up @@ -305,6 +312,8 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
"consider <n> most recent tags (default: 10)"),
OPT_STRING(0, "match", &pattern, "pattern",
"only consider tags matching <pattern>"),
OPT_BOOLEAN(0, "always", &always,
"show abbreviated commit object as fallback"),
OPT_END(),
};

Expand All @@ -320,11 +329,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) {
Expand Down
59 changes: 30 additions & 29 deletions builtin-name-rev.c
Expand Up @@ -125,7 +125,7 @@ static int name_ref(const char *path, const unsigned char *sha1, int flags, void
}

/* returns a static buffer */
static const char *get_rev_name(struct object *o)
static const char *get_rev_name(const struct object *o)
{
static char buffer[1024];
struct rev_name *n;
Expand All @@ -151,6 +151,26 @@ static const char *get_rev_name(struct object *o)
}
}

static void show_name(const struct object *obj,
const char *caller_name,
int always, int allow_undefined, int name_only)
{
const char *name;
const unsigned char *sha1 = obj->sha1;

if (!name_only)
printf("%s ", caller_name ? caller_name : sha1_to_hex(sha1));
name = get_rev_name(obj);
if (name)
printf("%s\n", name);
else if (allow_undefined)
printf("undefined\n");
else if (always)
printf("%s\n", find_unique_abbrev(sha1, DEFAULT_ABBREV));
else
die("cannot describe '%s'", sha1_to_hex(sha1));
}

static char const * const name_rev_usage[] = {
"git-name-rev [options] ( --all | --stdin | <commit>... )",
NULL
Expand All @@ -159,7 +179,7 @@ static char const * const name_rev_usage[] = {
int cmd_name_rev(int argc, const char **argv, const char *prefix)
{
struct object_array revs = { 0, 0, NULL };
int all = 0, transform_stdin = 0, allow_undefined = 1;
int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0;
struct name_ref_data data = { 0, 0, NULL };
struct option opts[] = {
OPT_BOOLEAN(0, "name-only", &data.name_only, "print only names (no SHA-1)"),
Expand All @@ -170,6 +190,8 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
OPT_BOOLEAN(0, "all", &all, "list all commits reachable from all refs"),
OPT_BOOLEAN(0, "stdin", &transform_stdin, "read from stdin"),
OPT_BOOLEAN(0, "undefined", &allow_undefined, "allow to print `undefined` names"),
OPT_BOOLEAN(0, "always", &always,
"show abbreviated commit object as fallback"),
OPT_END(),
};

Expand Down Expand Up @@ -258,35 +280,14 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
int i, max;

max = get_max_object_index();
for (i = 0; i < max; i++) {
struct object * obj = get_indexed_object(i);
const char *name;
if (!obj)
continue;
if (!data.name_only)
printf("%s ", sha1_to_hex(obj->sha1));
name = get_rev_name(obj);
if (name)
printf("%s\n", name);
else if (allow_undefined)
printf("undefined\n");
else
die("cannot describe '%s'", sha1_to_hex(obj->sha1));
}
for (i = 0; i < max; i++)
show_name(get_indexed_object(i), NULL,
always, allow_undefined, data.name_only);
} else {
int i;
for (i = 0; i < revs.nr; i++) {
const char *name;
if (!data.name_only)
printf("%s ", revs.objects[i].name);
name = get_rev_name(revs.objects[i].item);
if (name)
printf("%s\n", name);
else if (allow_undefined)
printf("undefined\n");
else
die("cannot describe '%s'", sha1_to_hex(revs.objects[i].item->sha1));
}
for (i = 0; i < revs.nr; i++)
show_name(revs.objects[i].item, revs.objects[i].name,
always, allow_undefined, data.name_only);
}

return 0;
Expand Down

0 comments on commit da2478d

Please sign in to comment.