add versions to provides.
CVS patchset: 3196 CVS date: 1999/07/22 17:48:31
This commit is contained in:
parent
1cbea413b4
commit
0f7a33ebf8
1
CHANGES
1
CHANGES
|
@ -11,6 +11,7 @@
|
|||
- permit multiline macro expansions with comments and %if.
|
||||
- add pl translation and man pages (PLD team - from Tomasz Kloczko).
|
||||
- fix: incomplete cleanup if --rebuilddb fails (#4115).
|
||||
- add versions to provides.
|
||||
|
||||
3.0.1 -> 3.0.2
|
||||
- eliminate armv4 entries from rpmrc (Andrew E. Mileski).
|
||||
|
|
|
@ -476,7 +476,7 @@ static int handlePreambleTag(Spec spec, Package pkg, int tag, char *macro,
|
|||
}
|
||||
break;
|
||||
case RPMTAG_OBSOLETES:
|
||||
case RPMTAG_PROVIDES:
|
||||
case RPMTAG_PROVIDEFLAGS:
|
||||
case RPMTAG_BUILDREQUIRES:
|
||||
case RPMTAG_BUILDCONFLICTS:
|
||||
case RPMTAG_BUILDPREREQ:
|
||||
|
@ -554,7 +554,7 @@ static struct PreambleRec {
|
|||
/* {RPMTAG_EXCLUDE, 0, 0, "exclude"}, */
|
||||
/* {RPMTAG_EXCLUSIVE, 0, 0, "exclusive"}, */
|
||||
{RPMTAG_ICON, 0, 0, "icon"},
|
||||
{RPMTAG_PROVIDES, 0, 0, "provides"},
|
||||
{RPMTAG_PROVIDEFLAGS, 0, 0, "provides"},
|
||||
{RPMTAG_REQUIREFLAGS, 0, 0, "requires"},
|
||||
{RPMTAG_PREREQ, 0, 0, "prereq"},
|
||||
{RPMTAG_CONFLICTFLAGS, 0, 0, "conflicts"},
|
||||
|
|
|
@ -42,7 +42,7 @@ int parseRCPOT(Spec spec, Package pkg, const char *field, int tag, int index)
|
|||
int tagflags, flags;
|
||||
|
||||
switch (tag) {
|
||||
case RPMTAG_PROVIDES:
|
||||
case RPMTAG_PROVIDEFLAGS:
|
||||
tagflags = RPMSENSE_PROVIDES;
|
||||
h = pkg->header;
|
||||
break;
|
||||
|
@ -148,7 +148,6 @@ int parseRCPOT(Spec spec, Package pkg, const char *field, int tag, int index)
|
|||
}
|
||||
|
||||
switch(tag) {
|
||||
case RPMTAG_PROVIDES:
|
||||
case RPMTAG_OBSOLETES:
|
||||
case RPMTAG_BUILDPREREQ:
|
||||
case RPMTAG_PREREQ:
|
||||
|
|
|
@ -19,7 +19,9 @@ int addReqProv(Spec spec, Header h,
|
|||
int extra = 0;
|
||||
|
||||
if (flag & RPMSENSE_PROVIDES) {
|
||||
nametag = RPMTAG_PROVIDES;
|
||||
nametag = RPMTAG_PROVIDENAME;
|
||||
versiontag = RPMTAG_PROVIDEVERSION;
|
||||
flagtag = RPMTAG_PROVIDEFLAGS;
|
||||
} else if (flag & RPMSENSE_OBSOLETES) {
|
||||
nametag = RPMTAG_OBSOLETES;
|
||||
} else if (flag & RPMSENSE_CONFLICTS) {
|
||||
|
|
374
lib/depends.c
374
lib/depends.c
|
@ -5,6 +5,15 @@
|
|||
#include "depends.h"
|
||||
#include "misc.h"
|
||||
|
||||
static int headerNVR(Header h, const char **np, const char **vp, const char **rp)
|
||||
{
|
||||
int type, count;
|
||||
headerGetEntry(h, RPMTAG_NAME, &type, (void **) np, &count);
|
||||
headerGetEntry(h, RPMTAG_VERSION, &type, (void **) vp, &count);
|
||||
headerGetEntry(h, RPMTAG_RELEASE, &type, (void **) rp, &count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct orderListIndex {
|
||||
int alIndex;
|
||||
int orIndex;
|
||||
|
@ -74,13 +83,12 @@ static struct availablePackage * alAddPackage(struct availableList * al,
|
|||
p = al->list + al->size++;
|
||||
p->h = headerLink(h);
|
||||
|
||||
headerGetEntry(p->h, RPMTAG_NAME, NULL, (void **) &p->name, NULL);
|
||||
headerGetEntry(p->h, RPMTAG_VERSION, NULL, (void **) &p->version, NULL);
|
||||
headerGetEntry(p->h, RPMTAG_RELEASE, NULL, (void **) &p->release, NULL);
|
||||
headerNVR(p->h, &p->name, &p->version, &p->release);
|
||||
|
||||
p->hasEpoch = headerGetEntry(h, RPMTAG_EPOCH, NULL, (void **) &p->epoch,
|
||||
NULL);
|
||||
|
||||
if (!headerGetEntry(h, RPMTAG_PROVIDES, NULL, (void **) &p->provides,
|
||||
if (!headerGetEntry(h, RPMTAG_PROVIDENAME, NULL, (void **) &p->provides,
|
||||
&p->providesCount)) {
|
||||
p->providesCount = 0;
|
||||
p->provides = NULL;
|
||||
|
@ -173,27 +181,6 @@ static void alMakeIndex(struct availableList * al)
|
|||
}
|
||||
}
|
||||
|
||||
static struct availablePackage * alSatisfiesDepend(struct availableList * al,
|
||||
char * reqName, char * reqVersion,
|
||||
int reqFlags)
|
||||
{
|
||||
struct availableIndexEntry needle, * match;
|
||||
|
||||
if (!al->index.size) return NULL;
|
||||
|
||||
needle.entry = reqName;
|
||||
match = bsearch(&needle, al->index.index, al->index.size,
|
||||
sizeof(*al->index.index), indexcmp);
|
||||
|
||||
if (!match) return NULL;
|
||||
if (match->type != IET_NAME) return match->package;
|
||||
|
||||
if (headerMatchesDepFlags(match->package->h, reqVersion, reqFlags))
|
||||
return match->package;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int intcmp(const void * a, const void *b)
|
||||
{
|
||||
const int * aptr = a;
|
||||
|
@ -381,8 +368,186 @@ void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts, int
|
|||
free(conflicts);
|
||||
}
|
||||
|
||||
static int dbrecMatchesDepFlags(rpmTransactionSet rpmdep, int recOffset,
|
||||
char * reqVersion, int reqFlags)
|
||||
static void parseEVR(char *evr, const char **ep, const char **vp, const char **rp)
|
||||
{
|
||||
const char *epoch = NULL;
|
||||
const char *version = evr; /* assume only version is present */
|
||||
const char *release = NULL;
|
||||
char *s, *se;
|
||||
|
||||
s = evr;
|
||||
while (*s && isdigit(*s)) s++; /* s points to epoch terminator */
|
||||
se = strrchr(s, '-'); /* se points to version terminator */
|
||||
|
||||
if (*s == ':' || se) {
|
||||
if (*s == ':') {
|
||||
epoch = evr;
|
||||
*s++ = '\0';
|
||||
version = s;
|
||||
if (*epoch == '\0') epoch = "0";
|
||||
} else {
|
||||
epoch = NULL;
|
||||
version = evr;
|
||||
}
|
||||
if (se) {
|
||||
*se++ = '\0';
|
||||
release = se;
|
||||
}
|
||||
}
|
||||
if (ep) *ep = epoch;
|
||||
if (vp) *vp = version;
|
||||
if (rp) *rp = release;
|
||||
}
|
||||
|
||||
typedef int (*dbrecMatch_t) (Header h, const char *reqName, const char * reqInfo, int reqFlags);
|
||||
|
||||
static int rangeMatchesDepFlags (Header h, const char *reqName, const char * reqInfo, int reqFlags)
|
||||
{
|
||||
char ** provides;
|
||||
char ** providesVersion;
|
||||
int * providesFlags;
|
||||
int providesCount;
|
||||
const char * proEpoch = NULL;
|
||||
const char * proVersion = NULL;
|
||||
const char * proRelease = NULL;
|
||||
char *Pevr;
|
||||
const char * reqEpoch = NULL;
|
||||
const char * reqVersion = NULL;
|
||||
const char * reqRelease = NULL;
|
||||
char *Revr;
|
||||
int result;
|
||||
int sense;
|
||||
int type;
|
||||
int i;
|
||||
|
||||
if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqInfo || !strlen(reqInfo))
|
||||
return 1;
|
||||
|
||||
/* Get provides information from header */
|
||||
/*
|
||||
* Rpm prior to 3.0.3 does not have versioned provides.
|
||||
* If no provides version info is available, match any requires.
|
||||
*/
|
||||
if (!headerGetEntry(h, RPMTAG_PROVIDEVERSION, &type,
|
||||
(void **) &providesVersion, &providesCount))
|
||||
return 1;
|
||||
|
||||
headerGetEntry(h, RPMTAG_PROVIDEFLAGS, &type,
|
||||
(void **) &providesFlags, &providesCount);
|
||||
|
||||
if (!headerGetEntry(h, RPMTAG_PROVIDENAME, &type,
|
||||
(void **) &provides, &providesCount)) {
|
||||
if (providesVersion) xfree(providesVersion);
|
||||
return 0; /* XXX should never happen */
|
||||
}
|
||||
|
||||
/* Parse requires version into components */
|
||||
Revr = strdup(reqInfo);
|
||||
parseEVR(Revr, &reqEpoch, &reqVersion, &reqRelease);
|
||||
|
||||
result = 0;
|
||||
for (i = 0; i < providesCount; i++) {
|
||||
|
||||
if (strcmp(reqName, provides[i]))
|
||||
continue;
|
||||
|
||||
/* Parse provides version into components */
|
||||
Pevr = strdup(providesVersion[i]);
|
||||
parseEVR(Pevr, &proEpoch, &proVersion, &proRelease);
|
||||
|
||||
/* Compare {provides,requires} [epoch:]version[-release] range */
|
||||
sense = ((proEpoch != NULL && reqEpoch != NULL)
|
||||
? rpmvercmp(proEpoch, reqEpoch) : 0);
|
||||
if (sense == 0) {
|
||||
sense = rpmvercmp(proVersion, reqVersion);
|
||||
if (sense == 0 && proRelease && *proRelease &&
|
||||
reqRelease && *reqRelease) {
|
||||
sense = rpmvercmp(proRelease, reqRelease);
|
||||
}
|
||||
}
|
||||
free(Pevr); Pevr = NULL;
|
||||
|
||||
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
|
||||
result = 1;
|
||||
} else if ((reqFlags & RPMSENSE_EQUAL) && sense == 0) {
|
||||
result = (providesFlags[i] & RPMSENSE_EQUAL) ? 1 : 0;
|
||||
} else if ((reqFlags & RPMSENSE_GREATER) && sense > 0) {
|
||||
result = 1;
|
||||
}
|
||||
|
||||
/* If this provide matches the require, we're done */
|
||||
if (result)
|
||||
break;
|
||||
}
|
||||
|
||||
if (provides) xfree(provides);
|
||||
if (providesVersion) xfree(providesVersion);
|
||||
if (Revr) free(Revr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int headerMatchesDepFlags(Header h, const char *reqName, const char * reqInfo, int reqFlags)
|
||||
{
|
||||
const char * epoch, * version, * release;
|
||||
const char * reqEpoch = NULL;
|
||||
const char * reqVersion = NULL;
|
||||
const char * reqRelease = NULL;
|
||||
char *Revr;
|
||||
int type, count;
|
||||
int_32 * epochval;
|
||||
char buf[20];
|
||||
int result;
|
||||
int sense;
|
||||
|
||||
if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqInfo || !strlen(reqInfo))
|
||||
return 1;
|
||||
|
||||
/* Get package information from header */
|
||||
headerGetEntry(h, RPMTAG_EPOCH, &type, (void **) &epochval, &count);
|
||||
if (epochval == NULL) {
|
||||
#if defined(RPMSENSE_SERIAL)
|
||||
/* XXX old behavior looks fishy */
|
||||
if (reqFlags & RPMSENSE_SERIAL)
|
||||
return 0;
|
||||
#endif /* RPMSENSE_SERIAL */
|
||||
epoch = "0"; /* assume package is epoch 0 */
|
||||
} else {
|
||||
sprintf(buf, "%d", *epochval);
|
||||
epoch = buf;
|
||||
}
|
||||
headerGetEntry(h, RPMTAG_VERSION, &type, (void **)&version, &count);
|
||||
headerGetEntry(h, RPMTAG_RELEASE, &type, (void **)&release, &count);
|
||||
|
||||
/* Parse requires version into components */
|
||||
Revr = strdup(reqInfo);
|
||||
parseEVR(Revr, &reqEpoch, &reqVersion, &reqRelease);
|
||||
|
||||
/* Compare {package,requires} [epoch:]version[-release] */
|
||||
sense = ((reqEpoch != NULL) ? rpmvercmp(epoch, reqEpoch) : 0);
|
||||
if (sense == 0) {
|
||||
sense = rpmvercmp(version, reqVersion);
|
||||
if (sense == 0 && reqRelease && *reqRelease) {
|
||||
sense = rpmvercmp(release, reqRelease);
|
||||
}
|
||||
}
|
||||
if (Revr) free(Revr);
|
||||
|
||||
result = 0;
|
||||
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
|
||||
result = 1;
|
||||
} else if ((reqFlags & RPMSENSE_EQUAL) && sense == 0) {
|
||||
result = 1;
|
||||
} else if ((reqFlags & RPMSENSE_GREATER) && sense > 0) {
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int dbrecMatchesDepFlags(rpmTransactionSet rpmdep, int recOffset,
|
||||
const char * reqName, const char * reqVersion,
|
||||
int reqFlags, dbrecMatch_t matchDepFlags)
|
||||
{
|
||||
Header h;
|
||||
int rc;
|
||||
|
@ -393,17 +558,37 @@ static int dbrecMatchesDepFlags(rpmTransactionSet rpmdep, int recOffset,
|
|||
return 0;
|
||||
}
|
||||
|
||||
rc = headerMatchesDepFlags(h, reqVersion, reqFlags);
|
||||
rc = matchDepFlags(h, reqName, reqVersion, reqFlags);
|
||||
|
||||
headerFree(h);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct availablePackage * alSatisfiesDepend(struct availableList * al,
|
||||
const char * reqName, const char * reqVersion, int reqFlags)
|
||||
{
|
||||
struct availableIndexEntry needle, * match;
|
||||
|
||||
if (!al->index.size) return NULL;
|
||||
|
||||
needle.entry = reqName;
|
||||
match = bsearch(&needle, al->index.index, al->index.size,
|
||||
sizeof(*al->index.index), indexcmp);
|
||||
|
||||
if (!match) return NULL;
|
||||
if (match->type != IET_NAME) return match->package;
|
||||
|
||||
if (headerMatchesDepFlags(match->package->h, reqName, reqVersion, reqFlags))
|
||||
return match->package;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* 2 == error */
|
||||
/* 1 == dependency not satisfied */
|
||||
static int unsatisfiedDepend(rpmTransactionSet rpmdep, char * reqName,
|
||||
char * reqVersion, int reqFlags,
|
||||
static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * reqName,
|
||||
const char * reqVersion, int reqFlags,
|
||||
struct availablePackage ** suggestion)
|
||||
{
|
||||
dbiIndexSet matches;
|
||||
|
@ -448,8 +633,7 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, char * reqName,
|
|||
}
|
||||
}
|
||||
|
||||
if (!reqFlags && !rpmdbFindByProvides(rpmdep->db, reqName,
|
||||
&matches)) {
|
||||
if (!rpmdbFindByProvides(rpmdep->db, reqName, &matches)) {
|
||||
for (i = 0; i < dbiIndexSetCount(matches); i++) {
|
||||
unsigned int recOffset = dbiIndexRecordOffset(matches, i);
|
||||
if (bsearch(&recOffset,
|
||||
|
@ -457,7 +641,10 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, char * reqName,
|
|||
rpmdep->numRemovedPackages,
|
||||
sizeof(int), intcmp))
|
||||
continue;
|
||||
break;
|
||||
if (dbrecMatchesDepFlags(rpmdep, recOffset,
|
||||
reqName, reqVersion, reqFlags, rangeMatchesDepFlags)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dbiFreeIndexRecord(matches);
|
||||
|
@ -473,8 +660,8 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, char * reqName,
|
|||
sizeof(int), intcmp))
|
||||
continue;
|
||||
|
||||
if (dbrecMatchesDepFlags(rpmdep, recOffset,
|
||||
reqVersion, reqFlags)) {
|
||||
if (dbrecMatchesDepFlags(rpmdep, recOffset,
|
||||
reqName, reqVersion, reqFlags, headerMatchesDepFlags)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -494,11 +681,11 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, char * reqName,
|
|||
static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
||||
Header h, const char * requirement)
|
||||
{
|
||||
char ** requires, ** requiresVersion;
|
||||
char * name, * version, * release;
|
||||
char ** conflicts, ** conflictsVersion;
|
||||
const char * name, * version, * release;
|
||||
const char ** requires, ** requiresVersion;
|
||||
const char ** conflicts, ** conflictsVersion;
|
||||
int requiresCount = 0, conflictsCount;
|
||||
int type, count;
|
||||
int type;
|
||||
int i, rc;
|
||||
int ourrc = 0;
|
||||
int * requireFlags, * conflictsFlags;
|
||||
|
@ -532,11 +719,7 @@ static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
|||
rc = unsatisfiedDepend(rpmdep, requires[i], requiresVersion[i],
|
||||
requireFlags[i], &suggestion);
|
||||
if (rc == 1) {
|
||||
headerGetEntry(h, RPMTAG_NAME, &type, (void **) &name, &count);
|
||||
headerGetEntry(h, RPMTAG_VERSION, &type, (void **) &version,
|
||||
&count);
|
||||
headerGetEntry(h, RPMTAG_RELEASE, &type, (void **) &release,
|
||||
&count);
|
||||
headerNVR(h, &name, &version, &release);
|
||||
|
||||
rpmMessage(RPMMESS_DEBUG, _("package %s require not satisfied: %s\n"),
|
||||
name, requires[i]);
|
||||
|
@ -575,11 +758,7 @@ static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
|||
|
||||
/* 1 == unsatisfied, 0 == satsisfied */
|
||||
if (rc == 0) {
|
||||
headerGetEntry(h, RPMTAG_NAME, &type, (void **) &name, &count);
|
||||
headerGetEntry(h, RPMTAG_VERSION, &type, (void **) &version,
|
||||
&count);
|
||||
headerGetEntry(h, RPMTAG_RELEASE, &type, (void **) &release,
|
||||
&count);
|
||||
headerNVR(h, &name, &version, &release);
|
||||
|
||||
rpmMessage(RPMMESS_DEBUG, _("package %s conflicts: %s\n"),
|
||||
name, conflicts[i]);
|
||||
|
@ -620,7 +799,7 @@ static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
|||
}
|
||||
|
||||
static int checkPackageSet(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
||||
char * package, dbiIndexSet * matches)
|
||||
const char * package, dbiIndexSet * matches)
|
||||
{
|
||||
int i;
|
||||
Header h;
|
||||
|
@ -651,7 +830,7 @@ static int checkPackageSet(rpmTransactionSet rpmdep, struct problemsSet * psp,
|
|||
}
|
||||
|
||||
static int checkDependentPackages(rpmTransactionSet rpmdep,
|
||||
struct problemsSet * psp, char * key)
|
||||
struct problemsSet * psp, const char * key)
|
||||
{
|
||||
dbiIndexSet matches;
|
||||
int rc;
|
||||
|
@ -667,7 +846,7 @@ static int checkDependentPackages(rpmTransactionSet rpmdep,
|
|||
}
|
||||
|
||||
static int checkDependentConflicts(rpmTransactionSet rpmdep,
|
||||
struct problemsSet * psp, char * package)
|
||||
struct problemsSet * psp, const char * package)
|
||||
{
|
||||
dbiIndexSet matches;
|
||||
int rc;
|
||||
|
@ -684,81 +863,6 @@ static int checkDependentConflicts(rpmTransactionSet rpmdep,
|
|||
return rc;
|
||||
}
|
||||
|
||||
int headerMatchesDepFlags(Header h, const char * reqInfo, int reqFlags)
|
||||
{
|
||||
const char * epoch, * version, * release;
|
||||
const char * reqEpoch = NULL;
|
||||
const char * reqVersion = reqInfo;
|
||||
const char * reqRelease = NULL;
|
||||
const char *s, *se;
|
||||
int type, count;
|
||||
int_32 * epochval;
|
||||
char buf[20];
|
||||
int result = 0;
|
||||
int sense;
|
||||
|
||||
if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqInfo || !strlen(reqInfo))
|
||||
return 1;
|
||||
|
||||
/* Get package information from header */
|
||||
headerGetEntry(h, RPMTAG_EPOCH, &type, (void **) &epochval, &count);
|
||||
if (epochval == NULL) {
|
||||
#if defined(RPMSENSE_SERIAL)
|
||||
/* XXX old behavior looks fishy */
|
||||
if (reqFlags & RPMSENSE_SERIAL)
|
||||
return 0;
|
||||
#endif /* RPMSENSE_SERIAL */
|
||||
epoch = "0"; /* assume package is epoch 0 */
|
||||
} else {
|
||||
sprintf(buf, "%d", *epochval);
|
||||
epoch = buf;
|
||||
}
|
||||
headerGetEntry(h, RPMTAG_VERSION, &type, (void **)&version, &count);
|
||||
headerGetEntry(h, RPMTAG_RELEASE, &type, (void **)&release, &count);
|
||||
|
||||
/* Parse requires version into components */
|
||||
s = reqInfo;
|
||||
while (*s && isdigit(*s)) s++; /* s points to epoch terminator */
|
||||
se = strrchr(s, '-'); /* se points to version terminator */
|
||||
|
||||
if (*s == ':' || se) {
|
||||
char *rv = alloca(strlen(reqInfo) + 1);
|
||||
strcpy(rv, reqInfo);
|
||||
if (*s == ':') {
|
||||
reqEpoch = rv;
|
||||
rv[s - reqInfo] = '\0';
|
||||
reqVersion = rv + (s - reqInfo) + 1;
|
||||
if (*reqEpoch == '\0') reqEpoch = "0";
|
||||
} else {
|
||||
reqEpoch = epoch; /* XXX assume same epoch as package */
|
||||
reqVersion = rv;
|
||||
}
|
||||
if (se) {
|
||||
rv[se - reqInfo] = '\0';
|
||||
reqRelease = rv + (se - reqInfo) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Compare {package,requires} [epoch:]version[-release] */
|
||||
sense = ((reqEpoch != NULL) ? rpmvercmp(epoch, reqEpoch) : 0);
|
||||
if (sense == 0) {
|
||||
sense = rpmvercmp(version, reqVersion);
|
||||
if (sense == 0 && reqRelease && *reqRelease) {
|
||||
sense = rpmvercmp(release, reqRelease);
|
||||
}
|
||||
}
|
||||
|
||||
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
|
||||
result = 1;
|
||||
} else if ((reqFlags & RPMSENSE_EQUAL) && sense == 0) {
|
||||
result = 1;
|
||||
} else if ((reqFlags & RPMSENSE_GREATER) && sense > 0) {
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* selection status is one of:
|
||||
|
||||
-1: selected
|
||||
|
@ -772,9 +876,9 @@ static int addOrderedPack(rpmTransactionSet rpmdep,
|
|||
struct availablePackage * package,
|
||||
int * ordering, int * orderNumPtr,
|
||||
int * selected, int selectionClass,
|
||||
int satisfyDepends, char ** errorStack)
|
||||
int satisfyDepends, const char ** errorStack)
|
||||
{
|
||||
char ** requires, ** requiresVersion;
|
||||
const char ** requires, ** requiresVersion;
|
||||
int_32 * requireFlags;
|
||||
int requiresCount;
|
||||
int matchNum;
|
||||
|
@ -782,7 +886,7 @@ static int addOrderedPack(rpmTransactionSet rpmdep,
|
|||
int i, rc;
|
||||
struct availablePackage * match;
|
||||
char * errorString;
|
||||
char ** stack;
|
||||
const char ** stack;
|
||||
|
||||
*errorStack++ = package->name;
|
||||
|
||||
|
@ -877,7 +981,7 @@ int rpmdepOrder(rpmTransactionSet rpmdep)
|
|||
int * selected;
|
||||
int * ordering;
|
||||
int orderingCount;
|
||||
char ** errorStack;
|
||||
const char ** errorStack;
|
||||
struct transactionElement * newOrder;
|
||||
int newOrderCount = 0;
|
||||
struct orderListIndex * orderList, * needle, key;
|
||||
|
@ -961,7 +1065,7 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
|
|||
{
|
||||
struct availablePackage * p;
|
||||
int i, j;
|
||||
char ** provides, ** files;
|
||||
const char ** provides, ** files;
|
||||
int providesCount, fileCount;
|
||||
int type;
|
||||
char * name;
|
||||
|
@ -994,7 +1098,8 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (headerGetEntry(p->h, RPMTAG_PROVIDES, &type, (void **) &provides,
|
||||
/* XXX FIXME: provide with versions??? */
|
||||
if (headerGetEntry(p->h, RPMTAG_PROVIDENAME, &type, (void **) &provides,
|
||||
&providesCount)) {
|
||||
for (j = 0; j < providesCount; j++) {
|
||||
if (checkDependentConflicts(rpmdep, &ps, provides[j])) {
|
||||
|
@ -1025,7 +1130,8 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (headerGetEntry(h, RPMTAG_PROVIDES, NULL, (void **) &provides,
|
||||
/* XXX FIXME: provide with versions??? */
|
||||
if (headerGetEntry(h, RPMTAG_PROVIDENAME, NULL, (void **) &provides,
|
||||
&providesCount)) {
|
||||
for (j = 0; j < providesCount; j++) {
|
||||
if (checkDependentPackages(rpmdep, &ps, provides[j])) {
|
||||
|
|
|
@ -7,7 +7,7 @@ struct availablePackage {
|
|||
Header h;
|
||||
char ** provides;
|
||||
char ** files;
|
||||
char * name, * version, * release;
|
||||
const char * name, * version, * release;
|
||||
int epoch, hasEpoch, providesCount, filesCount;
|
||||
const void * key;
|
||||
rpmRelocation * relocs;
|
||||
|
@ -18,7 +18,7 @@ enum indexEntryType { IET_NAME, IET_PROVIDES, IET_FILE };
|
|||
|
||||
struct availableIndexEntry {
|
||||
struct availablePackage * package;
|
||||
char * entry;
|
||||
const char * entry;
|
||||
enum indexEntryType type;
|
||||
} ;
|
||||
|
||||
|
@ -65,7 +65,7 @@ struct problemsSet {
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int headerMatchesDepFlags(Header h, const char * reqInfo, int reqFlags);
|
||||
int headerMatchesDepFlags(Header h, const char *reqName, const char * reqInfo, int reqFlags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -446,7 +446,7 @@ int rpmdbRemove(rpmdb db, unsigned int offset, int tolerant) {
|
|||
removeIndexEntry(db->groupIndex, group, rec, tolerant, "group index");
|
||||
}
|
||||
|
||||
if (headerGetEntry(h, RPMTAG_PROVIDES, &type, (void **) &providesList,
|
||||
if (headerGetEntry(h, RPMTAG_PROVIDENAME, &type, (void **) &providesList,
|
||||
&count)) {
|
||||
for (i = 0; i < count; i++) {
|
||||
rpmMessage(RPMMESS_DEBUG, _("removing provides index for %s\n"),
|
||||
|
@ -573,7 +573,7 @@ int rpmdbAdd(rpmdb db, Header dbentry) {
|
|||
count = 0;
|
||||
headerGetEntry(dbentry, RPMTAG_FILENAMES, &type, (void **) &fileList,
|
||||
&count);
|
||||
headerGetEntry(dbentry, RPMTAG_PROVIDES, &type, (void **) &providesList,
|
||||
headerGetEntry(dbentry, RPMTAG_PROVIDENAME, &type, (void **) &providesList,
|
||||
&providesCount);
|
||||
headerGetEntry(dbentry, RPMTAG_REQUIRENAME, &type,
|
||||
(void **) &requiredbyList, &requiredbyCount);
|
||||
|
|
13
lib/rpmlib.h
13
lib/rpmlib.h
|
@ -79,7 +79,8 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
|
|||
#define RPMTAG_SOURCERPM 1044
|
||||
#define RPMTAG_FILEVERIFYFLAGS 1045
|
||||
#define RPMTAG_ARCHIVESIZE 1046
|
||||
#define RPMTAG_PROVIDES 1047
|
||||
#define RPMTAG_PROVIDENAME 1047
|
||||
#define RPMTAG_PROVIDES RPMTAG_PROVIDENAME /* backward comaptibility */
|
||||
#define RPMTAG_REQUIREFLAGS 1048
|
||||
#define RPMTAG_REQUIRENAME 1049
|
||||
#define RPMTAG_REQUIREVERSION 1050
|
||||
|
@ -135,6 +136,10 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
|
|||
#define RPMTAG_BUILDREQUIRES 1109 /* internal */
|
||||
#define RPMTAG_BUILDCONFLICTS 1110 /* internal */
|
||||
#define RPMTAG_BUILDMACROS 1111
|
||||
#define RPMTAG_PROVIDEFLAGS 1112
|
||||
#define RPMTAG_PROVIDEVERSION 1113
|
||||
#define RPMTAG_OBSOLETEFLAGS 1114
|
||||
#define RPMTAG_OBSOLETEVERSION 1115
|
||||
|
||||
#define RPMTAG_EXTERNAL_TAG 1000000
|
||||
|
||||
|
@ -178,8 +183,8 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
|
|||
#define RPMSENSE_CONFLICTS (1 << 5) /* only used internally by builds */
|
||||
#define RPMSENSE_PREREQ (1 << 6)
|
||||
#define RPMSENSE_OBSOLETES (1 << 7) /* only used internally by builds */
|
||||
#define RPMSENSE_SENSEMASK 15 /* Mask to get senses, ie serial, */
|
||||
/* less, greater, equal. */
|
||||
#define RPMSENSE_SENSEMASK 15 /* Mask to get senses, ie serial, */
|
||||
/* less, greater, equal. */
|
||||
|
||||
#define RPMSENSE_TRIGGERIN (1 << 16)
|
||||
#define RPMSENSE_TRIGGERUN (1 << 17)
|
||||
|
@ -244,7 +249,7 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
|
|||
/* #define RPMVAR_HTTPPROXY 53 -- No longer used */
|
||||
/* #define RPMVAR_HTTPPORT 54 -- No longer used */
|
||||
|
||||
#define RPMVAR_NUM 55 /* number of RPMVAR entries */
|
||||
#define RPMVAR_NUM 55 /* number of RPMVAR entries */
|
||||
|
||||
#define xfree(_p) free((void *)_p)
|
||||
|
||||
|
|
|
@ -418,8 +418,9 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense, Header sourc
|
|||
else
|
||||
skip = 0;
|
||||
|
||||
if (!headerMatchesDepFlags(sourceH, triggerVersions[i] + skip,
|
||||
triggerFlags[i])) continue;
|
||||
if (!headerMatchesDepFlags(sourceH, triggerNames[i],
|
||||
triggerVersions[i] + skip, triggerFlags[i]))
|
||||
continue;
|
||||
|
||||
headerGetEntry(triggeredH, RPMTAG_TRIGGERINDEX, NULL,
|
||||
(void **) &triggerIndices, NULL);
|
||||
|
|
18
po/rpm.pot
18
po/rpm.pot
|
@ -6,7 +6,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 1999-07-20 16:49-0400\n"
|
||||
"POT-Creation-Date: 1999-07-22 13:35-0400\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -1831,12 +1831,12 @@ msgstr ""
|
|||
msgid "line %d: Versioned file name not permitted: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../build/parseReqs.c:156
|
||||
#: ../build/parseReqs.c:155
|
||||
#, c-format
|
||||
msgid "line %d: Version not permitted: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../build/parseReqs.c:176
|
||||
#: ../build/parseReqs.c:175
|
||||
#, c-format
|
||||
msgid "line %d: Version required: %s"
|
||||
msgstr ""
|
||||
|
@ -1995,31 +1995,31 @@ msgstr ""
|
|||
msgid "error removing record %s into %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:392
|
||||
#: ../lib/depends.c:557
|
||||
msgid "dbrecMatchesDepFlags() failed to read header"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:414
|
||||
#: ../lib/depends.c:599
|
||||
#, c-format
|
||||
msgid "dependencies: looking for %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:541
|
||||
#: ../lib/depends.c:724
|
||||
#, c-format
|
||||
msgid "package %s require not satisfied: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:584
|
||||
#: ../lib/depends.c:763
|
||||
#, c-format
|
||||
msgid "package %s conflicts: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:637 ../lib/depends.c:1014
|
||||
#: ../lib/depends.c:816 ../lib/depends.c:1119
|
||||
#, c-format
|
||||
msgid "cannot read header at %d for dependency check"
|
||||
msgstr ""
|
||||
|
||||
#: ../lib/depends.c:804
|
||||
#: ../lib/depends.c:908
|
||||
#, c-format
|
||||
msgid "loop in prerequisite chain: %s"
|
||||
msgstr ""
|
||||
|
|
Loading…
Reference in New Issue