Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
kv: insert all keyvalues directly sorted
Baptiste Daroussin committed 11 months ago
commit c329d0a9637e761714a13899e1393fb749a8359c
parent abac190
5 files changed +35 -10
modified libpkg/pkg.c
@@ -1042,9 +1042,9 @@ pkg_kv_add(kvlist_t *list, const char *key, const char *val, const char *title)
	assert(val != NULL);
	assert(title != NULL);

-
	vec_foreach(*list, i) {
-
		if (!STREQ(list->d[i]->key, key))
-
			continue;
+
	kv = pkg_kv_new(key, val);
+
	if (pkg_kv_insert_sorted(list, kv) != NULL) {
+
		pkg_kv_free(kv);
		if (ctx.developer_mode) {
			pkg_emit_error("duplicate %s: %s, fatal"
				    " (developer mode)", title, key);
@@ -1055,9 +1055,6 @@ pkg_kv_add(kvlist_t *list, const char *key, const char *val, const char *title)
		return (EPKG_OK);
	}

-
	kv = pkg_kv_new(key, val);
-
	vec_push(list, kv);
-

	return (EPKG_OK);
}

modified libpkg/pkg_add.c
@@ -1128,14 +1128,16 @@ scan_local_pkgs(struct pkg_add_db *db, bool fromstdin, struct localhashes *l, co
		vec_foreach(db->localpkgs, i) {
			struct pkg *p = db->localpkgs.d[i];
			vec_foreach(p->shlibs_provided, j) {
-
				vec_push(&l->shlibs_provides, pkg_kv_new(p->shlibs_provided.d[j], p->repopath));
+
				struct pkg_kv *kv = pkg_kv_new(p->shlibs_provided.d[j], p->repopath);
+
				if (pkg_kv_insert_sorted(&l->shlibs_provides, kv) != NULL)
+
					pkg_kv_free(kv);
			}
			vec_foreach(p->provides, j) {
-
				vec_push(&l->provides, pkg_kv_new(p->provides.d[j], p->repopath));
+
				struct pkg_kv *kv = pkg_kv_new(p->provides.d[j], p->repopath);
+
				if (pkg_kv_insert_sorted(&l->provides, kv) != NULL)
+
					pkg_kv_free(kv);
			}
		}
-
		pkg_kv_sort(&l->shlibs_provides);
-
		pkg_kv_sort(&l->provides);
	}
}

modified libpkg/pkg_attributes.c
@@ -174,6 +174,8 @@ pkg_kv_search(kvlist_t *kv, char *el)
	return (*res);
}

+
DEFINE_VEC_INSERT_SORTED_FUNC(kvlist_t, pkg_kv, struct pkg_kv *, kv_cmp)
+

void
pkg_kv_sort(kvlist_t *kv)
{
modified libpkg/private/pkg.h
@@ -681,6 +681,7 @@ struct pkg_kv *pkg_kv_new(const char *key, const char *val);
void pkg_kv_free(struct pkg_kv *);
struct pkg_kv *pkg_kv_search(kvlist_t *, char *);
void pkg_kv_sort(kvlist_t *);
+
DEFINE_VEC_INSERT_SORTED_PROTO(kvlist_t, pkg_kv, struct pkg_kv *);

void pkg_dep_free(struct pkg_dep *);
void pkg_file_free(struct pkg_file *);
modified tests/lib/kv.c
@@ -8,8 +8,30 @@
#include <private/pkg.h>

ATF_TC_WITHOUT_HEAD(kv_sort);
+
ATF_TC_WITHOUT_HEAD(kv_insert_sorted);
ATF_TC_WITHOUT_HEAD(kv_search);

+
ATF_TC_BODY(kv_insert_sorted, tc)
+
{
+
	kvlist_t kvl = vec_init();
+

+
	ATF_REQUIRE_EQ_MSG(kvl.d, NULL, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.cap, 0, "vec_init failed");
+
	ATF_REQUIRE_EQ_MSG(kvl.len, 0, "vec_init failed");
+

+
	struct pkg_kv *kv = pkg_kv_new("key", "value");
+
	ATF_REQUIRE_EQ(pkg_kv_insert_sorted(&kvl, kv), NULL);
+
	ATF_REQUIRE_EQ(kvl.len, 1);
+
	ATF_REQUIRE(pkg_kv_insert_sorted(&kvl, kv) != NULL);
+
	ATF_REQUIRE_EQ(kvl.len, 1);
+

+
	kv = pkg_kv_new("akey", "value");
+
	ATF_REQUIRE(pkg_kv_insert_sorted(&kvl, kv) != NULL);
+
	ATF_REQUIRE_EQ(kvl.len, 2);
+
	ATF_REQUIRE_STREQ(kvl.d[0]->key, "akey");
+
	ATF_REQUIRE_STREQ(kvl.d[1]->key, "key");
+
}
+

ATF_TC_BODY(kv_sort, tc)
{
	kvlist_t kvl = vec_init();
@@ -91,6 +113,7 @@ ATF_TC_BODY(kv_search, tc)

ATF_TP_ADD_TCS(tp)
{
+
	ATF_TP_ADD_TC(tp, kv_insert_sorted);
	ATF_TP_ADD_TC(tp, kv_sort);
	ATF_TP_ADD_TC(tp, kv_search);