summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/trans.c
diff options
context:
space:
mode:
authorNagy Gabor <ngaba@petra.hos.u-szeged.hu>2007-07-16 20:58:58 +0200
committerDan McGee <dan@archlinux.org>2007-08-20 21:23:53 +0200
commitb1808930ce45a034981626fc20bbc7920890899e (patch)
tree7bdcb9fe684c0a9f508abe4503cc93c8ae31b2b5 /lib/libalpm/trans.c
parent17d9122e01f5a675f4c7882e68ceae65aae7b5aa (diff)
downloadpacman-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.c73
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);
}