libalpm: Search for replacers before literals

Since 882bff36 literals would be searched before replacers, resulting in a
package being replaced by another not actually being replaced under certain
conditions (e.g. they're both in the same repo).

This change effectively reversed the expectations in test sync132. This patch
switches the order back to replacers first, thus making sure if a package is
replacing another one, the change will always happen, even if both are in the
same repo.

Note that a package replacing another one in a repo with higher priority will
not be done, see FS#11737 and test sync1105

Signed-off-by: Olivier Brunel <i.am.jack.mail@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Olivier Brunel 2013-03-04 09:48:10 +01:00 committed by Allan McRae
parent 1b39653e96
commit 017184fab5
4 changed files with 33 additions and 16 deletions

View File

@ -209,24 +209,26 @@ int SYMEXPORT alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade)
continue;
}
/* Search for literal then replacers in each sync database. */
/* Search for replacers then literal (if no replacer) in each sync database. */
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);
int literal_upgrade = 0;
if(spkg) {
literal_upgrade = check_literal(handle, lpkg, spkg, enable_downgrade);
if(literal_upgrade) {
trans->add = alpm_list_add(trans->add, spkg);
}
alpm_list_t *replacers;
replacers = check_replacers(handle, lpkg, sdb);
if(replacers) {
trans->add = alpm_list_join(trans->add, replacers);
/* jump to next local package */
break;
} else {
alpm_list_t *replacers;
replacers = check_replacers(handle, lpkg, sdb);
if(replacers) {
trans->add = alpm_list_join(trans->add, replacers);
alpm_pkg_t *spkg = _alpm_db_get_pkgfromcache(sdb, lpkg->name);
if(spkg) {
int literal_upgrade = 0;
literal_upgrade = check_literal(handle, lpkg, spkg, enable_downgrade);
if(literal_upgrade) {
trans->add = alpm_list_add(trans->add, spkg);
}
/* jump to next local package */
break;
}
}
}

View File

@ -21,5 +21,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

View File

@ -0,0 +1,17 @@
self.description = "Upgrade with a replacement in a repo with lower prioriy"
sp1 = pmpkg("pkg2")
self.addpkg2db("sync1", sp1)
sp2 = pmpkg("pkg1")
sp2.replaces = ["pkg2"]
self.addpkg2db("sync2", sp2)
lp = pmpkg("pkg2")
self.addpkg2db("local", lp)
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
self.addrule("!PKG_EXIST=pkg1")
self.addrule("PKG_EXIST=pkg2")

View File

@ -14,5 +14,5 @@
self.args = "-Su"
self.addrule("PACMAN_RETCODE=0")
self.addrule("!PKG_EXIST=pkg1")
self.addrule("PKG_EXIST=pkg2")
self.addrule("PKG_EXIST=pkg1")
self.addrule("!PKG_EXIST=pkg2")