add versions to provides.
authorjbj <devnull@localhost>
Thu, 22 Jul 1999 17:48:31 +0000 (17:48 +0000)
committerjbj <devnull@localhost>
Thu, 22 Jul 1999 17:48:31 +0000 (17:48 +0000)
CVS patchset: 3196
CVS date: 1999/07/22 17:48:31

CHANGES
build/parsePreamble.c
build/parseReqs.c
build/reqprov.c
lib/depends.c
lib/depends.h
lib/rpmdb.c
lib/rpmlib.h
lib/uninstall.c
po/rpm.pot

diff --git a/CHANGES b/CHANGES
index d31b20d..6af7b9c 100644 (file)
--- a/CHANGES
+++ b/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).
index fe00f30..6e7841e 100644 (file)
@@ -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"},
index f2a753e..89c78d1 100644 (file)
@@ -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:
index 53d6f8d..1a79b5b 100644 (file)
@@ -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) {
index 02ba24d..749577c 100644 (file)
@@ -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])) {
index 3543fd7..269d543 100644 (file)
@@ -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
 }
index 0ad39a1..9c300c1 100644 (file)
@@ -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);
index a09a81b..fab9772 100644 (file)
@@ -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)
 
index ab5474a..22aa861 100644 (file)
@@ -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);
index 181b08b..866465d 100644 (file)
@@ -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 ""