libxbps: the provides obj now expects exact pkgver strings.
This reduces extra allocs and simplifies the code, which was just there to workaround some broken pkgs anyway.
This commit is contained in:
parent
dc157614d0
commit
7b3a500139
4
NEWS
4
NEWS
@ -1,5 +1,9 @@
|
||||
xbps-0.44 (???):
|
||||
|
||||
* libxbps: the provides obj (array of strings) now fully expects exact
|
||||
pkgver strings, such as `foo-1.0_1`. Incomplete components such as
|
||||
`pkgname` or `pkgname-9` are not accepted anymore.
|
||||
|
||||
* libxbps: detection of orphaned pkgs is now 66% faster (and even more in some cases).
|
||||
This improves the performance of `xbps-remove -R` (recursively remove a pkg
|
||||
and its dependencies) and `xbps-remove -o` (remove orphaned pkgs) marginally.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2008-2014 Juan Romero Pardines.
|
||||
* Copyright (c) 2008-2015 Juan Romero Pardines.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -70,34 +70,23 @@ xbps_match_any_virtualpkg_in_rundeps(xbps_array_t rundeps,
|
||||
xbps_object_t obj, obj2;
|
||||
xbps_object_iterator_t iter, iter2;
|
||||
const char *vpkgver, *pkgpattern;
|
||||
char *tmp;
|
||||
|
||||
iter = xbps_array_iterator(provides);
|
||||
assert(iter);
|
||||
|
||||
while ((obj = xbps_object_iterator_next(iter))) {
|
||||
tmp = NULL;
|
||||
vpkgver = xbps_string_cstring_nocopy(obj);
|
||||
if (strchr(vpkgver, '_') == NULL) {
|
||||
tmp = xbps_xasprintf("%s_1", vpkgver);
|
||||
vpkgver = tmp;
|
||||
}
|
||||
iter2 = xbps_array_iterator(rundeps);
|
||||
assert(iter2);
|
||||
while ((obj2 = xbps_object_iterator_next(iter2))) {
|
||||
pkgpattern = xbps_string_cstring_nocopy(obj2);
|
||||
if (xbps_pkgpattern_match(vpkgver, pkgpattern)) {
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
|
||||
xbps_object_iterator_release(iter2);
|
||||
xbps_object_iterator_release(iter);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
xbps_object_iterator_release(iter2);
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
}
|
||||
xbps_object_iterator_release(iter);
|
||||
|
||||
@ -110,7 +99,7 @@ match_string_in_array(xbps_array_t array, const char *str, int mode)
|
||||
xbps_object_iterator_t iter;
|
||||
xbps_object_t obj;
|
||||
const char *pkgdep;
|
||||
char *curpkgname, *tmp;
|
||||
char *curpkgname;
|
||||
bool found = false;
|
||||
|
||||
assert(xbps_object_type(array) == XBPS_TYPE_ARRAY);
|
||||
@ -120,7 +109,6 @@ match_string_in_array(xbps_array_t array, const char *str, int mode)
|
||||
assert(iter);
|
||||
|
||||
while ((obj = xbps_object_iterator_next(iter))) {
|
||||
tmp = NULL;
|
||||
if (mode == 0) {
|
||||
/* match by string */
|
||||
if (xbps_string_equals_cstring(obj, str)) {
|
||||
@ -130,13 +118,7 @@ match_string_in_array(xbps_array_t array, const char *str, int mode)
|
||||
} else if (mode == 1) {
|
||||
/* match by pkgname against pkgver */
|
||||
pkgdep = xbps_string_cstring_nocopy(obj);
|
||||
if (strchr(pkgdep, '_') == NULL) {
|
||||
tmp = xbps_xasprintf("%s_1", pkgdep);
|
||||
curpkgname = xbps_pkg_name(tmp);
|
||||
free(tmp);
|
||||
} else {
|
||||
curpkgname = xbps_pkg_name(pkgdep);
|
||||
}
|
||||
if (curpkgname == NULL)
|
||||
break;
|
||||
if (strcmp(curpkgname, str) == 0) {
|
||||
@ -160,34 +142,17 @@ match_string_in_array(xbps_array_t array, const char *str, int mode)
|
||||
} else if (mode == 3) {
|
||||
/* match pkgpattern against pkgdep */
|
||||
pkgdep = xbps_string_cstring_nocopy(obj);
|
||||
if (strchr(pkgdep, '_') == NULL) {
|
||||
tmp = xbps_xasprintf("%s_1", pkgdep);
|
||||
pkgdep = tmp;
|
||||
}
|
||||
if (xbps_pkgpattern_match(pkgdep, str)) {
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
|
||||
} else if (mode == 4) {
|
||||
/* match pkgdep against pkgpattern */
|
||||
pkgdep = xbps_string_cstring_nocopy(obj);
|
||||
if (strchr(pkgdep, '_') == NULL) {
|
||||
tmp = xbps_xasprintf("%s_1", pkgdep);
|
||||
pkgdep = tmp;
|
||||
}
|
||||
if (xbps_pkgpattern_match(str, pkgdep)) {
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (tmp != NULL)
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
xbps_object_iterator_release(iter);
|
||||
|
33
lib/repo.c
33
lib/repo.c
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2012-2014 Juan Romero Pardines.
|
||||
* Copyright (c) 2012-2015 Juan Romero Pardines.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -333,7 +333,6 @@ revdeps_match(struct xbps_repo *repo, xbps_dictionary_t tpkgd, const char *str)
|
||||
xbps_object_iterator_t iter;
|
||||
xbps_object_t obj;
|
||||
const char *pkgver, *tpkgver, *arch, *vpkg;
|
||||
char *buf;
|
||||
|
||||
iter = xbps_dictionary_iterator(repo->idx);
|
||||
assert(iter);
|
||||
@ -374,16 +373,9 @@ revdeps_match(struct xbps_repo *repo, xbps_dictionary_t tpkgd, const char *str)
|
||||
provides = xbps_dictionary_get(tpkgd, "provides");
|
||||
for (unsigned int i = 0; i < xbps_array_count(provides); i++) {
|
||||
xbps_array_get_cstring_nocopy(provides, i, &vpkg);
|
||||
if (strchr(vpkg, '_') == NULL)
|
||||
buf = xbps_xasprintf("%s_1", vpkg);
|
||||
else
|
||||
buf = strdup(vpkg);
|
||||
|
||||
if (!xbps_match_pkgdep_in_array(pkgdeps, buf)) {
|
||||
free(buf);
|
||||
if (!xbps_match_pkgdep_in_array(pkgdeps, vpkg))
|
||||
continue;
|
||||
}
|
||||
free(buf);
|
||||
|
||||
xbps_dictionary_get_cstring_nocopy(pkgd,
|
||||
"architecture", &arch);
|
||||
if (!xbps_pkg_arch_match(repo->xhp, arch, NULL))
|
||||
@ -428,7 +420,6 @@ xbps_repo_get_pkg_revdeps(struct xbps_repo *repo, const char *pkg)
|
||||
xbps_array_t revdeps = NULL, vdeps = NULL;
|
||||
xbps_dictionary_t pkgd;
|
||||
const char *vpkg;
|
||||
char *buf = NULL;
|
||||
bool match = false;
|
||||
|
||||
if (repo->idx == NULL)
|
||||
@ -447,26 +438,18 @@ xbps_repo_get_pkg_revdeps(struct xbps_repo *repo, const char *pkg)
|
||||
char *vpkgn;
|
||||
|
||||
xbps_array_get_cstring_nocopy(vdeps, i, &vpkg);
|
||||
if (strchr(vpkg, '_') == NULL)
|
||||
buf = xbps_xasprintf("%s_1", vpkg);
|
||||
else
|
||||
buf = strdup(vpkg);
|
||||
|
||||
vpkgn = xbps_pkg_name(buf);
|
||||
vpkgn = xbps_pkg_name(vpkg);
|
||||
assert(vpkgn);
|
||||
if (strcmp(vpkgn, pkg) == 0) {
|
||||
free(vpkgn);
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
free(vpkgn);
|
||||
free(buf);
|
||||
buf = NULL;
|
||||
}
|
||||
if (buf) {
|
||||
match = true;
|
||||
revdeps = revdeps_match(repo, pkgd, buf);
|
||||
free(buf);
|
||||
vpkg = NULL;
|
||||
}
|
||||
if (match)
|
||||
revdeps = revdeps_match(repo, pkgd, vpkg);
|
||||
}
|
||||
if (!match)
|
||||
revdeps = revdeps_match(repo, pkgd, NULL);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2012-2014 Juan Romero Pardines.
|
||||
* Copyright (c) 2012-2015 Juan Romero Pardines.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -48,8 +48,8 @@ provides_init(void)
|
||||
a = xbps_array_create();
|
||||
ATF_REQUIRE(a != NULL);
|
||||
|
||||
xbps_array_add_cstring_nocopy(a, "cron-daemon-0");
|
||||
xbps_array_add_cstring_nocopy(a, "xbps-9999");
|
||||
xbps_array_add_cstring_nocopy(a, "cron-daemon-0_1");
|
||||
xbps_array_add_cstring_nocopy(a, "xbps-9999_1");
|
||||
|
||||
return a;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user