git-describe: still prefer annotated tag under --all and --tags
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>
This commit is contained in:
parent
2d9e7c9f90
commit
64deb858b0
32
describe.c
32
describe.c
@ -17,6 +17,7 @@ static int abbrev = DEFAULT_ABBREV;
|
|||||||
static int names = 0, allocs = 0;
|
static int names = 0, allocs = 0;
|
||||||
static struct commit_name {
|
static struct commit_name {
|
||||||
const struct commit *commit;
|
const struct commit *commit;
|
||||||
|
int prio; /* annotated tag = 2, tag = 1, head = 0 */
|
||||||
char path[];
|
char path[];
|
||||||
} **name_array = NULL;
|
} **name_array = NULL;
|
||||||
|
|
||||||
@ -33,13 +34,16 @@ static struct commit_name *match(struct commit *cmit)
|
|||||||
return 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 idx;
|
||||||
int len = strlen(path)+1;
|
int len = strlen(path)+1;
|
||||||
struct commit_name *name = xmalloc(sizeof(struct commit_name) + len);
|
struct commit_name *name = xmalloc(sizeof(struct commit_name) + len);
|
||||||
|
|
||||||
name->commit = commit;
|
name->commit = commit;
|
||||||
|
name->prio = prio;
|
||||||
memcpy(name->path, path, len);
|
memcpy(name->path, path, len);
|
||||||
idx = names;
|
idx = names;
|
||||||
if (idx >= allocs) {
|
if (idx >= allocs) {
|
||||||
@ -53,23 +57,32 @@ static void add_to_known_names(const char *path, const struct commit *commit)
|
|||||||
static int get_name(const char *path, const unsigned char *sha1)
|
static int get_name(const char *path, const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
struct commit *commit = lookup_commit_reference_gently(sha1, 1);
|
struct commit *commit = lookup_commit_reference_gently(sha1, 1);
|
||||||
|
struct object *object;
|
||||||
|
int prio;
|
||||||
|
|
||||||
if (!commit)
|
if (!commit)
|
||||||
return 0;
|
return 0;
|
||||||
|
object = parse_object(sha1);
|
||||||
/* If --all, then any refs are used.
|
/* If --all, then any refs are used.
|
||||||
* If --tags, then any tags are used.
|
* If --tags, then any tags are used.
|
||||||
* Otherwise only annotated 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 (!all) {
|
||||||
if (strncmp(path, "refs/tags/", 10))
|
if (!prio)
|
||||||
return 0;
|
return 0;
|
||||||
if (!tags) {
|
if (!tags && prio < 2)
|
||||||
struct object *object;
|
|
||||||
object = parse_object(sha1);
|
|
||||||
if (object->type != tag_type)
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
add_to_known_names(all ? path + 5 : path + 10, commit, prio);
|
||||||
add_to_known_names(all ? path : path + 10, commit);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,6 +92,9 @@ static int compare_names(const void *_a, const void *_b)
|
|||||||
struct commit_name *b = *(struct commit_name **)_b;
|
struct commit_name *b = *(struct commit_name **)_b;
|
||||||
unsigned long a_date = a->commit->date;
|
unsigned long a_date = a->commit->date;
|
||||||
unsigned long b_date = b->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;
|
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user