]> git.ipfire.org Git - thirdparty/git.git/commitdiff
oid-array: teach oid-array to handle multiple kinds of oids
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 2 Oct 2023 02:40:06 +0000 (21:40 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 2 Oct 2023 21:57:38 +0000 (14:57 -0700)
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>
oid-array.c

index 8e4717746c3183bd47c3c746c747efd83c61168c..1f36651754edc47f733bc51bbecd716deee31ed4 100644 (file)
@@ -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)