rpm/rpm-5.4.5-fix-removal-of-overlapping-dependencies-for-internal-dependency-generator.patch
2012-08-01 14:59:23 +04:00

84 lines
3 KiB
Diff

--- 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);