Commit f3cf8249 authored by Oliver Smith's avatar Oliver Smith Committed by Timo Teräs

solver: add more dbg_printfs

parent edb45ae4
......@@ -511,8 +511,10 @@ static int compare_providers(struct apk_solver_state *ss,
int r;
/* Prefer existing package */
if (pkgA == NULL || pkgB == NULL)
if (pkgA == NULL || pkgB == NULL) {
dbg_printf(" prefer existing package\n");
return (pkgA != NULL) - (pkgB != NULL);
}
/* Latest version required? */
solver_flags = pkgA->ss.solver_flags | pkgB->ss.solver_flags;
......@@ -521,77 +523,103 @@ static int compare_providers(struct apk_solver_state *ss,
(pkgB->ss.pinning_allowed == APK_DEFAULT_PINNING_MASK)) {
/* Prefer allowed pinning */
r = (int)pkgA->ss.tag_ok - (int)pkgB->ss.tag_ok;
if (r)
if (r) {
dbg_printf(" prefer allowed pinning\n");
return r;
}
/* Prefer available */
if (solver_flags & APK_SOLVERF_AVAILABLE) {
r = (int)pkgA->ss.pkg_available - (int)pkgB->ss.pkg_available;
if (r)
if (r) {
dbg_printf(" prefer available\n");
return r;
}
} else if (solver_flags & APK_SOLVERF_REINSTALL) {
r = (int)pkgA->ss.pkg_selectable - (int)pkgB->ss.pkg_selectable;
if (r)
if (r) {
dbg_printf(" prefer available (reinstall)\n");
return r;
}
}
} else {
/* Prefer without errors */
r = (int)pkgA->ss.pkg_selectable - (int)pkgB->ss.pkg_selectable;
if (r)
if (r) {
dbg_printf(" prefer without errors\n");
return r;
}
/* Prefer those that were in last dependency merging group */
r = (int)pkgA->ss.dependencies_used - (int)pkgB->ss.dependencies_used;
if (r)
if (r) {
dbg_printf(" prefer those that were in last dependency merging group\n");
return r;
}
r = pkgB->ss.conflicts - pkgA->ss.conflicts;
if (r)
if (r) {
dbg_printf(" prefer those that were in last dependency merging group (#2)\n");
return r;
}
/* Prefer installed on self-upgrade */
if ((db->performing_self_upgrade && !(solver_flags & APK_SOLVERF_UPGRADE)) ||
(solver_flags & APK_SOLVERF_IGNORE_UPGRADE)) {
r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL);
if (r)
if (r) {
dbg_printf(" prefer installed on self-upgrade\n");
return r;
}
}
/* Prefer allowed pinning */
r = (int)pkgA->ss.tag_ok - (int)pkgB->ss.tag_ok;
if (r)
if (r) {
dbg_printf(" prefer allowed pinning\n");
return r;
}
/* Prefer available */
if (solver_flags & APK_SOLVERF_AVAILABLE) {
r = (int)pkgA->ss.pkg_available - (int)pkgB->ss.pkg_available;
if (r)
if (r) {
dbg_printf(" prefer available\n");
return r;
}
}
/* Prefer preferred pinning */
r = (int)pkgA->ss.tag_preferred - (int)pkgB->ss.tag_preferred;
if (r)
if (r) {
dbg_printf(" prefer preferred pinning\n");
return r;
}
/* Prefer highest requirer count. */
r = count_requirers(pkgA) - count_requirers(pkgB);
if (r)
if (r) {
dbg_printf(" prefer highest requirer count\n");
return r;
}
/* Prefer installed */
if (!(solver_flags & APK_SOLVERF_UPGRADE) ||
(solver_flags & APK_SOLVERF_IGNORE_UPGRADE)) {
r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL);
if (r)
if (r) {
dbg_printf(" prefer installed\n");
return r;
}
}
}
/* Select latest by requested name */
switch (apk_version_compare_blob(*pA->version, *pB->version)) {
case APK_VERSION_LESS:
dbg_printf(" select latest by requested name (less)\n");
return -1;
case APK_VERSION_GREATER:
dbg_printf(" select latest by requested name (greater)\n");
return 1;
}
......@@ -599,28 +627,37 @@ static int compare_providers(struct apk_solver_state *ss,
if (pkgA->name == pkgB->name) {
switch (apk_version_compare_blob(*pkgA->version, *pkgB->version)) {
case APK_VERSION_LESS:
dbg_printf(" select latest by principal name (less)\n");
return -1;
case APK_VERSION_GREATER:
dbg_printf(" select latest by principal name (greater)\n");
return 1;
}
}
/* Prefer installed (matches here if upgrading) */
r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL);
if (r)
if (r) {
dbg_printf(" prefer installed (upgrading)\n");
return r;
}
/* Prefer highest declared provider priority. */
r = pkgA->provider_priority - pkgB->provider_priority;
if (r)
if (r) {
dbg_printf(" prefer highest declared provider priority\n");
return r;
}
/* Prefer without errors (mostly if --latest used, and different provider) */
r = (int)pkgA->ss.pkg_selectable - (int)pkgB->ss.pkg_selectable;
if (r)
if (r) {
dbg_printf(" prefer without errors (#2)\n");
return r;
}
/* Prefer lowest available repository */
dbg_printf(" prefer lowest available repository\n");
return ffs(pkgB->repos) - ffs(pkgA->repos);
}
......@@ -685,17 +722,23 @@ static void select_package(struct apk_solver_state *ss, struct apk_name *name)
/* Ensure valid pinning and install-if trigger */
if (name->ss.requirers == 0 &&
(!p->pkg->ss.iif_triggered ||
!p->pkg->ss.tag_ok))
!p->pkg->ss.tag_ok)) {
dbg_printf(" ignore: invalid install-if trigger or invalid pinning\n");
continue;
}
/* Virtual packages without provider_priority cannot be autoselected,
* unless there is only one provider */
if (p->version == &apk_atom_null &&
p->pkg->name->auto_select_virtual == 0 &&
p->pkg->name->ss.requirers == 0 &&
(p->pkg->provider_priority == 0 && name->providers->num > 1))
(p->pkg->provider_priority == 0 && name->providers->num > 1)) {
dbg_printf(" ignore: virtual package without provider_priority with >1 provider\n");
continue;
if (compare_providers(ss, p, &chosen) > 0)
}
if (compare_providers(ss, p, &chosen) > 0) {
dbg_printf(" choose as new provider\n");
chosen = *p;
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment