if (satisfier_entry_pkg != pkg &&
!is_pkg_in_pkg_vec(unsatisfied, satisfier_entry_pkg))
{
- pkg_vec_insert(unsatisfied, satisfier_entry_pkg);
pkg_hash_fetch_unsatisfied_dependencies(
satisfier_entry_pkg, unsatisfied, &newstuff);
+ pkg_vec_insert(unsatisfied, satisfier_entry_pkg);
the_lost = merge_unresolved(the_lost, newstuff);
if (newstuff)
free(newstuff);
return 0;
}
-int pkg_dependence_satisfied(depend_t * depend)
-{
- abstract_pkg_t *apkg = depend->pkg;
- abstract_pkg_vec_t *provider_apkgs = apkg->provided_by;
- int n_providers = provider_apkgs->len;
- abstract_pkg_t **apkgs = provider_apkgs->pkgs;
- int i;
- int n_pkgs;
- int j;
-
- for (i = 0; i < n_providers; i++) {
- abstract_pkg_t *papkg = apkgs[i];
- pkg_vec_t *pkg_vec = papkg->pkgs;
- if (pkg_vec) {
- n_pkgs = pkg_vec->len;
- for (j = 0; j < n_pkgs; j++) {
- pkg_t *pkg = pkg_vec->pkgs[j];
- if (version_constraints_satisfied(depend, pkg)) {
- if (pkg->state_status == SS_INSTALLED
- || pkg->state_status == SS_UNPACKED)
- return 1;
- }
- }
- }
- }
- return 0;
-}
-
static int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg)
{
int i;
*/
int pkg_conflicts_abstract(pkg_t * pkg, abstract_pkg_t * conflictee)
{
- compound_depend_t *conflicts, *conflict;
-
- conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
+ int i, j;
+ compound_depend_t *conflicts;
- int j;
- for (conflict = conflicts; conflict->type; conflict++) {
- int possibility_count = conflict->possibility_count;
- struct depend **possibilities = conflict->possibilities;
- for (j = 0; j < possibility_count; j++) {
- if (possibilities[j]->pkg == conflictee) {
+ for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+ for (j = 0; j < conflicts[i].possibility_count; j++)
+ if (conflicts[i].possibilities[j]->pkg == conflictee)
return 1;
- }
- }
- }
+
return 0;
}
*/
int pkg_conflicts(pkg_t * pkg, pkg_t * conflictee)
{
- int j;
- int possibility_count;
- struct depend **possibilities;
- compound_depend_t *conflicts, *conflict;
- abstract_pkg_t **conflictee_provides, **provider, *possibility;
+ int i, j;
+ compound_depend_t *conflicts;
+ abstract_pkg_t **provider;
- conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
- conflictee_provides = pkg_get_ptr(conflictee, PKG_PROVIDES);
-
- for (conflict = conflicts; conflict->type; conflict++) {
- possibility_count = conflict->possibility_count;
- possibilities = conflict->possibilities;
- for (j = 0; j < possibility_count; j++) {
- possibility = possibilities[j]->pkg;
- for (provider = conflictee_provides; provider && *provider; provider++) {
- if (possibility == *provider) {
+ for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+ for (j = 0; j < conflicts[i].possibility_count; j++)
+ for (provider = pkg_get_ptr(conflictee, PKG_PROVIDES); provider && *provider; provider++)
+ if (conflicts[i].possibilities[j]->pkg == *provider)
return 1;
- }
- }
- }
- }
+
return 0;
}
provided_abpkg = ensure_abstract_pkg_by_name(item);
+ if (provided_abpkg->state_flag & SF_NEED_DETAIL) {
+ if (!(ab_pkg->state_flag & SF_NEED_DETAIL)) {
+ opkg_msg(DEBUG, "propagating provided abpkg flag to "
+ "provider abpkg %s\n", ab_pkg->name);
+ ab_pkg->state_flag |= SF_NEED_DETAIL;
+ }
+ }
+
if (!abstract_pkg_vec_contains(provided_abpkg->provided_by, ab_pkg))
abstract_pkg_vec_insert(provided_abpkg->provided_by, ab_pkg);
abstract_pkg_vec_insert(ab_pkg->provided_by, ab_pkg);
- for (count = 1, item = strtok_r(list, ", ", &tok);
- item;
- count++, item = strtok_r(NULL, ", ", &tok), count++) {
+ for (count = 1, item = strtok_r(list, ", ", &tok); item;
+ count++, item = strtok_r(NULL, ", ", &tok)) {
tmp = realloc(replaces, sizeof(abstract_pkg_t *) * (count + 1));
if (!tmp)
/* if a package pkg both replaces and conflicts old_abpkg,
* then add it to the replaced_by vector so that old_abpkg
* will be upgraded to ab_pkg automatically */
- if (pkg_conflicts_abstract(pkg, old_abpkg))
- abstract_pkg_vec_insert(old_abpkg->replaced_by, ab_pkg);
+ if (pkg_conflicts_abstract(pkg, old_abpkg)) {
+ if (!abstract_pkg_vec_contains(old_abpkg->replaced_by, ab_pkg))
+ abstract_pkg_vec_insert(old_abpkg->replaced_by, ab_pkg);
+ }
replaces = tmp;
replaces[count - 1] = old_abpkg;