diff options
author | Nagy Gabor <ngaba@petra.hos.u-szeged.hu> | 2007-08-12 22:26:54 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2007-11-25 22:29:37 +0100 |
commit | 7d37d9278d0ab6eb46ec4689c8091780382cbb95 (patch) | |
tree | 2ac6ec5199a9de42967336fa2076b71b5928243f /lib/libalpm/sync.c | |
parent | 1e9a1a0292dbbf8039b8fb7536dbff2af28c7afb (diff) | |
download | pacman-7d37d9278d0ab6eb46ec4689c8091780382cbb95.tar.gz pacman-7d37d9278d0ab6eb46ec4689c8091780382cbb95.tar.xz |
Fix for sync1003 and sync1004 pactests
checkdeps and resolvedeps now take both a remove list and an install list as
arguments, allowing dependencies to be calculated correctly.
This broke the sync990 pactest, but this pactest used dependencies and
provides in an unusual way, so it has been changed.
Dan: the sync990 pactest was just plain wrong. It didn't satisfy the
dependencies correctly, so should never have succeeded.
Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
[Dan: some variable renaming, clarification in commit message]
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/sync.c')
-rw-r--r-- | lib/libalpm/sync.c | 100 |
1 files changed, 32 insertions, 68 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index b49bbfb6..f6fa3185 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -402,7 +402,7 @@ static int syncpkg_cmp(const void *s1, const void *s2) int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data) { alpm_list_t *deps = NULL; - alpm_list_t *list = NULL; /* allow checkdeps usage with trans->packages */ + alpm_list_t *list = NULL, *remove = NULL; /* allow checkdeps usage with trans->packages */ alpm_list_t *i, *j; int ret = 0; @@ -426,10 +426,21 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync /* Resolve targets dependencies */ EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_START, NULL, NULL); _alpm_log(PM_LOG_DEBUG, "resolving target's dependencies\n"); + + /* build remove list for resolvedeps */ + for(i = trans->packages; i; i = i->next) { + pmsyncpkg_t *sync = i->data; + if(sync->type == PM_SYNC_TYPE_REPLACE) { + for(j = sync->data; j; j = j->next) { + remove = alpm_list_add(remove, j->data); + } + } + } + for(i = trans->packages; i; i = i->next) { pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg; if(_alpm_resolvedeps(db_local, dbs_sync, spkg, &list, - trans, data) == -1) { + remove, trans, data) == -1) { /* pm_errno is set by resolvedeps */ ret = -1; goto cleanup; @@ -471,19 +482,6 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync trans->packages = newpkgs; EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_DONE, NULL, NULL); - - _alpm_log(PM_LOG_DEBUG, "looking for unresolvable dependencies\n"); - deps = _alpm_checkdeps(db_local, PM_TRANS_TYPE_UPGRADE, list); - if(deps) { - if(data) { - *data = deps; - } else { - FREELIST(deps); - } - pm_errno = PM_ERR_UNSATISFIED_DEPS; - ret = -1; - goto cleanup; - } } /* We don't care about conflicts if we're just printing uris */ @@ -648,72 +646,38 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_DONE, NULL, NULL); } - alpm_list_free(list); - list = NULL; - - /* XXX: this fails for cases where a requested package wants - * a dependency that conflicts with an older version of - * the package. It will be removed from final, and the user - * has to re-request it to get it installed properly. - * - * Not gonna happen very often, but should be dealt with... - */ - if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) { - /* Check dependencies of packages in rmtargs and make sure - * we won't be breaking anything by removing them. - * If a broken dep is detected, make sure it's not from a - * package that's in our final (upgrade) list. - */ - /*EVENT(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);*/ + /* rebuild remove and list */ + alpm_list_free(list); + list = NULL; + for(i = trans->packages; i; i = i->next) { + pmsyncpkg_t *sync = i->data; + list = alpm_list_add(list, sync->pkg); + } + alpm_list_free(remove); + remove = NULL; for(i = trans->packages; i; i = i->next) { pmsyncpkg_t *sync = i->data; if(sync->type == PM_SYNC_TYPE_REPLACE) { for(j = sync->data; j; j = j->next) { - list = alpm_list_add(list, j->data); + remove = alpm_list_add(remove, j->data); } } } - if(list) { - _alpm_log(PM_LOG_DEBUG, "checking dependencies of packages designated for removal\n"); - deps = _alpm_checkdeps(db_local, PM_TRANS_TYPE_REMOVE, list); - if(deps) { - /* Check if broken dependencies are fixed by packages we are installing */ - int errorout = 0; - for(i = deps; i; i = i->next) { - pmdepmissing_t *miss = i->data; - - alpm_list_t *l; - int satisfied = 0; - for(l = trans->packages; l && !satisfied; l = l->next) { - pmsyncpkg_t *sp = l->data; - pmpkg_t *sppkg = sp->pkg; - if(alpm_depcmp(sppkg, &(miss->depend))) { - char *missdepstring = alpm_dep_get_string(&(miss->depend)); - _alpm_log(PM_LOG_DEBUG, "sync: dependency '%s' satisfied by package '%s'\n", - missdepstring, alpm_pkg_get_name(sppkg)); - free(missdepstring); - satisfied = 1; - } - } - if(!satisfied) { - errorout++; - *data = alpm_list_add(*data, miss); - } - } - if(errorout) { - pm_errno = PM_ERR_UNSATISFIED_DEPS; - ret = -1; - goto cleanup; - } - FREELIST(deps); - } + + _alpm_log(PM_LOG_DEBUG, "checking dependencies\n"); + deps = alpm_checkdeps(db_local, 1, remove, list); + if(deps) { + pm_errno = PM_ERR_UNSATISFIED_DEPS; + ret = -1; + FREELIST(deps); + goto cleanup; } - /*EVENT(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);*/ } cleanup: alpm_list_free(list); + alpm_list_free(remove); return(ret); } |