fix: version compares compatible with epoch-less requires/conflicts.

CVS patchset: 3323
CVS date: 1999/09/24 14:54:23
This commit is contained in:
jbj 1999-09-24 14:54:23 +00:00
parent cdaf55aa9c
commit aa3a086ba2
5 changed files with 141 additions and 41 deletions

View File

@ -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).

View 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;

View 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);

View 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 "dependencies: looking for %s\n"
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 "%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 ""

View 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);