summaryrefslogtreecommitdiff
path: root/build/reqprov.c
diff options
context:
space:
mode:
Diffstat (limited to 'build/reqprov.c')
-rw-r--r--build/reqprov.c115
1 files changed, 20 insertions, 95 deletions
diff --git a/build/reqprov.c b/build/reqprov.c
index bc2f7ea26..5fa0a1c6b 100644
--- a/build/reqprov.c
+++ b/build/reqprov.c
@@ -7,124 +7,49 @@
#include <rpm/header.h>
#include <rpm/rpmstring.h>
-#include "build/rpmbuild_misc.h"
+#include <rpm/rpmlog.h>
+#include "build/rpmbuild_internal.h"
#include "debug.h"
-static int isNewDep(Header h, rpmTagVal nametag,
- const char *N, const char *EVR, rpmsenseFlags Flags,
- rpmTagVal indextag, uint32_t index)
-{
- int isnew = 1;
- struct rpmtd_s idx;
- rpmds ads = rpmdsNew(h, nametag, 0);
- rpmds bds = rpmdsSingle(nametag, N, EVR, Flags);
-
- if (indextag) {
- headerGet(h, indextag, &idx, HEADERGET_MINMEM);
- }
-
- /* XXX there's no guarantee the ds is sorted here so rpmdsFind() wont do */
- rpmdsInit(ads);
- while (isnew && rpmdsNext(ads) >= 0) {
- if (!rstreq(rpmdsN(ads), rpmdsN(bds))) continue;
- if (!rstreq(rpmdsEVR(ads), rpmdsEVR(bds))) continue;
- if (rpmdsFlags(ads) != rpmdsFlags(bds)) continue;
- if (indextag && rpmtdSetIndex(&idx, rpmdsIx(ads)) >= 0 &&
- rpmtdGetNumber(&idx) != index) continue;
- isnew = 0;
- }
-
- if (indextag) {
- rpmtdFreeData(&idx);
- }
- rpmdsFree(ads);
- rpmdsFree(bds);
- return isnew;
-}
-
-int addReqProv(Header h, rpmTagVal tagN,
+int addReqProv(Package pkg, rpmTagVal tagN,
const char * N, const char * EVR, rpmsenseFlags Flags,
uint32_t index)
{
- rpmTagVal versiontag = 0;
- rpmTagVal flagtag = 0;
- rpmTagVal indextag = 0;
- rpmsenseFlags extra = RPMSENSE_ANY;
+ rpmds newds, *dsp = NULL;
- switch (tagN) {
- case RPMTAG_PROVIDENAME:
- versiontag = RPMTAG_PROVIDEVERSION;
- flagtag = RPMTAG_PROVIDEFLAGS;
- extra = Flags & RPMSENSE_FIND_PROVIDES;
- break;
- case RPMTAG_OBSOLETENAME:
- versiontag = RPMTAG_OBSOLETEVERSION;
- flagtag = RPMTAG_OBSOLETEFLAGS;
- break;
- case RPMTAG_CONFLICTNAME:
- versiontag = RPMTAG_CONFLICTVERSION;
- flagtag = RPMTAG_CONFLICTFLAGS;
- break;
- case RPMTAG_ORDERNAME:
- versiontag = RPMTAG_ORDERVERSION;
- flagtag = RPMTAG_ORDERFLAGS;
- break;
- case RPMTAG_TRIGGERNAME:
- versiontag = RPMTAG_TRIGGERVERSION;
- flagtag = RPMTAG_TRIGGERFLAGS;
- indextag = RPMTAG_TRIGGERINDEX;
- extra = Flags & RPMSENSE_TRIGGER;
- break;
- case RPMTAG_SUGGESTSNAME:
- versiontag = RPMTAG_SUGGESTSVERSION;
- flagtag = RPMTAG_SUGGESTSFLAGS;
- extra = Flags & _ALL_REQUIRES_MASK;
- break;
- case RPMTAG_ENHANCESNAME:
- versiontag = RPMTAG_ENHANCESVERSION;
- flagtag = RPMTAG_ENHANCESFLAGS;
- extra = Flags & _ALL_REQUIRES_MASK;
- break;
- case RPMTAG_REQUIRENAME:
- default:
- tagN = RPMTAG_REQUIRENAME;
- versiontag = RPMTAG_REQUIREVERSION;
- flagtag = RPMTAG_REQUIREFLAGS;
- extra = Flags & _ALL_REQUIRES_MASK;
- }
+ dsp = packageDependencies(pkg, tagN);
/* rpmlib() dependency sanity: only requires permitted, ensure sense bit */
if (rstreqn(N, "rpmlib(", sizeof("rpmlib(")-1)) {
if (tagN != RPMTAG_REQUIRENAME) return 1;
- extra |= RPMSENSE_RPMLIB;
+ Flags |= RPMSENSE_RPMLIB;
}
- Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
+ newds = rpmdsSinglePoolTix(pkg->pool, tagN, N, EVR,
+ rpmSanitizeDSFlags(tagN, Flags), index);
- if (EVR == NULL)
- EVR = "";
-
- /* Avoid adding duplicate dependencies. */
- if (isNewDep(h, tagN, N, EVR, Flags, indextag, index)) {
- headerPutString(h, tagN, N);
- headerPutString(h, versiontag, EVR);
- headerPutUint32(h, flagtag, &Flags, 1);
- if (indextag) {
- headerPutUint32(h, indextag, &index, 1);
- }
- }
+ rpmdsMerge(dsp, newds);
+ rpmdsFree(newds);
return 0;
}
-int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
+rpmRC addReqProvPkg(void *cbdata, rpmTagVal tagN,
+ const char * N, const char *EVR, rpmsenseFlags Flags,
+ int index)
+{
+ Package pkg = cbdata;
+ return addReqProv(pkg, tagN, N, EVR, Flags, index) ? RPMRC_FAIL : RPMRC_OK;
+}
+
+int rpmlibNeedsFeature(Package pkg, const char * feature, const char * featureEVR)
{
char *reqname = NULL;
int res;
rasprintf(&reqname, "rpmlib(%s)", feature);
- res = addReqProv(h, RPMTAG_REQUIRENAME, reqname, featureEVR,
+ res = addReqProv(pkg, RPMTAG_REQUIRENAME, reqname, featureEVR,
RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
free(reqname);