f4609b896f
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
96 lines
1.9 KiB
C
96 lines
1.9 KiB
C
#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;
|
|
}
|