diff options
author | Vincent Ambo <Vincent Ambo> | 2020-01-11T23·36+0000 |
---|---|---|
committer | Vincent Ambo <Vincent Ambo> | 2020-01-11T23·40+0000 |
commit | 7ef0d62730840ded097b524104cc0a0904591a63 (patch) | |
tree | a670f96103667aeca4789a95d94ca0dff550c4ce /third_party/git/sha1-array.c | |
parent | 6a2a3007077818e24a3d56fc492ada9206a10cf0 (diff) | |
parent | 1b593e1ea4d2af0f6444d9a7788d5d99abd6fde5 (diff) |
merge(third_party/git): Merge squashed git subtree at v2.23.0 r/373
Merge commit '1b593e1ea4d2af0f6444d9a7788d5d99abd6fde5' as 'third_party/git'
Diffstat (limited to 'third_party/git/sha1-array.c')
-rw-r--r-- | third_party/git/sha1-array.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/third_party/git/sha1-array.c b/third_party/git/sha1-array.c new file mode 100644 index 000000000000..d922e94e3fc5 --- /dev/null +++ b/third_party/git/sha1-array.c @@ -0,0 +1,96 @@ +#include "cache.h" +#include "sha1-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) +{ + int i; + + /* No oid_array_sort() here! See the api-oid-array.txt docs! */ + + 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) +{ + int 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) +{ + unsigned 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; +} |