From f4609b896fac842433bd495c166d5987852a6a73 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 21 Nov 2020 19:20:35 +0100 Subject: merge(3p/git): Merge git subtree at v2.29.2 This also bumps the stable nixpkgs to 20.09 as of 2020-11-21, because there is some breakage in the git build related to the netrc credentials helper which someone has taken care of in nixpkgs. The stable channel is not used for anything other than git, so this should be fine. Change-Id: I3575a19dab09e1e9556cf8231d717de9890484fb --- third_party/git/oid-array.c | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 third_party/git/oid-array.c (limited to 'third_party/git/oid-array.c') diff --git a/third_party/git/oid-array.c b/third_party/git/oid-array.c new file mode 100644 index 000000000000..8657a5cedfa6 --- /dev/null +++ b/third_party/git/oid-array.c @@ -0,0 +1,96 @@ +#include "cache.h" +#include "oid-array.h" +#include "sha1-lookup.h" + +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); + array->sorted = 0; +} + +static int void_hashcmp(const void *a, const void *b) +{ + return oidcmp(a, b); +} + +static void oid_array_sort(struct oid_array *array) +{ + QSORT(array->oid, array->nr, void_hashcmp); + array->sorted = 1; +} + +static const unsigned char *sha1_access(size_t index, void *table) +{ + struct object_id *array = table; + return array[index].hash; +} + +int oid_array_lookup(struct oid_array *array, const struct object_id *oid) +{ + if (!array->sorted) + oid_array_sort(array); + return sha1_pos(oid->hash, array->oid, array->nr, sha1_access); +} + +void oid_array_clear(struct oid_array *array) +{ + FREE_AND_NULL(array->oid); + array->nr = 0; + array->alloc = 0; + array->sorted = 0; +} + + +int oid_array_for_each(struct oid_array *array, + for_each_oid_fn fn, + void *data) +{ + size_t i; + + /* No oid_array_sort() here! See oid-array.h */ + + for (i = 0; i < array->nr; i++) { + int ret = fn(array->oid + i, data); + if (ret) + return ret; + } + return 0; +} + +int oid_array_for_each_unique(struct oid_array *array, + for_each_oid_fn fn, + void *data) +{ + size_t i; + + if (!array->sorted) + oid_array_sort(array); + + for (i = 0; i < array->nr; i++) { + int ret; + if (i > 0 && oideq(array->oid + i, array->oid + i - 1)) + continue; + ret = fn(array->oid + i, data); + if (ret) + return ret; + } + return 0; +} + +void oid_array_filter(struct oid_array *array, + for_each_oid_fn want, + void *cb_data) +{ + size_t nr = array->nr, src, dst; + struct object_id *oids = array->oid; + + for (src = dst = 0; src < nr; src++) { + if (want(&oids[src], cb_data)) { + if (src != dst) + oidcpy(&oids[dst], &oids[src]); + dst++; + } + } + array->nr = dst; +} -- cgit 1.4.1