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:
parent
76a641794b
commit
463d182c49
@ -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.
|
||||||
*
|
*
|
||||||
|
12
lib/plist.c
12
lib/plist.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user