summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2d9e7c9)
raw | patch | inline | side by side (parent: 2d9e7c9)
author | Junio C Hamano <junkio@cox.net> | |
Wed, 28 Dec 2005 00:09:37 +0000 (16:09 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 28 Dec 2005 01:57:27 +0000 (17:57 -0800) |
Even though --all and --tags can be used to include non
annotated tags in the reference point candidates, prefer to use
annotated tags if there are more than one refs that name the
same commit.
Signed-off-by: Junio C Hamano <junkio@cox.net>
annotated tags in the reference point candidates, prefer to use
annotated tags if there are more than one refs that name the
same commit.
Signed-off-by: Junio C Hamano <junkio@cox.net>
describe.c | patch | blob | history |
diff --git a/describe.c b/describe.c
index ee38f5f5d8791646cd6ca0f1d2570d793afa78a9..84d96b5b82bf5d1b688da39208077df5ca6ef6d9 100644 (file)
--- a/describe.c
+++ b/describe.c
static int names = 0, allocs = 0;
static struct commit_name {
const struct commit *commit;
+ int prio; /* annotated tag = 2, tag = 1, head = 0 */
char path[];
} **name_array = NULL;
return NULL;
}
-static void add_to_known_names(const char *path, const struct commit *commit)
+static void add_to_known_names(const char *path,
+ const struct commit *commit,
+ int prio)
{
int idx;
int len = strlen(path)+1;
struct commit_name *name = xmalloc(sizeof(struct commit_name) + len);
name->commit = commit;
+ name->prio = prio;
memcpy(name->path, path, len);
idx = names;
if (idx >= allocs) {
static int get_name(const char *path, const unsigned char *sha1)
{
struct commit *commit = lookup_commit_reference_gently(sha1, 1);
+ struct object *object;
+ int prio;
+
if (!commit)
return 0;
+ object = parse_object(sha1);
/* If --all, then any refs are used.
* If --tags, then any tags are used.
* Otherwise only annotated tags are used.
*/
+ if (!strncmp(path, "refs/tags/", 10)) {
+ if (object->type == tag_type)
+ prio = 2;
+ else
+ prio = 1;
+ }
+ else
+ prio = 0;
+
if (!all) {
- if (strncmp(path, "refs/tags/", 10))
+ if (!prio)
+ return 0;
+ if (!tags && prio < 2)
return 0;
- if (!tags) {
- struct object *object;
- object = parse_object(sha1);
- if (object->type != tag_type)
- return 0;
- }
}
- add_to_known_names(all ? path : path + 10, commit);
+ add_to_known_names(all ? path + 5 : path + 10, commit, prio);
return 0;
}
struct commit_name *b = *(struct commit_name **)_b;
unsigned long a_date = a->commit->date;
unsigned long b_date = b->commit->date;
+
+ if (a->prio != b->prio)
+ return b->prio - a->prio;
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}