summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2011-10-31 16:51:53 +0200
committerTimo Teräs <timo.teras@iki.fi>2011-10-31 16:51:53 +0200
commit918807c45b44122d5df93430dee235f3ece66827 (patch)
tree163871e8c189008d3cf8cbc1ca947300513c9c0a /src
parentcb5054e68627ee299c7fdc73e5b8b3d744f79fbe (diff)
downloadapk-tools-918807c45b44122d5df93430dee235f3ece66827.tar.gz
apk-tools-918807c45b44122d5df93430dee235f3ece66827.tar.bz2
apk-tools-918807c45b44122d5df93430dee235f3ece66827.tar.xz
apk-tools-918807c45b44122d5df93430dee235f3ece66827.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/solver.c31
1 files 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;