fix: version compares compatible with epoch-less requires/conflicts.
authorjbj <devnull@localhost>
Fri, 24 Sep 1999 14:54:23 +0000 (14:54 +0000)
committerjbj <devnull@localhost>
Fri, 24 Sep 1999 14:54:23 +0000 (14:54 +0000)
CVS patchset: 3323
CVS date: 1999/09/24 14:54:23

CHANGES
lib/depends.c
lib/messages.c
po/rpm.pot
rpmio/messages.c

diff --git a/CHANGES b/CHANGES
index 686a6f2..6dd7f66 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -60,6 +60,7 @@
        - glibc2: permit run time leak detection.
        - fix: removed files fingerprint memory leak.
        - fix: resurrect allfiles flag from rpm-2.5.x.
+       - fix: version compares compatible with epoch-less requires/conflicts.
 
 3.0.1 -> 3.0.2
        - eliminate armv4 entries from rpmrc (Andrew E. Mileski).
index 633485d..8e1e504 100644 (file)
@@ -299,6 +299,8 @@ static int rpmFlags = RPMSENSE_EQUAL;
 static int rangesOverlap(const char *AName, const char *AEVR, int AFlags,
        const char *BName, const char *BEVR, int BFlags)
 {
+    const char *aDepend = printDepend(AName, AEVR, AFlags);
+    const char *bDepend = printDepend(BName, BEVR, BFlags);
     char *aEVR, *bEVR;
     const char *aE, *aV, *aR, *bE, *bV, *bR;
     int result;
@@ -332,10 +334,11 @@ static int rangesOverlap(const char *AName, const char *AEVR, int AFlags,
     sense = 0;
     if (aE && *aE && bE && *bE)
        sense = rpmvercmp(aE, bE);
-    else if (aE && *aE)
-       sense = 1;
-    else if (bE && *bE)
+    else if (aE && *aE && atol(aE) > 0)
+       sense = 0; /* XXX legacy epoch-less requires/conflicts compatibility */
+    else if (bE && *bE && atol(bE) > 0)
        sense = -1;
+
     if (sense == 0) {
        sense = rpmvercmp(aV, bV);
        if (sense == 0 && aR && *aR && bR && *bR) {
@@ -359,6 +362,10 @@ static int rangesOverlap(const char *AName, const char *AEVR, int AFlags,
     }
 
 exit:
+    rpmMessage(RPMMESS_DEBUG, _("  %s    A %s\tB %s\n"),
+       (result ? "YES" : "NO "), aDepend, bDepend);
+    if (aDepend) xfree(aDepend);
+    if (bDepend) xfree(bDepend);
     return result;
 }
 
@@ -657,7 +664,8 @@ void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts, int
 }
 
 static /*@exposed@*/ struct availablePackage * alSatisfiesDepend(struct availableList * al,
-                const char * keyName, const char * keyEVR, int keyFlags)
+       const char *keyType, const char *keyDepend,
+       const char * keyName, const char * keyEVR, int keyFlags)
 {
     struct availableIndexEntry needle, * match;
     struct availablePackage *p;
@@ -680,6 +688,8 @@ static /*@exposed@*/ struct availablePackage * alSatisfiesDepend(struct availabl
        pEVR = buildEVR(p->epoch, p->version, p->release);
        rc = rangesOverlap(p->name, pEVR, pFlags, keyName, keyEVR, keyFlags);
        free(pEVR);
+       if (keyType && keyDepend && rc)
+           rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by added package.\n"), keyType, keyDepend);
     }  break;
     case IET_PROVIDES:
        for (i = 0; i < p->providesCount; i++) {
@@ -695,9 +705,13 @@ static /*@exposed@*/ struct availablePackage * alSatisfiesDepend(struct availabl
                        keyName, keyEVR, keyFlags);
            if (rc) break;
        }
+       if (keyType && keyDepend && rc)
+           rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by added provide.\n"), keyType, keyDepend);
        break;
     case IET_FILE:
        rc = 1;
+       if (keyType && keyDepend && rc)
+           rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by added file list.\n"), keyType, keyDepend);
        break;
     }
 
@@ -709,17 +723,15 @@ static /*@exposed@*/ struct availablePackage * alSatisfiesDepend(struct availabl
 
 /* 2 == error */
 /* 1 == dependency not satisfied */
-static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
-                            const char * keyEVR, int keyFlags,
-                            /*@out@*/struct availablePackage ** suggestion)
+static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char *keyType,
+       const char * keyName, const char * keyEVR, int keyFlags,
+       /*@out@*/struct availablePackage ** suggestion)
 {
     const char *keyDepend = printDepend(keyName, keyEVR, keyFlags);
     dbiIndexSet matches;
     int rc = 0;        /* assume dependency is satisfied */
     int i;
 
-    rpmMessage(RPMMESS_DEBUG, _("dependencies: looking for %s\n"), keyDepend);
-
     if (suggestion) *suggestion = NULL;
 
   { const char * rcProvidesString;
@@ -728,15 +740,18 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
        (rcProvidesString = rpmGetVar(RPMVAR_PROVIDES))) {
        i = strlen(keyName);
        while ((start = strstr(rcProvidesString, keyName))) {
-           if (isspace(start[i]) || start[i] == '\0' || start[i] == ',')
+           if (isspace(start[i]) || start[i] == '\0' || start[i] == ',') {
+               rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by rpmrc provides.\n"), keyType, keyDepend);
                goto exit;
+           }
            rcProvidesString = start + 1;
        }
     }
   }
 
