When sorting packages also look for virtual packages.

A new function xbps_find_virtual_pkg_in_dict() has been made public
to the API to make this find duplicate packages in the transaction
when updating packages.
This commit is contained in:
Juan RP 2011-01-28 20:56:28 +01:00
parent 76a641794b
commit 463d182c49
3 changed files with 33 additions and 8 deletions

View File

@ -53,7 +53,7 @@
* @def XBPS_RELVER * @def XBPS_RELVER
* Current library release date. * Current library release date.
*/ */
#define XBPS_RELVER "20110127" #define XBPS_RELVER "20110128"
/** /**
* @def XBPS_META_PATH * @def XBPS_META_PATH
@ -460,6 +460,22 @@ prop_dictionary_t xbps_find_pkg_dict_from_plist_by_name(const char *plist,
prop_dictionary_t xbps_find_pkg_dict_installed(const char *str, prop_dictionary_t xbps_find_pkg_dict_installed(const char *str,
bool bypattern); bool bypattern);
/**
* Finds a virtual package by looking at package's dictionary by
* using a package name or a package pattern.
*
* @param[in] pkgd Package dictionary.
* @param[in] str Virtual package name or package pattern.
* @param[in] bypattern If true, \a str should be a package name,
* otherwise it should be a package pattern.
*
* @return True if package dictionary matches the virtual package
* name or pattern, false otherwise.
*/
bool xbps_find_virtual_pkg_in_dict(prop_dictionary_t pkgd,
const char *str,
bool bypattern);
/** /**
* Finds a package name matching an string object in a proplib array. * Finds a package name matching an string object in a proplib array.
* *

View File

@ -233,10 +233,10 @@ out:
return rpkgd; return rpkgd;
} }
static bool bool
find_virtual_pkg_in_dict(prop_dictionary_t d, xbps_find_virtual_pkg_in_dict(prop_dictionary_t d,
const char *str, const char *str,
bool bypattern) bool bypattern)
{ {
prop_array_t provides; prop_array_t provides;
bool found = false; bool found = false;
@ -273,14 +273,14 @@ find_pkg_in_dict(prop_dictionary_t d,
"pkgver", &pkgver); "pkgver", &pkgver);
if (xbps_pkgpattern_match(pkgver, __UNCONST(str))) if (xbps_pkgpattern_match(pkgver, __UNCONST(str)))
break; break;
if (find_virtual_pkg_in_dict(obj, str, true)) if (xbps_find_virtual_pkg_in_dict(obj, str, true))
break; break;
} else { } else {
prop_dictionary_get_cstring_nocopy(obj, prop_dictionary_get_cstring_nocopy(obj,
"pkgname", &dpkgn); "pkgname", &dpkgn);
if (strcmp(dpkgn, str) == 0) if (strcmp(dpkgn, str) == 0)
break; break;
if (find_virtual_pkg_in_dict(obj, str, false)) if (xbps_find_virtual_pkg_in_dict(obj, str, false))
break; break;
} }
} }

View File

@ -63,9 +63,14 @@ pkgdep_find(const char *name)
{ {
struct pkgdep *pd = NULL; struct pkgdep *pd = NULL;
TAILQ_FOREACH(pd, &pkgdep_list, pkgdep_entries) TAILQ_FOREACH(pd, &pkgdep_list, pkgdep_entries) {
if (strcmp(pd->name, name) == 0) if (strcmp(pd->name, name) == 0)
return pd; return pd;
if (pd->d == NULL)
continue;
if (xbps_find_virtual_pkg_in_dict(pd->d, name, false))
return pd;
}
/* not found */ /* not found */
return NULL; return NULL;
@ -80,6 +85,10 @@ pkgdep_find_idx(const char *name)
TAILQ_FOREACH(pd, &pkgdep_list, pkgdep_entries) { TAILQ_FOREACH(pd, &pkgdep_list, pkgdep_entries) {
if (strcmp(pd->name, name) == 0) if (strcmp(pd->name, name) == 0)
return idx; return idx;
if (pd->d == NULL)
continue;
if (xbps_find_virtual_pkg_in_dict(pd->d, name, false))
return idx;
idx++; idx++;
} }