On Sun, May 16, 2010 at 7:33 PM, Nagy Gabor <ngaba@bibl.u-szeged.hu> wrote:
This patch fixes the phonon/qt issue, if all to-be-upgraded packages are explicit targets (ie. only not-yet-installed packages are pulled by resolvedeps). This condition covers the most common situations, for example it should hold with every -Su operation.
After this patch sync405.py passes, but sync406.py doesn't.
The work is inspired by the patch of Henning Garus, thanks for his work: http://mailman.archlinux.org/pipermail/pacman-dev/2010-February/010429.html (I moved the alpm_list_diff computation to sync.c in order to compute it only once.)
Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu>
While not the most pretty, this does seem like the best way to fix this without doing tons of extra work. I'm fine with this if others are. Thanks for looking at this.
--- lib/libalpm/deps.c | 10 +++------- lib/libalpm/deps.h | 2 +- lib/libalpm/sync.c | 6 +++++- pactest/tests/sync405.py | 2 -- 4 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 7dc734d..26f9b16 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -578,7 +578,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, /* Computes resolvable dependencies for a given package and adds that package * and those resolvable dependencies to a list. * - * @param local is the local database + * @param localpkgs is the list of local packages * @param dbs_sync are the sync databases * @param pkg is the package to resolve * @param packages is a pointer to a list of packages which will be @@ -594,7 +594,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, * unresolvable dependency, in which case the [*packages] list will be * unmodified by this function */ -int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg, +int _alpm_resolvedeps(alpm_list_t *localpkgs, alpm_list_t *dbs_sync, pmpkg_t *pkg, alpm_list_t *preferred, alpm_list_t **packages, alpm_list_t *remove, alpm_list_t **data) { @@ -605,10 +605,6 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg,
ALPM_LOG_FUNC;
- if(local == NULL) { - return(-1); - } - if(_alpm_pkg_find(*packages, pkg->name) != NULL) { return(0); } @@ -624,7 +620,7 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg, for(i = alpm_list_last(*packages); i; i = i->next) { pmpkg_t *tpkg = i->data; targ = alpm_list_add(NULL, tpkg); - deps = alpm_checkdeps(_alpm_db_get_pkgcache(local), 0, remove, targ); + deps = alpm_checkdeps(localpkgs, 0, remove, targ); alpm_list_free(targ); for(j = deps; j; j = j->next) { pmdepmissing_t *miss = j->data; diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h index 6681c59..ffc3aee 100644 --- a/lib/libalpm/deps.h +++ b/lib/libalpm/deps.h @@ -49,7 +49,7 @@ void _alpm_depmiss_free(pmdepmissing_t *miss); alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, int reverse); void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit); pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, alpm_list_t *excluding, int prompt); -int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg, +int _alpm_resolvedeps(alpm_list_t *localpkgs, alpm_list_t *dbs_sync, pmpkg_t *pkg, alpm_list_t *preferred, alpm_list_t **packages, alpm_list_t *remove, alpm_list_t **data); int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2); diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 6b625ed..be36941 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -431,17 +431,21 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } }
+ /* Compute the fake local database for resolvedeps (partial fix for the phonon/qt issue) */ + alpm_list_t *localpkgs = alpm_list_diff(_alpm_db_get_pkgcache(db_local), trans->add, _alpm_pkg_cmp); + /* Resolve packages in the transaction one at a time, in addtion building up a list of packages which could not be resolved. */ for(i = trans->add; i; i = i->next) { pmpkg_t *pkg = i->data; - if(_alpm_resolvedeps(db_local, dbs_sync, pkg, trans->add, + if(_alpm_resolvedeps(localpkgs, dbs_sync, pkg, trans->add, &resolved, remove, data) == -1) { unresolvable = alpm_list_add(unresolvable, pkg); } /* Else, [resolved] now additionally contains [pkg] and all of its dependencies not already on the list */ } + alpm_list_free(localpkgs);
/* If there were unresolvable top-level packages, prompt the user to see if they'd like to ignore them rather than failing the sync */ diff --git a/pactest/tests/sync405.py b/pactest/tests/sync405.py index d170cec..941a1af 100644 --- a/pactest/tests/sync405.py +++ b/pactest/tests/sync405.py @@ -22,5 +22,3 @@ self.addrule("PKG_EXIST=qt") self.addrule("PKG_EXIST=phonon") self.addrule("PKG_VERSION=qt|4.6.1-1") - -self.expectfailure = True -- 1.7.1