Skip to content

Commit

Permalink
Teach git-describe to verify annotated tag names before output
Browse files Browse the repository at this point in the history
If an annotated tag describes a commit we want to favor the name
listed in the body of the tag, rather than whatever name it has
been stored under locally.  By doing so it is easier to converse
about tags with others, even if the tags happen to be fetched to
a different name than it was given by its creator.

To avoid confusion when a tag is stored under a different name
(and thus is not readable via git-rev-parse --verify, etc.) we show
a warning message if the name of the tag does not match the ref
we found it under and if that tag was also selected for output.
For example:

  $ git tag -a -m "i am a test" testtag
  $ mv .git/refs/tags/testtag .git/refs/tags/bobbytag

  $ ./git-describe HEAD
  warning: tag 'testtag' is really 'bobbytag' here
  testtag

  $ git tag -d testtag
  error: tag 'testtag' not found.
  $ git tag -d bobbytag
  Deleted tag 'bobbytag'

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Shawn O. Pearce authored and Junio C Hamano committed Feb 28, 2008
1 parent 6d21667 commit 212945d
Showing 1 changed file with 30 additions and 8 deletions.
38 changes: 30 additions & 8 deletions builtin-describe.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ 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[] = {
Expand All @@ -31,14 +33,17 @@ 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;
}
Expand Down Expand Up @@ -89,7 +94,7 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void
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;
}

Expand Down Expand Up @@ -146,6 +151,22 @@ static unsigned long finish_depth_computation(
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);
}

static void describe(const char *arg, int last_one)
{
unsigned char sha1[20];
Expand All @@ -170,7 +191,8 @@ static void describe(const char *arg, int last_one)

n = cmit->util;
if (n) {
printf("%s\n", n->path);
display_name(n);
printf("\n");
return;
}

Expand Down Expand Up @@ -252,12 +274,12 @@ static void describe(const char *arg, int last_one)
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);
Expand Down

0 comments on commit 212945d

Please sign in to comment.