summaryrefslogtreecommitdiff
path: root/builtin-describe.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin-describe.c')
-rw-r--r--builtin-describe.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/builtin-describe.c b/builtin-describe.c
index ad672aa8ee..582ef023f7 100644
--- a/builtin-describe.c
+++ b/builtin-describe.c
@@ -12,20 +12,20 @@ static const char describe_usage[] =
static int all; /* Default to annotated tags only */
static int tags; /* But allow any tags if --tags is specified */
-
static int abbrev = DEFAULT_ABBREV;
-static int names, allocs;
+static unsigned int names[256], allocs[256];
static struct commit_name {
struct commit *commit;
int prio; /* annotated tag = 2, tag = 1, head = 0 */
char path[FLEX_ARRAY]; /* more */
-} **name_array = NULL;
+} **name_array[256];
static struct commit_name *match(struct commit *cmit)
{
- int i = names;
- struct commit_name **p = name_array;
+ unsigned char m = cmit->object.sha1[0];
+ unsigned int i = names[m];
+ struct commit_name **p = name_array[m];
while (i-- > 0) {
struct commit_name *n = *p++;
@@ -42,17 +42,19 @@ static void add_to_known_names(const char *path,
int idx;
int len = strlen(path)+1;
struct commit_name *name = xmalloc(sizeof(struct commit_name) + len);
+ unsigned char m = commit->object.sha1[0];
name->commit = commit;
name->prio = prio;
memcpy(name->path, path, len);
- idx = names;
- if (idx >= allocs) {
- allocs = (idx + 50) * 3 / 2;
- name_array = xrealloc(name_array, allocs*sizeof(*name_array));
+ idx = names[m];
+ if (idx >= allocs[m]) {
+ allocs[m] = (idx + 50) * 3 / 2;
+ name_array[m] = xrealloc(name_array[m],
+ allocs[m] * sizeof(*name_array));
}
- name_array[idx] = name;
- names = ++idx;
+ name_array[m][idx] = name;
+ names[m] = ++idx;
}
static int get_name(const char *path, const unsigned char *sha1, int flag, void *cb_data)
@@ -121,9 +123,12 @@ static void describe(const char *arg, int last_one)
die("%s is not a valid '%s' object", arg, commit_type);
if (!initialized) {
+ unsigned int m;
initialized = 1;
for_each_ref(get_name, NULL);
- qsort(name_array, names, sizeof(*name_array), compare_names);
+ for (m = 0; m < ARRAY_SIZE(name_array); m++)
+ qsort(name_array[m], names[m],
+ sizeof(*name_array[m]), compare_names);
}
n = match(cmit);