mirror of
https://abf.rosa.ru/djam/rpm.git
synced 2025-02-23 18:33:04 +00:00
84 lines
3 KiB
Diff
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);
|