--- rpm-5.4.7/build/reqprov.c.equal_overlap~ 2012-03-13 15:06:59.272736274 +0100 +++ rpm-5.4.7/build/reqprov.c 2012-03-13 16:37:17.389488443 +0100 @@ -128,12 +128,14 @@ int addReqProv(/*@unused@*/ Spec spec, H #define RPMSENSE_SCRIPTS (RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_VERIFY) if (!((Flags & RPMSENSE_GREATER && flags[len] & RPMSENSE_LESS) || (Flags & RPMSENSE_LESS && flags[len] & RPMSENSE_GREATER)) && + /* R: foo >= 1 cannot overlap R: foo <= 1*/ + !(((Flags & RPMSENSE_GREATER) && (flags[len] & RPMSENSE_LESS)) || + ((flags[len] & RPMSENSE_GREATER) && (Flags & RPMSENSE_LESS))) && /* do not merge script dependencies with non-script dependencies */ !(((Flags & RPMSENSE_SCRIPTS) && !(flags[len] & RPMSENSE_SCRIPTS)) || ((flags[len] & RPMSENSE_SCRIPTS) && !(Flags & RPMSENSE_SCRIPTS)))) overlap = rpmdsCompare(new, old); #undef RPMSENSE_SCRIPTS - if (overlap) { EVR_t lEVR = rpmEVRnew(RPMSENSE_ANY, 0), rEVR = rpmEVRnew(RPMSENSE_ANY, 0); @@ -165,8 +167,11 @@ int addReqProv(/*@unused@*/ Spec spec, H 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 if (flags[len] != Flags) + else if (flags[len] != Flags) { + if (((Flags & RPMSENSE_SENSEMASK) == RPMSENSE_EQUAL && (flags[len] & (RPMSENSE_GREATER|RPMSENSE_LESS)))) + flags[len] &= ~(RPMSENSE_GREATER|RPMSENSE_LESS); rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); + } flags[len] |= newflags; he->tag = flagtag; --- rpm-5.4.7/lib/rpmfc.c.equal_overlap~ 2012-03-13 15:07:42.416787385 +0100 +++ rpm-5.4.7/lib/rpmfc.c 2012-03-13 16:37:24.110497118 +0100 @@ -502,11 +502,12 @@ assert(EVR != NULL); ds = rpmdsSingle(tagN, N, EVR, Flags); + int overlap = 0; #if defined(RPM_VENDOR_MANDRIVA) /* filter-overlapping-dependencies */ /* XXX: should really share same code path as with what's in * build/reqprov.c:addReqProv() */ - int overlap = 0, res = 0; + int res = 0; if (*depsp) { int ix = rpmdsSearch(*depsp, ds); if (ix >= 0) { @@ -516,6 +517,9 @@ assert(EVR != NULL); #define RPMSENSE_SCRIPTS (RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_VERIFY) if (!((Flags & RPMSENSE_GREATER && (*depsp)->Flags[(*depsp)->i] & RPMSENSE_LESS) || (Flags & RPMSENSE_LESS && (*depsp)->Flags[(*depsp)->i] & RPMSENSE_GREATER)) && + /* R: foo >= 1 cannot overlap R: foo <= 1*/ + !(((Flags & RPMSENSE_GREATER) && ((*depsp)->Flags[(*depsp)->i] & RPMSENSE_LESS)) || + (((*depsp)->Flags[(*depsp)->i] & RPMSENSE_GREATER) && (Flags & RPMSENSE_LESS))) && /* do not merge script dependencies with non-script dependencies */ !(((Flags & RPMSENSE_SCRIPTS) && !((*depsp)->Flags[(*depsp)->i] & RPMSENSE_SCRIPTS)) || (((*depsp)->Flags[(*depsp)->i] & RPMSENSE_SCRIPTS) && !(Flags & RPMSENSE_SCRIPTS)))) @@ -554,8 +558,11 @@ assert(EVR != NULL); rpmlog(RPMLOG_WARNING, "%s (%s) overlaps %s (%s), removing %s\n", rpmdsDNEVR(*depsp), ix < (int)fc->nfiles ? fc->fn[ix] + fc->brlen : "explicit", rpmdsDNEVR(ds), fc->fn[fc->ix] + fc->brlen, rpmdsDNEVR(*depsp)); } else if (res < 0) rpmlog(RPMLOG_WARNING, "%s (%s) overlaps %s (%s), removing %s\n", rpmdsDNEVR(ds), fc->fn[fc->ix] + fc->brlen, rpmdsDNEVR(*depsp), ix < (int)fc->nfiles ? fc->fn[ix] + fc->brlen : "explicit", rpmdsDNEVR(ds)); - else + else if ((*depsp)->Flags[(*depsp)->i] != Flags) { + if (((Flags & RPMSENSE_SENSEMASK) == RPMSENSE_EQUAL) && ((*depsp)->Flags[(*depsp)->i] & (RPMSENSE_GREATER|RPMSENSE_LESS))) + (*depsp)->Flags[(*depsp)->i] &= ~(RPMSENSE_GREATER|RPMSENSE_LESS); rpmlog(RPMLOG_WARNING, "%s (%s) overlaps %s (%s), removing %s and merging flags\n", rpmdsDNEVR(ds), fc->fn[fc->ix] + fc->brlen, rpmdsDNEVR(*depsp), ix < (int)fc->nfiles ? fc->fn[ix] + fc->brlen : "explicit", rpmdsDNEVR(ds)); + } (*depsp)->Flags[(*depsp)->i] |= newflags;