-    if (alSatisfiesDepend(&rpmdep->addedPackages, keyName, keyEVR, keyFlags))
+    if (alSatisfiesDepend(&rpmdep->addedPackages, keyType, keyDepend, keyName, keyEVR, keyFlags)) {
        goto exit;
+    }
 
     if (rpmdep->db != NULL) {
        if (*keyName == '/') {
@@ -753,7 +768,10 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
                }
 
                dbiFreeIndexRecord(matches);
-               if (i < dbiIndexSetCount(matches)) goto exit;
+               if (i < dbiIndexSetCount(matches)) {
+                   rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by db file lists.\n"), keyType, keyDepend);
+                   goto exit;
+               }
            }
        }
 
@@ -772,7 +790,10 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
            }
 
            dbiFreeIndexRecord(matches);
-           if (i < dbiIndexSetCount(matches)) goto exit;
+           if (i < dbiIndexSetCount(matches)) {
+               rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by db provides.\n"), keyType, keyDepend);
+               goto exit;
+           }
        }
 
        if (!rpmdbFindPackage(rpmdep->db, keyName, &matches)) {
@@ -791,7 +812,10 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
            }
 
            dbiFreeIndexRecord(matches);
-           if (i < dbiIndexSetCount(matches)) goto exit;
+           if (i < dbiIndexSetCount(matches)) {
+               rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by db packages.\n"), keyType, keyDepend);
+               goto exit;
+           }
        }
 
        /*
@@ -799,14 +823,20 @@ static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * keyName,
         * version. Provide implicit rpm version in last ditch effort to
         * satisfy an rpm dependency.
         */
-       if (rangesOverlap(keyName, keyEVR, keyFlags, rpmName, rpmEVR, rpmFlags))
-           goto exit;
+       if (!strcmp(keyName, rpmName)) {
+           i = rangesOverlap(keyName, keyEVR, keyFlags, rpmName, rpmEVR, rpmFlags);
+           if (i) {
+               rpmMessage(RPMMESS_DEBUG, _("%s: %s satisfied by rpmlib version.\n"), keyType, keyDepend);
+               goto exit;
+           }
+       }
     }
 
     if (suggestion)
-       *suggestion = alSatisfiesDepend(&rpmdep->availablePackages, keyName,
-                                       keyEVR, keyFlags);
+       *suggestion = alSatisfiesDepend(&rpmdep->availablePackages, NULL, NULL,
+                               keyName, keyEVR, keyFlags);
 
+    rpmMessage(RPMMESS_DEBUG, _("%s: %s unsatisfied.\n"), keyType, keyDepend);
     rc = 1;    /* dependency is unsatisfied */
 
 exit:
@@ -850,7 +880,7 @@ static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
 
        keyDepend = printDepend(requires[i], requiresEVR[i], requireFlags[i]);
 
