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