rpm/rpm-5.4.4-fix-removal-of-overlapping-dependencies.patch

96 lines
3 KiB
Diff
Raw Normal View History

2012-08-01 14:59:23 +04:00
--- 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 <rpmiotypes.h>
#define _RPMEVR_INTERNAL
#include "rpmbuild.h"
+#include <rpmds.h>
+#include <rpmlog.h>
#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