about summary refs log tree commit diff
path: root/third_party/git/oid-array.c
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-11-21T18·20+0100
committerVincent Ambo <mail@tazj.in>2020-11-21T18·45+0100
commitf4609b896fac842433bd495c166d5987852a6a73 (patch)
tree95511c465c54c4f5d27e5d39ce187e2a1dd82bd3 /third_party/git/oid-array.c
parent082c006c04343a78d87b6c6ab3608c25d6213c3f (diff)
merge(3p/git): Merge git subtree at v2.29.2 r/1890
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
Diffstat (limited to 'third_party/git/oid-array.c')
-rw-r--r--third_party/git/oid-array.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/third_party/git/oid-array.c b/third_party/git/oid-array.c
new file mode 100644
index 0000000000..8657a5cedf
--- /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;
+}