Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg: for all lists insert elements sorted
Baptiste Daroussin committed 11 months ago
commit abac190e49d83c5adea42d9c4761b2f4f6bcef5b
parent eda2d95
4 files changed +42 -33
modified libpkg/pkg.c
@@ -575,7 +575,9 @@ pkg_addstring(charv_t *list, const char *val, const char *title)
	assert(val != NULL);
	assert(title != NULL);

-
	if (charv_contains(list, val, false)) {
+
	char *tmp = xstrdup(val);
+
	if (charv_insert_sorted(list, tmp) != NULL) {
+
		free(tmp);
		if (ctx.developer_mode) {
			pkg_emit_error("duplicate %s listing: %s, fatal"
			    " (developer mode)", title, val);
@@ -586,8 +588,6 @@ pkg_addstring(charv_t *list, const char *val, const char *title)
		return (EPKG_OK);
	}

-
	vec_push(list, xstrdup(val));
-

	return (EPKG_OK);
}

@@ -934,13 +934,11 @@ pkg_addshlib_required(struct pkg *pkg, const char *name,
	char *full_name = pkg_shlib_name_with_flags(name, flags);

	/* silently ignore duplicates in case of shlibs */
-
	if (charv_contains(&pkg->shlibs_required, full_name, false)) {
+
	if (charv_insert_sorted(&pkg->shlibs_required, full_name) != NULL) {
		free(full_name);
		return (EPKG_OK);
	}

-
	vec_push(&pkg->shlibs_required, full_name);
-

	dbg(3, "added shlib deps for %s on %s", pkg->name, full_name);

	return (EPKG_OK);
@@ -956,13 +954,11 @@ pkg_addshlib_provided(struct pkg *pkg, const char *name,
	char *full_name = pkg_shlib_name_with_flags(name, flags);

	/* silently ignore duplicates in case of shlibs */
-
	if (charv_contains(&pkg->shlibs_provided, full_name, false)) {
+
	if (charv_insert_sorted(&pkg->shlibs_provided, full_name) != NULL) {
		free(full_name);
		return (EPKG_OK);
	}

-
	vec_push(&pkg->shlibs_provided, full_name);
-

	dbg(3, "added shlib provide %s for %s", full_name, pkg->name);

	return (EPKG_OK);
@@ -997,11 +993,13 @@ pkg_addrequire(struct pkg *pkg, const char *name)
	assert(pkg != NULL);
	assert(name != NULL && name[0] != '\0');

-
	/* silently ignore duplicates in case of conflicts */
-
	if (charv_contains(&pkg->requires, name, false))
-
		return (EPKG_OK);
+
	char *tmp = xstrdup(name);

-
	vec_push(&pkg->requires, xstrdup(name));
+
	if (charv_insert_sorted(&pkg->requires, tmp) != NULL) {
+
		/* silently ignore duplicates in case of conflicts */
+
		free(tmp);
+
		return (EPKG_OK);
+
	}

	return (EPKG_OK);
}
@@ -1012,11 +1010,13 @@ pkg_addprovide(struct pkg *pkg, const char *name)
	assert(pkg != NULL);
	assert(name != NULL && name[0] != '\0');

-
	/* silently ignore duplicates in case of conflicts */
-
	if (charv_contains(&pkg->provides, name, false))
-
		return (EPKG_OK);
+
	char *tmp = xstrdup(name);

-
	vec_push(&pkg->provides, xstrdup(name));
+
	if (charv_insert_sorted(&pkg->provides, tmp) != NULL) {
+
		/* silently ignore duplicates in case of conflicts */
+
		free(tmp);
+
		return (EPKG_OK);
+
	}

	return (EPKG_OK);
}
@@ -1709,22 +1709,6 @@ pkg_lists_sort(struct pkg *p)
		return;
	p->list_sorted = true;

-
	if (p->categories.d)
-
		qsort(p->categories.d, p->categories.len, sizeof(char *), char_cmp);
-
	if (p->licenses.d)
-
		qsort(p->licenses.d, p->licenses.len, sizeof(char *), char_cmp);
-
	if (p->users.d)
-
		qsort(p->users.d, p->users.len, sizeof(char *), char_cmp);
-
	if (p->groups.d)
-
		qsort(p->groups.d, p->groups.len, sizeof(char *), char_cmp);
-
	if (p->shlibs_required.d)
-
		qsort(p->shlibs_required.d, p->shlibs_required.len, sizeof(char *), char_cmp);
-
	if (p->shlibs_provided.d)
-
		qsort(p->shlibs_provided.d, p->shlibs_provided.len, sizeof(char *), char_cmp);
-
	if (p->provides.d)
-
		qsort(p->provides.d, p->provides.len, sizeof(p->provides.d[0]), char_cmp);
-
	if (p->requires.d)
-
		qsort(p->requires.d, p->requires.len, sizeof(p->requires.d[0]), char_cmp);
	DL_SORT(p->depends, pkg_dep_cmp);
	DL_SORT(p->files, pkg_file_cmp);
	DL_SORT(p->dirs, pkg_dir_cmp);
modified libpkg/private/utils.h
@@ -102,5 +102,6 @@ bool charv_contains(charv_t *, const char *, bool);
bool str_ends_with(const char *str, const char *end);
int char_cmp(const void *a, const void *b);
const char *charv_search(charv_t *, const char *);
+
DEFINE_VEC_INSERT_SORTED_PROTO(charv_t, charv, char *);

#endif
modified libpkg/utils.c
@@ -1126,6 +1126,8 @@ char_cmp(const void *a, const void *b) {
	return strcmp(*(char **)a, *(char **)b);
}

+
DEFINE_VEC_INSERT_SORTED_FUNC(charv_t, charv, char *, char_cmp);
+

const char *
charv_search(charv_t *v, const char *el)
{
modified tests/lib/vec.c
@@ -14,6 +14,7 @@ ATF_TC_WITHOUT_HEAD(c_charv_contains);
ATF_TC_WITHOUT_HEAD(charv_t);
ATF_TC_WITHOUT_HEAD(vec_remove_and_free);
ATF_TC_WITHOUT_HEAD(charv_search);
+
ATF_TC_WITHOUT_HEAD(charv_insert_sorted);

ATF_TC_BODY(c_charv_t, tc)
{
@@ -152,6 +153,26 @@ ATF_TC_BODY(charv_search, tc)
	vec_free_and_free(&list, free);
}

+
ATF_TC_BODY(charv_insert_sorted, tc)
+
{
+
	charv_t list = vec_init();
+

+
	char *p = xstrdup("bla");
+
	ATF_REQUIRE_EQ(charv_insert_sorted(&list, p), NULL);
+
	ATF_REQUIRE_EQ(list.len, 1);
+
	ATF_REQUIRE_STREQ(list.d[0], "bla");
+

+
	ATF_REQUIRE(charv_insert_sorted(&list, p) != NULL);
+
	ATF_REQUIRE_EQ(list.len, 1);
+
	ATF_REQUIRE_STREQ(list.d[0], "bla");
+

+
	p = xstrdup("a");
+
	ATF_REQUIRE_EQ(charv_insert_sorted(&list, p), NULL);
+
	ATF_REQUIRE_EQ(list.len, 2);
+
	ATF_REQUIRE_STREQ(list.d[0], "a");
+
	ATF_REQUIRE_STREQ(list.d[1], "bla");
+
}
+

ATF_TP_ADD_TCS(tp)
{
	ATF_TP_ADD_TC(tp, c_charv_t);
@@ -159,6 +180,7 @@ ATF_TP_ADD_TCS(tp)
	ATF_TP_ADD_TC(tp, c_charv_contains);
	ATF_TP_ADD_TC(tp, vec_remove_and_free);
	ATF_TP_ADD_TC(tp, charv_search);
+
	ATF_TP_ADD_TC(tp, charv_insert_sorted);

	return (atf_no_error());
}