Hi! My patch won't fix the problem, just cuts off a needless part from the source (because depcmp takes care of provides too). This bug is similar to the previous one. But I think this is a serious one, because this occurs in case of -Su too (as bug I.), so can be very common (whenever depends changed in sync repo). ----upgrade060.py---- self.description = "Try to upgrade 2 packages which would break deps" lp1 = pmpkg("pkg1") lp1.depends = ["pkg2=1.0-1"] self.addpkg2db("local", lp1) lp2 = pmpkg("pkg2", "1.0-1") lp2.requiredby = [ "pkg1" ] self.addpkg2db("local", lp2) p1 = pmpkg("pkg1", "1.0-2") p1.depends = ["pkg2=1.0-1"] self.addpkg(p1) p2 = pmpkg("pkg2", "1.0-2") self.addpkg(p2) self.args = "-U %s" % " ".join([p.filename() for p in p1, p2]) self.addrule("PACMAN_RETCODE=1") self.addrule("PKG_VERSION=pkg1|1.0-1") self.addrule("PKG_VERSION=pkg2|1.0-1") ------------------- You find the problem here around lines 323, we don't ensure that we won't overwrite the local "satisfyer" package with a "non-satisfyer" one. This could be fixed similarly to my previous patch, but imho that would be too slow. An idea: we should temporarily attach to the old packages in the pkgcache a "pointer" which points to the "new" target (we found all old packages earlier); and this could be deleted at the end of transaction (anyway, if the transaction is successful, we always must modify that entries). The implementation is waiting for you ;-) -----patch---------- diff -Naur pacman-lib/lib/libalpm/deps.c pacman-lib.new/lib/libalpm/deps.c --- pacman-lib/lib/libalpm/deps.c 2007-03-19 05:23:45.000000000 +0100 +++ pacman-lib.new/lib/libalpm/deps.c 2007-04-21 16:42:29.000000000 +0200 @@ -319,36 +320,12 @@ } found = 0; - /* check database for literal packages */ + /* check database for satisfying packages */ for(k = _alpm_db_get_pkgcache(db); k && !found; k = k->next) { pmpkg_t *p = (pmpkg_t *)k->data; found = alpm_depcmp(p, depend); } - /* check database for provides matches */ - if(!found) { - alpm_list_t *m; - for(m = _alpm_db_whatprovides(db, depend->name); m && !found; m = m->next) { - /* look for a match that isn't one of the packages we're trying - * to install. this way, if we match against a to-be-installed - * package, we'll defer to the NEW one, not the one already - * installed. */ - pmpkg_t *p = m->data; - alpm_list_t *n; - int skip = 0; - for(n = packages; n && !skip; n = n->next) { - pmpkg_t *ptp = n->data; - if(strcmp(alpm_pkg_get_name(ptp), alpm_pkg_get_name(p)) == 0) { - skip = 1; - } - } - if(skip) { - continue; - } - found = alpm_depcmp(p, depend); - } - FREELISTPTR(k); - } /* check other targets */ for(k = packages; k && !found; k = k->next) { pmpkg_t *p = k->data; -------------------- Bye, ngaba