-       rc = unsatisfiedDepend(rpmdep, requires[i], requiresEVR[i],
+       rc = unsatisfiedDepend(rpmdep, " requires", requires[i], requiresEVR[i],
                               requireFlags[i], &suggestion);
 
        switch (rc) {
@@ -913,7 +943,7 @@ static int checkPackageDeps(rpmTransactionSet rpmdep, struct problemsSet * psp,
 
        keyDepend = printDepend(conflicts[i], conflictsEVR[i], conflictFlags[i]);
 
-       rc = unsatisfiedDepend(rpmdep, conflicts[i], conflictsEVR[i],
+       rc = unsatisfiedDepend(rpmdep, "conflicts", conflicts[i], conflictsEVR[i],
                               conflictFlags[i], NULL);
 
        /* 1 == unsatisfied, 0 == satsisfied */
@@ -1087,7 +1117,7 @@ static int addOrderedPack(rpmTransactionSet rpmdep,
        for (i = 0; rc == 0 && i < requiresCount; i++) {
            if (!(satisfyDepends || (requireFlags[i] & RPMSENSE_PREREQ)))
                continue;
-           match = alSatisfiesDepend(&rpmdep->addedPackages,
+           match = alSatisfiesDepend(&rpmdep->addedPackages, NULL, NULL,
                          requires[i], requiresEVR[i], requireFlags[i]);
            /* broken dependencies don't concern us */
            if (!match) continue;
index e968247..72595b2 100644 (file)
@@ -42,25 +42,37 @@ void rpmMessage(int level, const char * format, ...) {
            break;
            
          case RPMMESS_DEBUG:
-           fprintf(stdout, "D: ");
+           if (*format != '+')
+               fprintf(stdout, "D: ");
+           else
+               format++;
            vfprintf(stdout, format, args);
            fflush(stdout);
            break;
 
          case RPMMESS_WARNING:
-           fprintf(stderr, _("warning: "));
+           if (*format != '+')
+               fprintf(stderr, _("warning: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            break;
 
          case RPMMESS_ERROR:
-           fprintf(stderr, _("error: "));
+           if (*format != '+')
+               fprintf(stderr, _("error: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            break;
 
          case RPMMESS_FATALERROR:
-           fprintf(stderr, _("fatal error: "));
+           if (*format != '+')
+               fprintf(stderr, _("fatal error: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            exit(EXIT_FAILURE);
index c4ec101..1c99bc6 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 1999-09-23 18:29-0400\n"
+"POT-Creation-Date: 1999-09-24 10:26-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"
@@ -1972,33 +1972,78 @@ msgstr ""
 msgid "error removing record %s into %s"
 msgstr ""
 
-#: ../lib/depends.c:450
+#: ../lib/depends.c:365
+#, c-format
+msgid "  %s    A %s\tB %s\n"
+msgstr ""
+
+#: ../lib/depends.c:457
 msgid "dbrecMatchesDepFlags() failed to read header"
 msgstr ""
 
-#: ../lib/depends.c:721
+#: ../lib/depends.c:691
+#, c-format
+msgid "%s: %s satisfied by added package.\n"
+msgstr ""
+
+#: ../lib/depends.c:708
+#, c-format
+msgid "%s: %s satisfied by added provide.\n"
+msgstr ""
+
+#: ../lib/depends.c:713
+#, c-format
+msgid "%s: %s satisfied by added file list.\n"
+msgstr ""
+
+#: ../lib/depends.c:743
+#, c-format
+msgid "%s: %s satisfied by rpmrc provides.\n"
+msgstr ""
+
+#: ../lib/depends.c:771
+#, c-format
+msgid "%s: %s satisfied by db file lists.\n"
+msgstr ""
+
+#: ../lib/depends.c:793
+#, c-format
+msgid "%s: %s satisfied by db provides.\n"
+msgstr ""
+
+#: ../lib/depends.c:815
+#, c-format
+msgid "%s: %s satisfied by db packages.\n"
+msgstr ""
+
+#: ../lib/depends.c:828
+#, c-format
+msgid "%s: %s satisfied by rpmlib version.\n"
+msgstr ""
+
+#: ../lib/depends.c:838
 #, c-format
-msgid "dependencies: looking for %s\n"
+msgid "%s: %s unsatisfied.\n"
 msgstr ""
 
 #. requirements are not satisfied.
-#: ../lib/depends.c:860
+#: ../lib/depends.c:889
 #, c-format
 msgid "package %s require not satisfied: %s\n"
 msgstr ""
 
 #. conflicts exist.
-#: ../lib/depends.c:922
+#: ../lib/depends.c:951
 #, c-format
 msgid "package %s conflicts: %s\n"
 msgstr ""
 
-#: ../lib/depends.c:977 ../lib/depends.c:1281
+#: ../lib/depends.c:1006 ../lib/depends.c:1310
 #, c-format
 msgid "cannot read header at %d for dependency check"
 msgstr ""
 
-#: ../lib/depends.c:1072
+#: ../lib/depends.c:1101
 #, c-format
 msgid "loop in prerequisite chain: %s"
 msgstr ""
@@ -2361,19 +2406,19 @@ msgstr ""
 msgid "File %s is smaller than %d bytes"
 msgstr ""
 
-#: ../lib/messages.c:51
+#: ../lib/messages.c:55
 msgid "warning: "
 msgstr ""
 
-#: ../lib/messages.c:57
+#: ../lib/messages.c:64
 msgid "error: "
 msgstr ""
 
-#: ../lib/messages.c:63
+#: ../lib/messages.c:73
 msgid "fatal error: "
 msgstr ""
 
-#: ../lib/messages.c:70
+#: ../lib/messages.c:82
 msgid "internal error (rpm bug?): "
 msgstr ""
 
index e968247..72595b2 100644 (file)
@@ -42,25 +42,37 @@ void rpmMessage(int level, const char * format, ...) {
            break;
            
          case RPMMESS_DEBUG:
-           fprintf(stdout, "D: ");
+           if (*format != '+')
+               fprintf(stdout, "D: ");
+           else
+               format++;
            vfprintf(stdout, format, args);
            fflush(stdout);
            break;
 
          case RPMMESS_WARNING:
-           fprintf(stderr, _("warning: "));
+           if (*format != '+')
+               fprintf(stderr, _("warning: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            break;
 
          case RPMMESS_ERROR:
-           fprintf(stderr, _("error: "));
+           if (*format != '+')
+               fprintf(stderr, _("error: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            break;
 
          case RPMMESS_FATALERROR:
-           fprintf(stderr, _("fatal error: "));
+           if (*format != '+')
+               fprintf(stderr, _("fatal error: "));
+           else
+               format++;
            vfprintf(stderr, format, args);
            fflush(stderr);
            exit(EXIT_FAILURE);