--- rpm-5.4.4/build/reqprov.c.overlap~ 2011-04-01 12:39:50.000000000 +0200 +++ rpm-5.4.4/build/reqprov.c 2011-11-26 02:21:00.125251492 +0100 @@ -9,6 +9,8 @@ #include #define _RPMEVR_INTERNAL #include "rpmbuild.h" +#include +#include #include "debug.h" int addReqProv(/*@unused@*/ Spec spec, Header h, @@ -110,37 +112,61 @@ int addReqProv(/*@unused@*/ Spec spec, H * TODO: auto-generated deps too */ if (flagtag && versions != NULL) { - int overlap; + int overlap = 0, res = 0; + rpmds old = rpmdsSingle(flagtag, names[len], versions[len] ? versions[len] : "", flags[len]); + rpmds new = rpmdsSingle(flagtag, N, EVR, Flags); - if(*EVR && !*versions[len]) { - overlap = 1; - flags[len] = Flags; - he->tag = flagtag; - he->t = RPM_UINT32_TYPE; - he->p.argv = (void *) &Flags; - xx = headerMod(h, he, 0); - } else { + overlap = rpmdsCompare(new, old); + + 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) || !(flags[len] & RPMSENSE_MISSINGOK)) { + flags[len] &= ~RPMSENSE_MISSINGOK; + Flags &= ~RPMSENSE_MISSINGOK; + } + + /* merge all flags about dependency type */ + newflags = ((flags[len]| Flags) & _ALL_REQUIRES_MASK); rpmEVRparse(EVR, lEVR); rpmEVRparse(versions[len], rEVR); - lEVR->Flags = Flags | RPMSENSE_EQUAL; - rEVR->Flags = flags[len] | RPMSENSE_EQUAL; - overlap = rpmEVRoverlap(lEVR, rEVR); - if (!overlap) - if (rpmEVRoverlap(rEVR, lEVR)) - duplicate = 1; + lEVR->Flags = Flags; + rEVR->Flags = flags[len]; + + res = rpmEVRcompare(lEVR, rEVR); + /* we only update version if greater */ + if (res > 0) { + flags[len] = Flags; + + versions[len] = EVR; + he->tag = versiontag; + he->t = RPM_STRING_ARRAY_TYPE; + he->p.argv = versions; + xx = headerMod(h, he, 0); + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(old), rpmdsDNEVR(new), rpmdsDNEVR(old)); + } else if (res < 0) { + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); + } else { + rpmlog(RPMLOG_DEBUG, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); + } + + flags[len] |= newflags; + he->tag = flagtag; + he->t = RPM_UINT32_TYPE; + he->p.ui32p = flags; + xx = headerMod(h, he, 0); + lEVR = rpmEVRfree(lEVR); rEVR = rpmEVRfree(rEVR); + duplicate = 1; } - if (overlap) { - versions[len] = EVR; - he->tag = versiontag; - he->t = RPM_STRING_ARRAY_TYPE; - he->p.argv = versions; - xx = headerMod(h, he, 0); - } else + old = rpmdsFree(old); + new = rpmdsFree(new); + + if (!overlap) continue; } #else