--- rpm-5.4.5/lib/rpmfc.c.int_gen_overlap~ 2012-02-23 22:12:39.924314353 +0100 +++ rpm-5.4.5/lib/rpmfc.c 2012-02-23 22:12:49.006318880 +0100 @@ -514,27 +514,57 @@ assert(EVR != NULL); ds = rpmdsSingle(tagN, N, EVR, Flags); #if defined(RPM_VENDOR_MANDRIVA) /* filter-overlapping-dependencies */ - int overlap = 0; + /* XXX: should really share same code path as with what's in + * build/reqprov.c:addReqProv() + */ + int overlap = 0, res = 0; if (*depsp) { int ix = rpmdsSearch(*depsp, ds); if (ix >= 0) { - EVR_t lEVR = rpmEVRnew(RPMSENSE_ANY, 0), - rEVR = rpmEVRnew(RPMSENSE_ANY, 0); + /* do not consider dependency ranges like R: foo > 1, R: foo < 3 + * as overlapping (mdvbz#65269) + */ + if (!((Flags & RPMSENSE_GREATER && (*depsp)->Flags[(*depsp)->i] & RPMSENSE_LESS) || + (Flags & RPMSENSE_LESS &&(*depsp)->Flags[(*depsp)->i] & RPMSENSE_GREATER))) + overlap = rpmdsCompare(*depsp, ds); + + if (overlap) { + EVR_t lEVR = rpmEVRnew(RPMSENSE_ANY, 0), + rEVR = rpmEVRnew(RPMSENSE_ANY, 0); + rpmuint32_t newflags; + + /* if we have both a requires and suggests, we turn it into a requires */ + if (!(Flags & RPMSENSE_MISSINGOK) || !((*depsp)->Flags[(*depsp)->i] & RPMSENSE_MISSINGOK)) { + (*depsp)->Flags[(*depsp)->i] &= ~RPMSENSE_MISSINGOK; + Flags &= ~RPMSENSE_MISSINGOK; + } + + /* merge all flags about dependency type */ + newflags = (((*depsp)->Flags[(*depsp)->i]| Flags) & _ALL_REQUIRES_MASK); + + rpmdsSetIx(*depsp, ix); + + rpmEVRparse(EVR, lEVR); + rpmEVRparse(rpmdsEVR(*depsp), rEVR); + lEVR->Flags = Flags; + rEVR->Flags = (*depsp)->Flags[(*depsp)->i]; + + res = rpmEVRcompare(lEVR, rEVR); + if (res > 0) { + (*depsp)->Flags[(*depsp)->i] = Flags; + (*depsp)->EVR[(*depsp)->i] = EVR; + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(*depsp), rpmdsDNEVR(ds), rpmdsDNEVR(*depsp)); + } else if (res < 0) { + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); + } else { + rpmlog(RPMLOG_DEBUG, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); + } - rpmdsSetIx(*depsp, ix); + (*depsp)->Flags[(*depsp)->i] |= newflags; - rpmEVRparse(rpmdsEVR(*depsp), lEVR); - rpmEVRparse(EVR, rEVR); - lEVR->Flags = rpmdsFlags(*depsp) | RPMSENSE_EQUAL; - rEVR->Flags = Flags | RPMSENSE_EQUAL; - - if (rpmEVRcompare(lEVR, rEVR) < 0) { - (*depsp)->EVR[(*depsp)->i] = EVR; - (*depsp)->Flags[(*depsp)->i] = Flags; - overlap = 1; + lEVR = rpmEVRfree(lEVR); + rEVR = rpmEVRfree(rEVR); } - lEVR = rpmEVRfree(lEVR); - rEVR = rpmEVRfree(rEVR); } } if (!overlap) @@ -1183,7 +1213,7 @@ assert(se != NULL); switch (deptype) { default: /*@switchbreak@*/ break; - case 'P': + case 'P': skipping = fc->skipProv; ds = rpmdsSingle(RPMTAG_PROVIDENAME, N, EVR, Flags); dix = rpmdsFind(fc->provides, ds);