This is done extremely crudely and is not very efficient, but it does push us down the path of being closer to right, as one additional test now passes. Signed-off-by: Dan McGee <dan@archlinux.org> --- lib/libalpm/sync.c | 27 +++++++++++++++++---------- test/pacman/tests/replace101.py | 2 -- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index e860591..878971e 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -85,20 +85,16 @@ alpm_pkg_t SYMEXPORT *alpm_sync_newversion(alpm_pkg_t *pkg, alpm_list_t *dbs_syn /** Search for packages to upgrade and add them to the transaction. */ int SYMEXPORT alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade) { - alpm_list_t *i, *j, *k; + alpm_list_t *i, *j; alpm_trans_t *trans; - alpm_db_t *db_local; - alpm_list_t *dbs_sync; CHECK_HANDLE(handle, return -1); trans = handle->trans; - db_local = handle->db_local; - dbs_sync = handle->dbs_sync; ASSERT(trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1)); ASSERT(trans->state == STATE_INITIALIZED, RET_ERR(handle, ALPM_ERR_TRANS_NOT_INITIALIZED, -1)); _alpm_log(handle, ALPM_LOG_DEBUG, "checking for package upgrades\n"); - for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) { + for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = i->next) { alpm_pkg_t *lpkg = i->data; if(_alpm_pkg_find(trans->add, lpkg->name)) { @@ -108,7 +104,7 @@ int SYMEXPORT alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade) /* Search for literal then replacers in each sync database. * If found, don't check other databases */ - for(j = dbs_sync; j; j = j->next) { + for(j = handle->dbs_sync; j; j = j->next) { alpm_db_t *sdb = j->data; /* Check sdb */ alpm_pkg_t *spkg = _alpm_db_get_pkgfromcache(sdb, lpkg->name); @@ -150,10 +146,20 @@ int SYMEXPORT alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade) } else { /* 2. search for replacers in sdb */ int found = 0; + alpm_list_t *k, *l; for(k = _alpm_db_get_pkgcache(sdb); k; k = k->next) { spkg = k->data; - if(alpm_list_find_str(alpm_pkg_get_replaces(spkg), lpkg->name)) { - found = 1; + for(l = alpm_pkg_get_replaces(spkg); l; l = l->next) { + const char *replace = l->data; + alpm_depend_t *parsed_replace = _alpm_splitdep(replace); + if(_alpm_depcmp(lpkg, parsed_replace)) { + found = 1; + _alpm_dep_free(parsed_replace); + break; + } + _alpm_dep_free(parsed_replace); + } + if(found) { /* check IgnorePkg/IgnoreGroup */ if(_alpm_pkg_should_ignore(handle, spkg) || _alpm_pkg_should_ignore(handle, lpkg)) { @@ -197,7 +203,8 @@ int SYMEXPORT alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade) } } if(found) { - break; /* jump to next local package */ + /* jump to next local package */ + break; } } } diff --git a/test/pacman/tests/replace101.py b/test/pacman/tests/replace101.py index ee0f860..00d2b6b 100644 --- a/test/pacman/tests/replace101.py +++ b/test/pacman/tests/replace101.py @@ -16,5 +16,3 @@ self.addrule("!PKG_EXIST=python-yaml") self.addrule("PKG_VERSION=python2-yaml|5-1") self.addrule("FILE_EXIST=lib/python2/file") - -self.expectfailure = True -- 1.7.6