Here goes a WIP patch for FS#30649. It fixes one the sync140.py testcase just sent to the mailing list, but not sync141.py - it works only when the root cause of the excess dependency removal is first in the upgraded package list. If anyone has an idea for how to get it fully fixed, I would appreciate the help. Allan diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 841e5d6..65a8f52 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -406,14 +406,29 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data) /* Resolve packages in the transaction one at a time, in addition building up a list of packages which could not be resolved. */ - for(i = trans->add; i; i = i->next) { + + i = trans->add; + while(i != NULL) { alpm_pkg_t *pkg = i->data; if(_alpm_resolvedeps(handle, localpkgs, pkg, trans->add, &resolved, remove, data) == -1) { unresolvable = alpm_list_add(unresolvable, pkg); + + /* remove the unresolvable package from the upgrade + list and recalculate localpkgs to allow the a local + version to satisfy future deps */ + + i = i->next; + trans->add = alpm_list_remove(trans->add, pkg, + _alpm_pkg_cmp, NULL); + localpkgs = alpm_list_diff( + _alpm_db_get_pkgcache(handle->db_local), + trans->add, _alpm_pkg_cmp); + } else { + /* [resolved] now additionally contains [pkg] and all of its + dependencies not already on the list */ + i = i->next; } - /* Else, [resolved] now additionally contains [pkg] and all of its - dependencies not already on the list */ } alpm_list_free(localpkgs); alpm_list_free(remove);