diff options
author | Nagy Gabor <ngaba@petra.hos.u-szeged.hu> | 2007-07-16 20:58:58 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2007-08-20 21:23:53 +0200 |
commit | b1808930ce45a034981626fc20bbc7920890899e (patch) | |
tree | 7bdcb9fe684c0a9f508abe4503cc93c8ae31b2b5 /lib/libalpm/trans.c | |
parent | 17d9122e01f5a675f4c7882e68ceae65aae7b5aa (diff) | |
download | pacman-b1808930ce45a034981626fc20bbc7920890899e.tar.gz pacman-b1808930ce45a034981626fc20bbc7920890899e.tar.xz |
libalpm/add.c,trans.c : cleanup of requiredby handling.
This patch cleans up and fix the _alpm_trans_update_depends function
and ensure that all requiredby fields are filled in case of multiple satisfiers
(previously, the handling of mutliple satisfiers in that function was inconsistent).
This makes a special case handling of requiredby in commit_single_pkg() obsolete,
and so allows cleaning that code as well.
Also fixed upgrade056 pactest because :
1) the requiredby fields were wrong, and this wouldn't happen with the fixed _alpm_trans_update_depends().
2) this is a very unusual case anyway (and handling all corner cases combined to a broken database
seems nearly impossible to achieve).
References :
http://www.archlinux.org/pipermail/pacman-dev/2007-July/008919.html
http://www.archlinux.org/pipermail/pacman-dev/2007-July/008920.html
Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Diffstat (limited to 'lib/libalpm/trans.c')
-rw-r--r-- | lib/libalpm/trans.c | 73 |
1 files changed, 12 insertions, 61 deletions
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index ca8d6ce9..8c35fa36 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -428,6 +428,8 @@ int _alpm_trans_commit(pmtrans_t *trans, alpm_list_t **data) return(0); } +/* A depends on B through n depends <=> A listed in B's requiredby n times + * n == 0 or 1 in almost all cases */ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) { alpm_list_t *i, *j; @@ -436,7 +438,7 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) pmdb_t *localdb; ALPM_LOG_FUNC; - + /* Sanity checks */ ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); ASSERT(pkg != NULL, RET_ERR(PM_ERR_PKG_INVALID, -1)); @@ -453,40 +455,22 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) localdb = alpm_option_get_localdb(); for(i = depends; i; i = i->next) { + if(!i->data) { + continue; + } pmdepend_t* dep = alpm_splitdep(i->data); if(dep == NULL) { continue; } - - if(trans->packages && trans->type == PM_TRANS_TYPE_REMOVE) { - if(_alpm_pkg_find(dep->name, handle->trans->packages)) { - continue; - } - } - - pmpkg_t *deppkg = _alpm_db_get_pkgfromcache(localdb, dep->name); - if(!deppkg) { - int found_provides = 0; - /* look for a provides package */ - alpm_list_t *provides = _alpm_db_whatprovides(localdb, dep->name); - for(j = provides; j; j = j->next) { - if(!j->data) { - continue; - } - pmpkg_t *provpkg = j->data; - deppkg = _alpm_db_get_pkgfromcache(localdb, alpm_pkg_get_name(provpkg)); - - if(!deppkg) { - continue; - } - - found_provides = 1; - + for(j = _alpm_db_get_pkgcache(localdb); j; j = j->next) { + pmpkg_t *deppkg = j->data; + if(deppkg && alpm_depcmp(deppkg, dep)) { /* this is cheating... we call this function to populate the package */ alpm_list_t *rqdby = alpm_pkg_get_requiredby(deppkg); _alpm_log(PM_LOG_DEBUG, "updating 'requiredby' field for package '%s'", alpm_pkg_get_name(deppkg)); + if(trans->type == PM_TRANS_TYPE_REMOVE || trans->type == PM_TRANS_TYPE_REMOVEUPGRADE) { void *data = NULL; @@ -494,11 +478,8 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) FREE(data); deppkg->requiredby = rqdby; } else { - /* sanity check to make sure package was not already in list */ - if(!alpm_list_find_str(rqdby, pkgname)) { - rqdby = alpm_list_add(rqdby, strdup(pkgname)); - deppkg->requiredby = rqdby; - } + rqdby = alpm_list_add(rqdby, strdup(pkgname)); + deppkg->requiredby = rqdby; } if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { @@ -506,36 +487,6 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) alpm_pkg_get_name(deppkg), alpm_pkg_get_version(deppkg)); } } - alpm_list_free(provides); - - if(!found_provides) { - _alpm_log(PM_LOG_DEBUG, "could not find dependency '%s'", dep->name); - continue; - } - } - - /* this is cheating... we call this function to populate the package */ - alpm_list_t *rqdby = alpm_pkg_get_requiredby(deppkg); - - _alpm_log(PM_LOG_DEBUG, "updating 'requiredby' field for package '%s'", - alpm_pkg_get_name(deppkg)); - if(trans->type == PM_TRANS_TYPE_REMOVE - || trans->type == PM_TRANS_TYPE_REMOVEUPGRADE) { - void *data = NULL; - rqdby = alpm_list_remove(rqdby, pkgname, _alpm_str_cmp, &data); - FREE(data); - deppkg->requiredby = rqdby; - } else { - /* sanity check to make sure package was not already in list */ - if(!alpm_list_find_str(rqdby, pkgname)) { - rqdby = alpm_list_add(rqdby, strdup(pkgname)); - deppkg->requiredby = rqdby; - } - } - - if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { - _alpm_log(PM_LOG_ERROR, _("could not update 'requiredby' database entry %s-%s"), - alpm_pkg_get_name(deppkg), alpm_pkg_get_version(deppkg)); } free(dep); } |