aboutsummaryrefslogtreecommitdiffstats
path: root/oid-array.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2023-10-01 21:40:06 -0500
committerJunio C Hamano <gitster@pobox.com>2023-10-02 14:57:38 -0700
commitd50cbe4a5d989c454c620cbaa0c64a06a4a2f9a2 (patch)
tree7107b01f91721267c31652737d50906440d3c8d8 /oid-array.c
parent5e9d802a33ef2912a04984d431defe9809c809e1 (diff)
downloadgit-d50cbe4a5d989c454c620cbaa0c64a06a4a2f9a2.tar.gz
oid-array: teach oid-array to handle multiple kinds of oids
While looking at how to handle input of both SHA-1 and SHA-256 oids in get_oid_with_context, I realized that the oid_array in repo_for_each_abbrev might have more than one kind of oid stored in it simultaneously. Update to oid_array_append to ensure that oids added to an oid array always have an algorithm set. Update void_hashcmp to first verify two oids use the same hash algorithm before comparing them to each other. With that oid-array should be safe to use with different kinds of oids simultaneously. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'oid-array.c')
-rw-r--r--oid-array.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/oid-array.c b/oid-array.c
index 8e4717746c..1f36651754 100644
--- a/oid-array.c
+++ b/oid-array.c
@@ -6,12 +6,20 @@ void oid_array_append(struct oid_array *array, const struct object_id *oid)
{
ALLOC_GROW(array->oid, array->nr + 1, array->alloc);
oidcpy(&array->oid[array->nr++], oid);
+ if (!oid->algo)
+ oid_set_algo(&array->oid[array->nr - 1], the_hash_algo);
array->sorted = 0;
}
-static int void_hashcmp(const void *a, const void *b)
+static int void_hashcmp(const void *va, const void *vb)
{
- return oidcmp(a, b);
+ const struct object_id *a = va, *b = vb;
+ int ret;
+ if (a->algo == b->algo)
+ ret = oidcmp(a, b);
+ else
+ ret = a->algo > b->algo ? 1 : -1;
+ return ret;
}
void oid_array_sort(struct oid_array *array)