From 918807c45b44122d5df93430dee235f3ece66827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Mon, 31 Oct 2011 16:51:53 +0200 Subject: [PATCH] solver: misc fixes caused upgrading package X with "apk add path/to/x...apk" where the package file was not in any repository to not work properly. --- src/solver.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/solver.c b/src/solver.c index 1dfd2dc..aa89dd9 100644 --- a/src/solver.c +++ b/src/solver.c @@ -286,11 +286,11 @@ static int compare_package_preference(unsigned short solver_flags, struct apk_package *pkgB) { /* preferred repository pinning */ - if ((pkgA->ipkg || (pkgA->repos & preferred_repos)) && - !(pkgB->ipkg || (pkgB->repos & preferred_repos))) + if ((pkgA->ipkg || pkgA->filename || (pkgA->repos & preferred_repos)) && + !(pkgB->ipkg || pkgB->filename || (pkgB->repos & preferred_repos))) return 1; - if ((pkgB->ipkg || (pkgB->repos & preferred_repos)) && - !(pkgA->ipkg || (pkgA->repos & preferred_repos))) + if ((pkgB->ipkg || pkgA->filename || (pkgB->repos & preferred_repos)) && + !(pkgA->ipkg || pkgB->filename || (pkgA->repos & preferred_repos))) return -1; if (solver_flags & APK_SOLVERF_AVAILABLE) { @@ -386,10 +386,15 @@ static int update_name_state(struct apk_solver_state *ss, struct apk_name *name) if (ps0 == NULL || pkg0->topology_hard >= ss->topology_position || - ((pkg0->repos != 0) && (pkg0->ipkg == NULL) && !(pkg0->repos & allowed_repos)) || (ps0->flags & APK_PKGSTF_DECIDED)) continue; + if ((pkg0->repos != 0) && (pkg0->ipkg == NULL) && (pkg0->filename == NULL) && + !(pkg0->repos & allowed_repos)) { + skipped_options++; + continue; + } + if (ns->requirers == 0 && ns->install_ifs != 0 && install_if_missing(ss, pkg0)) { skipped_options++; @@ -429,7 +434,8 @@ static int update_name_state(struct apk_solver_state *ss, struct apk_name *name) best_topology); if (!list_hashed(&ns->unsolved_list)) list_add(&ns->unsolved_list, &ss->unsolved_list_head); - ns->chosen = best_pkg; + if (!ns->locked) + ns->chosen = best_pkg; } return options + skipped_options; @@ -554,18 +560,21 @@ static int next_branch(struct apk_solver_state *ss) while (ss->latest_decision != NULL) { pkg = ss->latest_decision; ps = pkg_to_ps(pkg); - undo_decision(ss, pkg, ps); if (ps->flags & APK_PKGSTF_ALT_BRANCH) { dbg_printf("next_branch: undo decision at topology_position %d\n", ss->topology_position); ps->flags &= ~(APK_PKGSTF_ALT_BRANCH | APK_PKGSTF_DECIDED); + undo_decision(ss, pkg, ps); + ss->latest_decision = ps->backtrack; ss->refresh_name_states = 1; } else { dbg_printf("next_branch: swapping BRANCH at topology_position %d\n", ss->topology_position); + undo_decision(ss, pkg, ps); + ps->flags |= APK_PKGSTF_ALT_BRANCH; ps->flags ^= APK_PKGSTF_INSTALL; @@ -626,8 +635,12 @@ static void apply_constraint(struct apk_solver_state *ss, struct apk_dependency prepare_name(ss, name, ns); if (ns->locked) { - dbg_printf(PKG_VER_FMT " selected already for %s\n", - PKG_VER_PRINTF(ns->chosen), dep->name->name); + if (ns->chosen) + dbg_printf("%s: locked to " PKG_VER_FMT " already\n", + dep->name->name, PKG_VER_PRINTF(ns->chosen)); + else + dbg_printf("%s: locked to empty\n", + dep->name->name); if (!apk_dep_is_satisfied(dep, ns->chosen)) ss->score.unsatisfiable++; return;