about summary refs log tree commit diff
path: root/third_party/git/oidset.c
diff options
context:
space:
mode:
authorVincent Ambo <Vincent Ambo>2020-01-11T23·36+0000
committerVincent Ambo <Vincent Ambo>2020-01-11T23·40+0000
commit7ef0d62730840ded097b524104cc0a0904591a63 (patch)
treea670f96103667aeca4789a95d94ca0dff550c4ce /third_party/git/oidset.c
parent6a2a3007077818e24a3d56fc492ada9206a10cf0 (diff)
parent1b593e1ea4d2af0f6444d9a7788d5d99abd6fde5 (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/oidset.c')
-rw-r--r--third_party/git/oidset.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/third_party/git/oidset.c b/third_party/git/oidset.c
new file mode 100644
index 000000000000..f63ce818f677
--- /dev/null
+++ b/third_party/git/oidset.c
@@ -0,0 +1,72 @@
+#include "cache.h"
+#include "oidset.h"
+
+void oidset_init(struct oidset *set, size_t initial_size)
+{
+	memset(&set->set, 0, sizeof(set->set));
+	if (initial_size)
+		kh_resize_oid_set(&set->set, initial_size);
+}
+
+int oidset_contains(const struct oidset *set, const struct object_id *oid)
+{
+	khiter_t pos = kh_get_oid_set(&set->set, *oid);
+	return pos != kh_end(&set->set);
+}
+
+int oidset_insert(struct oidset *set, const struct object_id *oid)
+{
+	int added;
+	kh_put_oid_set(&set->set, *oid, &added);
+	return !added;
+}
+
+int oidset_remove(struct oidset *set, const struct object_id *oid)
+{
+	khiter_t pos = kh_get_oid_set(&set->set, *oid);
+	if (pos == kh_end(&set->set))
+		return 0;
+	kh_del_oid_set(&set->set, pos);
+	return 1;
+}
+
+void oidset_clear(struct oidset *set)
+{
+	kh_release_oid_set(&set->set);
+	oidset_init(set, 0);
+}
+
+void oidset_parse_file(struct oidset *set, const char *path)
+{
+	FILE *fp;
+	struct strbuf sb = STRBUF_INIT;
+	struct object_id oid;
+
+	fp = fopen(path, "r");
+	if (!fp)
+		die("could not open object name list: %s", path);
+	while (!strbuf_getline(&sb, fp)) {
+		const char *p;
+		const char *name;
+
+		/*
+		 * Allow trailing comments, leading whitespace
+		 * (including before commits), and empty or whitespace
+		 * only lines.
+		 */
+		name = strchr(sb.buf, '#');
+		if (name)
+			strbuf_setlen(&sb, name - sb.buf);
+		strbuf_trim(&sb);
+		if (!sb.len)
+			continue;
+
+		if (parse_oid_hex(sb.buf, &oid, &p) || *p != '\0')
+			die("invalid object name: %s", sb.buf);
+		oidset_insert(set, &oid);
+	}
+	if (ferror(fp))
+		die_errno("Could not read '%s'", path);
+	fclose(fp);
+	strbuf_release(&sb);
+}