Make xbps_remove_pkg_from_* use shared code, and add another variant.
The functions have been renamed to really match what they do.
This commit is contained in:
parent
93e1a0a22c
commit
faad0a6597
@ -163,7 +163,8 @@ xbps_repo_addpkg_index(prop_dictionary_t idxdict, const char *filedir,
|
||||
rv = errno;
|
||||
goto out;
|
||||
}
|
||||
if (!xbps_remove_pkg_from_dict(idxdict, "packages", pkgname)) {
|
||||
if (!xbps_remove_pkg_from_dict_by_name(idxdict,
|
||||
"packages", pkgname)) {
|
||||
fprintf(stderr, "E: couldn't remove %s dict from "
|
||||
"index (%s)\n", pkgname, strerror(errno));
|
||||
prop_object_release(newpkgd);
|
||||
|
@ -195,7 +195,7 @@ main(int argc, char **argv)
|
||||
if (argc != 3)
|
||||
usage();
|
||||
|
||||
if (!xbps_remove_pkg_dict_from_file(argv[1], plist)) {
|
||||
if (!xbps_remove_pkg_dict_from_plist_by_name(argv[1], plist)) {
|
||||
if (errno == ENOENT)
|
||||
fprintf(stderr, "%s=> ERROR: %s not registered "
|
||||
"in database.%s\n", MSG_WARN, argv[1], MSG_RESET);
|
||||
|
@ -53,7 +53,7 @@
|
||||
* @def XBPS_RELVER
|
||||
* Current library release date.
|
||||
*/
|
||||
#define XBPS_RELVER "20110126"
|
||||
#define XBPS_RELVER "20110127"
|
||||
|
||||
/**
|
||||
* @def XBPS_META_PATH
|
||||
@ -520,12 +520,24 @@ prop_dictionary_t xbps_get_pkg_dict_from_metadata_plist(const char *pkgn,
|
||||
* Removes the package's proplib dictionary matching \a pkgname
|
||||
* in a plist file.
|
||||
*
|
||||
* @param[in] pkgname Package name to look for.
|
||||
* @param[in] name Package name to match in plist's dictionary.
|
||||
* @param[in] plist Path to a plist file.
|
||||
*
|
||||
* @return true on success, false otherwise and errno is set appropiately.
|
||||
*/
|
||||
bool xbps_remove_pkg_dict_from_file(const char *pkgname, const char *plist);
|
||||
bool xbps_remove_pkg_dict_from_plist_by_name(const char *name,
|
||||
const char *plist);
|
||||
|
||||
/**
|
||||
* Removes the package's proplib dictionary matching \a pkgname
|
||||
* in a proplib array.
|
||||
*
|
||||
* @param[in] array Proplib array where to look for.
|
||||
* @param[in] name Package name to match in the array.
|
||||
*
|
||||
* @return true on success, false otherwise and errno is set appropiately.
|
||||
*/
|
||||
bool xbps_remove_pkg_from_array_by_name(prop_array_t array, const char *name);
|
||||
|
||||
/**
|
||||
* Removes the package's proplib dictionary matching \a pkgname,
|
||||
@ -533,13 +545,13 @@ bool xbps_remove_pkg_dict_from_file(const char *pkgname, const char *plist);
|
||||
*
|
||||
* @param[in] dict Proplib dictionary storing the proplib array.
|
||||
* @param[in] key Key associated with the proplib array.
|
||||
* @param[in] pkgname Package name to look for.
|
||||
* @param[in] name Package name to look for.
|
||||
*
|
||||
* @return true on success, false otherwise and errno is set appropiately.
|
||||
*/
|
||||
bool xbps_remove_pkg_from_dict(prop_dictionary_t dict,
|
||||
const char *key,
|
||||
const char *pkgname);
|
||||
bool xbps_remove_pkg_from_dict_by_name(prop_dictionary_t dict,
|
||||
const char *key,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* Removes a string from a proplib's array.
|
||||
|
@ -151,7 +151,7 @@ xbps_unregister_pkg(const char *pkgname)
|
||||
if (plist == NULL)
|
||||
return ENOMEM;
|
||||
|
||||
if (!xbps_remove_pkg_dict_from_file(pkgname, plist))
|
||||
if (!xbps_remove_pkg_dict_from_plist_by_name(pkgname, plist))
|
||||
rv = errno;
|
||||
|
||||
free(plist);
|
||||
|
88
lib/plist.c
88
lib/plist.c
@ -436,25 +436,34 @@ xbps_get_pkg_dict_from_metadata_plist(const char *pkgn, const char *plist)
|
||||
return plistd;
|
||||
}
|
||||
|
||||
bool
|
||||
xbps_remove_string_from_array(prop_array_t array, const char *str)
|
||||
static bool
|
||||
remove_string_from_array(prop_array_t array, const char *str, bool byname)
|
||||
{
|
||||
prop_object_t obj;
|
||||
prop_object_iterator_t iter;
|
||||
unsigned int idx = 0;
|
||||
prop_object_t obj;
|
||||
const char *curname;
|
||||
size_t idx = 0;
|
||||
bool found = false;
|
||||
|
||||
assert(array != NULL);
|
||||
assert(str != NULL);
|
||||
|
||||
iter = prop_array_iterator(array);
|
||||
if (iter == NULL)
|
||||
return false;
|
||||
|
||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
||||
if (prop_string_equals_cstring(obj, str)) {
|
||||
found = true;
|
||||
break;
|
||||
while ((obj = prop_object_iterator_next(iter))) {
|
||||
if (byname) {
|
||||
/* match by name */
|
||||
prop_dictionary_get_cstring_nocopy(obj,
|
||||
"pkgname", &curname);
|
||||
if (strcmp(curname, str) == 0) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* exact match */
|
||||
if (prop_string_equals_cstring(obj, str)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
@ -465,60 +474,41 @@ xbps_remove_string_from_array(prop_array_t array, const char *str)
|
||||
}
|
||||
|
||||
prop_array_remove(array, idx);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
xbps_remove_pkg_from_dict(prop_dictionary_t dict,
|
||||
const char *key,
|
||||
const char *pkgname)
|
||||
xbps_remove_string_from_array(prop_array_t array, const char *str)
|
||||
{
|
||||
return remove_string_from_array(array, str, false);
|
||||
}
|
||||
|
||||
bool
|
||||
xbps_remove_pkg_from_array_by_name(prop_array_t array, const char *name)
|
||||
{
|
||||
return remove_string_from_array(array, name, true);
|
||||
}
|
||||
|
||||
bool
|
||||
xbps_remove_pkg_from_dict_by_name(prop_dictionary_t dict,
|
||||
const char *key,
|
||||
const char *pkgname)
|
||||
{
|
||||
prop_array_t array;
|
||||
prop_object_t obj;
|
||||
prop_object_iterator_t iter;
|
||||
const char *curpkgname;
|
||||
unsigned int i = 0;
|
||||
bool found = false;
|
||||
|
||||
assert(dict != NULL);
|
||||
assert(key != NULL);
|
||||
assert(pkgname != NULL);
|
||||
|
||||
array = prop_dictionary_get(dict, key);
|
||||
if (prop_object_type(array) != PROP_TYPE_ARRAY) {
|
||||
errno = EINVAL;
|
||||
xbps_dbg_printf("invalid array type for key: %s pkgname: %s\n",
|
||||
key, pkgname);
|
||||
return false;
|
||||
}
|
||||
|
||||
iter = prop_array_iterator(array);
|
||||
if (iter == NULL)
|
||||
if (array == NULL)
|
||||
return false;
|
||||
|
||||
/* Iterate over the array of dictionaries to find its index. */
|
||||
while ((obj = prop_object_iterator_next(iter))) {
|
||||
prop_dictionary_get_cstring_nocopy(obj, "pkgname", &curpkgname);
|
||||
if ((curpkgname && (strcmp(curpkgname, pkgname) == 0))) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
prop_object_iterator_release(iter);
|
||||
if (found) {
|
||||
prop_array_remove(array, i);
|
||||
return true;
|
||||
}
|
||||
|
||||
errno = ENOENT;
|
||||
|
||||
return false;
|
||||
return xbps_remove_pkg_from_array_by_name(array, pkgname);
|
||||
}
|
||||
|
||||
bool
|
||||
xbps_remove_pkg_dict_from_file(const char *pkg, const char *plist)
|
||||
xbps_remove_pkg_dict_from_plist_by_name(const char *pkg, const char *plist)
|
||||
{
|
||||
prop_dictionary_t pdict;
|
||||
|
||||
@ -532,7 +522,7 @@ xbps_remove_pkg_dict_from_file(const char *pkg, const char *plist)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!xbps_remove_pkg_from_dict(pdict, "packages", pkg)) {
|
||||
if (!xbps_remove_pkg_from_dict_by_name(pdict, "packages", pkg)) {
|
||||
prop_object_release(pdict);
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user