mirror of
https://github.com/moparisthebest/pacman
synced 2024-10-31 15:45:03 -04:00
Partial fix for the phonon/qt issue
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> Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
c6f0fc27ed
commit
eada558e12
@ -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
|
/* Computes resolvable dependencies for a given package and adds that package
|
||||||
* and those resolvable dependencies to a list.
|
* 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 dbs_sync are the sync databases
|
||||||
* @param pkg is the package to resolve
|
* @param pkg is the package to resolve
|
||||||
* @param packages is a pointer to a list of packages which will be
|
* @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
|
* unresolvable dependency, in which case the [*packages] list will be
|
||||||
* unmodified by this function
|
* 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 *preferred, alpm_list_t **packages,
|
||||||
alpm_list_t *remove, alpm_list_t **data)
|
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;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
if(local == NULL) {
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_alpm_pkg_find(*packages, pkg->name) != NULL) {
|
if(_alpm_pkg_find(*packages, pkg->name) != NULL) {
|
||||||
return(0);
|
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) {
|
for(i = alpm_list_last(*packages); i; i = i->next) {
|
||||||
pmpkg_t *tpkg = i->data;
|
pmpkg_t *tpkg = i->data;
|
||||||
targ = alpm_list_add(NULL, tpkg);
|
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);
|
alpm_list_free(targ);
|
||||||
for(j = deps; j; j = j->next) {
|
for(j = deps; j; j = j->next) {
|
||||||
pmdepmissing_t *miss = j->data;
|
pmdepmissing_t *miss = j->data;
|
||||||
|
@ -49,7 +49,7 @@ void _alpm_depmiss_free(pmdepmissing_t *miss);
|
|||||||
alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, int reverse);
|
alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, int reverse);
|
||||||
void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit);
|
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);
|
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 *preferred, alpm_list_t **packages, alpm_list_t *remove,
|
||||||
alpm_list_t **data);
|
alpm_list_t **data);
|
||||||
int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2);
|
int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2);
|
||||||
|
@ -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
|
/* Resolve packages in the transaction one at a time, in addtion
|
||||||
building up a list of packages which could not be resolved. */
|
building up a list of packages which could not be resolved. */
|
||||||
for(i = trans->add; i; i = i->next) {
|
for(i = trans->add; i; i = i->next) {
|
||||||
pmpkg_t *pkg = i->data;
|
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) {
|
&resolved, remove, data) == -1) {
|
||||||
unresolvable = alpm_list_add(unresolvable, pkg);
|
unresolvable = alpm_list_add(unresolvable, pkg);
|
||||||
}
|
}
|
||||||
/* Else, [resolved] now additionally contains [pkg] and all of its
|
/* Else, [resolved] now additionally contains [pkg] and all of its
|
||||||
dependencies not already on the list */
|
dependencies not already on the list */
|
||||||
}
|
}
|
||||||
|
alpm_list_free(localpkgs);
|
||||||
|
|
||||||
/* If there were unresolvable top-level packages, prompt the user to
|
/* If there were unresolvable top-level packages, prompt the user to
|
||||||
see if they'd like to ignore them rather than failing the sync */
|
see if they'd like to ignore them rather than failing the sync */
|
||||||
|
@ -22,5 +22,3 @@ self.addrule("PKG_EXIST=kdelibs")
|
|||||||
self.addrule("PKG_EXIST=qt")
|
self.addrule("PKG_EXIST=qt")
|
||||||
self.addrule("PKG_EXIST=phonon")
|
self.addrule("PKG_EXIST=phonon")
|
||||||
self.addrule("PKG_VERSION=qt|4.6.1-1")
|
self.addrule("PKG_VERSION=qt|4.6.1-1")
|
||||||
|
|
||||||
self.expectfailure = True
|
|
||||||
|
Loading…
Reference in New Issue
Block a user