Also compare the name and not only the version when checking if two packages are the same. rh#104066 Index: lib/depends.c =================================================================== --- lib/depends.c.orig +++ lib/depends.c @@ -124,6 +124,24 @@ static int removePackage(rpmts ts, Heade return 0; } +static int rpmNameVersionCompare(Header first, Header second) +{ + const char * one, * two; + int rc; + + rc = headerGetEntry(first, RPMTAG_NAME, NULL, (void **) &one, NULL); + rc = headerGetEntry(second, RPMTAG_NAME, NULL, (void **) &two, NULL); + rc = strcmp(one, two); + if (rc) + return rc; + rc = headerGetEntry(first, RPMTAG_ARCH, NULL, (void **) &one, NULL); + rc = headerGetEntry(second, RPMTAG_ARCH, NULL, (void **) &two, NULL); + rc = strcmp(one, two); + if (rc) + return rc; + return rpmVersionCompare(first, second); +} + int rpmtsAddInstallElement(rpmts ts, Header h, fnpyKey key, int upgrade, rpmRelocation * relocs) { @@ -315,7 +333,7 @@ addheader: continue; /* Skip packages that contain identical NEVR. */ - if (rpmVersionCompare(h, oh) == 0) + if (rpmNameVersionCompare(h, oh) == 0) continue; xx = removePackage(ts, oh, rpmdbGetIteratorOffset(mi), pkgKey); @@ -366,11 +384,9 @@ addheader: * If no obsoletes version info is available, match all names. */ if (rpmdsEVR(obsoletes) == NULL - || rpmdsAnyMatchesDep(oh, obsoletes, _rpmds_nopromote)) { + || rpmdsNVRMatchesDep(oh, obsoletes, _rpmds_nopromote)) { const char * ohNEVRA = hGetNEVRA(oh, NULL); -#ifdef DYING /* XXX see http://bugzilla.redhat.com #134497 */ - if (rpmVersionCompare(h, oh)) -#endif + if (rpmNameVersionCompare(h, oh)) xx = removePackage(ts, oh, rpmdbGetIteratorOffset(mi), pkgKey); /*@-nullptrarith@*/ rpmMessage(RPMMESS_DEBUG, _(" Obsoletes: %s\t\terases %s\n"),