summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/depends.c37
-rw-r--r--lib/depends.h2
-rw-r--r--lib/problems.c30
-rw-r--r--lib/psm.c2
-rw-r--r--lib/psm.h2
-rw-r--r--lib/rpmal.c103
-rw-r--r--lib/rpmal.h28
-rw-r--r--lib/rpmcli.h2
-rw-r--r--lib/rpmds.c104
-rw-r--r--lib/rpmds.h39
-rw-r--r--lib/rpminstall.c10
-rw-r--r--lib/rpmlib.h18
-rw-r--r--lib/transaction.c7
-rw-r--r--lib/verify.c31
-rw-r--r--po/rpm.pot138
-rw-r--r--python/rpmmodule.c56
-rw-r--r--rpm.spec.in2
-rw-r--r--rpmio/rpmmessages.h6
18 files changed, 424 insertions, 193 deletions
diff --git a/lib/depends.c b/lib/depends.c
index adb4b6ee2..ed84dc7c0 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -254,7 +254,7 @@ static int removePackage(rpmTransactionSet ts, int dboffset,
return 0;
}
-char * hGetNVR(Header h, const char ** np )
+char * hGetNVR(Header h, const char ** np)
{
const char * n, * v, * r;
char * NVR, * t;
@@ -272,7 +272,7 @@ char * hGetNVR(Header h, const char ** np )
}
int rpmtransAddPackage(rpmTransactionSet ts, Header h, FD_t fd,
- const void * key, int upgrade, rpmRelocation * relocs)
+ fnpyKey key, int upgrade, rpmRelocation * relocs)
{
int scareMem = _DS_SCAREMEM;
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
@@ -353,7 +353,7 @@ int rpmtransAddPackage(rpmTransactionSet ts, Header h, FD_t fd,
ts->order = xrealloc(ts->order, ts->orderAlloced * sizeof(*ts->order));
}
/* XXX cast assumes that available keys are indices, not pointers */
- pkgKey = alAddPackage(ts->addedPackages, (alKey)apx, h);
+ pkgKey = alAddPackage(ts->addedPackages, (alKey)apx, key, h);
if (pkgKey == RPMAL_NOMATCH) {
ec = 1;
goto exit;
@@ -504,13 +504,10 @@ exit:
return ec;
}
-void rpmtransAvailablePackage(rpmTransactionSet ts, Header h,
- /*@unused@*/ const void * key)
+void rpmtransAvailablePackage(rpmTransactionSet ts, Header h, fnpyKey key)
{
- alKey pkgKey;
-
/* XXX FIXME: return code RPMAL_NOMATCH is error */
- pkgKey = alAddPackage(ts->availablePackages, RPMAL_NOMATCH, h);
+ (void) alAddPackage(ts->availablePackages, RPMAL_NOMATCH, key, h);
}
int rpmtransRemovePackage(rpmTransactionSet ts, int dboffset)
@@ -553,7 +550,7 @@ rpmTransactionSet rpmtransFree(rpmTransactionSet ts)
}
/*@-type@*/ /* FIX: cast? */
if (p->fd != NULL)
- p->fd = fdFree(p->fd, "alAddPackage (alFree)");
+ p->fd = fdFree(p->fd, "alAddPackage (rpmtransFree)");
/*@=type@*/
}
pi = teFreeIterator(pi);
@@ -679,7 +676,7 @@ static int unsatisfiedDepend(rpmTransactionSet ts, rpmDepSet key)
}
/* Search added packages for the dependency. */
- if (alSatisfiesDepend(ts->addedPackages, key) != RPMAL_NOMATCH)
+ if (alSatisfiesDepend(ts->addedPackages, key, NULL) != NULL)
goto exit;
/* XXX only the installer does not have the database open here. */
@@ -815,18 +812,16 @@ static int checkPackageDeps(rpmTransactionSet ts, problemsSet psp,
case 0: /* requirements are satisfied. */
/*@switchbreak@*/ break;
case 1: /* requirements are not satisfied. */
- { const alKey * suggestedPkgs;
-
- suggestedPkgs = NULL;
+ { fnpyKey * suggestedKeys = NULL;
/*@-branchstate@*/
if (ts->availablePackages != NULL) {
- suggestedPkgs =
- alAllSatisfiesDepend(ts->availablePackages, requires);
+ suggestedKeys = alAllSatisfiesDepend(ts->availablePackages,
+ requires, NULL);
}
/*@=branchstate@*/
- dsProblem(psp, h, requires, suggestedPkgs);
+ dsProblem(psp, h, requires, suggestedKeys);
}
/*@switchbreak@*/ break;
@@ -1149,6 +1144,7 @@ static inline int addRelation(rpmTransactionSet ts,
teIterator qi; transactionElement q;
tsortInfo tsi;
const char * Name;
+ fnpyKey key;
alKey pkgKey;
int i = 0;
@@ -1159,7 +1155,8 @@ static inline int addRelation(rpmTransactionSet ts,
if (!strncmp(Name, "rpmlib(", sizeof("rpmlib(")-1))
return 0;
- pkgKey = alSatisfiesDepend(ts->addedPackages, requires);
+ pkgKey = RPMAL_NOMATCH;
+ key = alSatisfiesDepend(ts->addedPackages, requires, &pkgKey);
if (_te_debug)
fprintf(stderr, "addRelation: pkgKey %ld\n", (long)pkgKey);
@@ -1176,14 +1173,16 @@ fprintf(stderr, "addRelation: pkgKey %ld\n", (long)pkgKey);
break;
}
qi = teFreeIterator(qi);
+ if (q == NULL)
+ return 0;
#if defined(DEPENDENCY_WHITEOUT)
/* Avoid certain dependency relations. */
- if (q == NULL || ignoreDep(p, q))
+ if (ignoreDep(p, q))
return 0;
#endif
- i = (q ? q - ts->order : -1);
+ i = q - ts->order;
/*@-nullpass -nullderef@*/
if (_te_debug)
diff --git a/lib/depends.h b/lib/depends.h
index 28d857386..d34552867 100644
--- a/lib/depends.h
+++ b/lib/depends.h
@@ -89,7 +89,7 @@ struct transactionElement_s {
int_32 filesCount; /* (TR_ADDED) No. files in package. */
/*@kept@*//*@null@*/
- const void * key;
+ fnpyKey key;
/*!< (TR_ADDED) Retrieval key (CLI uses file name, e.g.). */
/*@owned@*/ /*@null@*/
rpmRelocation * relocs;
diff --git a/lib/problems.c b/lib/problems.c
index 5588237e0..eeaa3ecfe 100644
--- a/lib/problems.c
+++ b/lib/problems.c
@@ -10,7 +10,7 @@
#include "misc.h"
#include "debug.h"
-/*@access alKey@*/
+/*@access fnpyKey@*/
/*@access rpmProblem@*/
/*@access rpmProblemSet@*/
/*@access rpmDependencyConflict@*/
@@ -43,7 +43,7 @@ void rpmProblemSetFree(rpmProblemSet tsprobs)
}
void rpmProblemSetAppend(rpmProblemSet tsprobs, rpmProblemType type,
- const char * pkgNEVR, const void * key,
+ const char * pkgNEVR, fnpyKey key,
const char * dn, const char * bn,
const char * altNEVR, unsigned long ulong1)
{
@@ -157,6 +157,7 @@ static int sameProblem(const rpmDependencyConflict ap,
/*@*/
{
+#ifdef DYING
if (ap->sense != bp->sense)
return 1;
@@ -173,6 +174,12 @@ static int sameProblem(const rpmDependencyConflict ap,
return 1;
if (ap->needsFlags && bp->needsFlags && ap->needsFlags != bp->needsFlags)
return 1;
+#else
+ if (ap->byNEVR && bp->byNEVR && strcmp(ap->byNEVR, bp->byNEVR))
+ return 1;
+ if (ap->needsNEVR && bp->needsNEVR && strcmp(ap->needsNEVR, bp->needsNEVR))
+ return 1;
+#endif
return 0;
}
@@ -181,10 +188,12 @@ static int sameProblem(const rpmDependencyConflict ap,
rpmDependencyConflict rpmdepFreeConflicts(rpmDependencyConflict conflicts,
int numConflicts)
{
+ rpmDependencyConflict c;
int i;
if (conflicts)
for (i = 0; i < numConflicts; i++) {
+#ifdef DYING
conflicts[i].byHeader = headerFree(conflicts[i].byHeader, "problem");
conflicts[i].byName = _free(conflicts[i].byName);
conflicts[i].byVersion = _free(conflicts[i].byVersion);
@@ -194,6 +203,14 @@ rpmDependencyConflict rpmdepFreeConflicts(rpmDependencyConflict conflicts,
/*@-evalorder@*/
conflicts[i].suggestedPkgs = _free(conflicts[i].suggestedPkgs);
/*@=evalorder@*/
+#else
+ c = conflicts + i;
+ c->byNEVR = _free(c->byNEVR);
+ c->needsNEVR = _free(c->needsNEVR);
+ /*@-evalorder@*/
+ c->suggestedKeys = _free(c->suggestedKeys);
+ /*@=evalorder@*/
+#endif
}
return (conflicts = _free(conflicts));
@@ -203,6 +220,7 @@ rpmDependencyConflict rpmdepFreeConflicts(rpmDependencyConflict conflicts,
void printDepProblems(FILE * fp,
const rpmDependencyConflict conflicts, int numConflicts)
{
+ rpmDependencyConflict c;
int i;
for (i = 0; i < numConflicts; i++) {
@@ -216,6 +234,7 @@ void printDepProblems(FILE * fp,
if (j < i)
continue;
+#ifdef DYING
fprintf(fp, "\t%s", conflicts[i].needsName);
if (conflicts[i].needsFlags)
printDepFlags(fp, conflicts[i].needsVersion,
@@ -227,6 +246,13 @@ void printDepProblems(FILE * fp,
else
fprintf(fp, _(" conflicts with %s-%s-%s\n"), conflicts[i].byName,
conflicts[i].byVersion, conflicts[i].byRelease);
+#else
+ c = conflicts + i;
+ fprintf(fp, "\t%s %s %s\n", c->needsNEVR+2,
+ ((c->needsNEVR[0] == 'C' && c->needsNEVR[1] == ' ')
+ ? _("conflicts with") : _("is needed by")),
+ c->byNEVR);
+#endif
}
}
diff --git a/lib/psm.c b/lib/psm.c
index 0d26c70eb..0f159be53 100644
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -549,7 +549,7 @@ Header relocateFileList(const rpmTransactionSet ts, TFI_t fi,
return h;
}
-const void * rpmfiGetKey(TFI_t fi)
+fnpyKey rpmfiGetKey(TFI_t fi)
{
/*@-compdef -retexpose -usereleased@*/
return fi->key;
diff --git a/lib/psm.h b/lib/psm.h
index 2c3f35f20..404d179ff 100644
--- a/lib/psm.h
+++ b/lib/psm.h
@@ -51,7 +51,7 @@ struct transactionFileInfo_s {
uint_32 multiLib; /* MULTILIB */
/*@null@*/
- const void * key; /*!< Package notify key. */
+ fnpyKey key; /*!< Package notify key. */
/*@null@*/ /*@dependent@*/
rpmRelocation * relocs; /*!< Package file relocations. */
/*@null@*/
diff --git a/lib/rpmal.c b/lib/rpmal.c
index 76307df93..0adbd5c0a 100644
--- a/lib/rpmal.c
+++ b/lib/rpmal.c
@@ -31,9 +31,12 @@ typedef /*@abstract@*/ struct availableIndex_s * availableIndex;
/*@access alKey@*/
/*@access alNum@*/
+/*@access fnpyKey@*/
/*@access rpmFNSet@*/
+#ifdef DYING
/*@access rpmDepSet@*/
+#endif
/** \ingroup rpmdep
* Info about a single package to be installed.
@@ -61,6 +64,8 @@ struct availablePackage_s {
uint_32 multiLib; /* MULTILIB */
#endif
+ fnpyKey key; /*!< Associated file name/python object */
+
};
/** \ingroup rpmdep
@@ -206,7 +211,7 @@ rpmDepSet alGetProvides(const availableList al, alKey pkgKey)
{
availablePackage alp = alGetPkg(al, pkgKey);
/*@-retexpose@*/
- return (alp != NULL ? alp->provides : 0);
+ return (alp != NULL ? alp->provides : NULL);
/*@=retexpose@*/
}
@@ -214,7 +219,7 @@ rpmDepSet alGetRequires(const availableList al, alKey pkgKey)
{
availablePackage alp = alGetPkg(al, pkgKey);
/*@-retexpose@*/
- return (alp != NULL ? alp->requires : 0);
+ return (alp != NULL ? alp->requires : NULL);
/*@=retexpose@*/
}
@@ -452,7 +457,7 @@ fprintf(stderr, "*** del %p[%d] %s-%s-%s\n", al->list, pkgNum, alp->name, alp->v
/*@=nullstate@*/
}
-alKey alAddPackage(availableList al, alKey pkgKey, Header h)
+alKey alAddPackage(availableList al, alKey pkgKey, fnpyKey key, Header h)
/*@modifies al, h @*/
{
int scareMem = 1;
@@ -487,6 +492,9 @@ alKey alAddPackage(availableList al, alKey pkgKey, Header h)
#ifdef DYING
alp->multiLib = 0; /* MULTILIB */
#endif
+ /*@-assignexpose -temptrans @*/
+ alp->key = key;
+ /*@=assignexpose =temptrans @*/
xx = headerNVR(alp->h, &alp->name, &alp->version, &alp->release);
@@ -641,8 +649,10 @@ static int indexcmp(const void * one, const void * two)
void alAddProvides(availableList al, alKey pkgKey, rpmDepSet provides)
{
+ availableIndexEntry aie;
availableIndex ai = &al->index;
int i = alKey2Num(al, pkgKey);
+ int ix;
if (provides == NULL || i < 0 || i >= al->size)
return;
@@ -666,43 +676,53 @@ void alAddProvides(availableList al, alKey pkgKey, rpmDepSet provides)
if ((Name = dsiGetN(provides)) == NULL)
continue; /* XXX can't happen */
+ aie = ai->index + ai->k;
+ ai->k++;
+
/*@-assignexpose@*/
/*@-temptrans@*/
- ai->index[ai->k].pkgKey = pkgKey;
+ aie->pkgKey = pkgKey;
/*@=temptrans@*/
- ai->index[ai->k].entry = Name;
+ aie->entry = Name;
/*@=assignexpose@*/
- ai->index[ai->k].entryLen = strlen(Name);
-assert(provides->i < 0x10000);
- ai->index[ai->k].entryIx = provides->i;
- ai->index[ai->k].type = IET_PROVIDES;
- ai->k++;
+ aie->entryLen = strlen(Name);
+ ix = dsiGetIx(provides);
+/* XXX make sure that element index fits in unsigned short */
+assert(ix < 0x10000);
+ aie->entryIx = ix;
+ aie->type = IET_PROVIDES;
}
}
void alMakeIndex(availableList al)
{
availableIndex ai = &al->index;
+ availablePackage alp;
int i;
if (ai->size || al->list == NULL) return;
- for (i = 0; i < al->size; i++)
- if (al->list[i].provides != NULL)
- ai->size += al->list[i].provides->Count;
+ for (i = 0; i < al->size; i++) {
+ alp = al->list + i;
+ if (alp->provides != NULL)
+ ai->size += dsiGetCount(alp->provides);
+ }
if (ai->size) {
ai->index = xcalloc(ai->size, sizeof(*ai->index));
ai->k = 0;
- for (i = 0; i < al->size; i++)
- alAddProvides(al, (alKey)i, al->list[i].provides);
+ for (i = 0; i < al->size; i++) {
+ alp = al->list + i;
+ alAddProvides(al, (alKey)i, alp->provides);
+ }
qsort(ai->index, ai->size, sizeof(*ai->index), indexcmp);
}
}
-alKey * alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey *
+alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds, alKey * keyp)
{
int found = 0;
const char * dirName;
@@ -713,9 +733,11 @@ alKey * alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds)
fileIndexEntry fieNeedle =
memset(alloca(sizeof(*fieNeedle)), 0, sizeof(*fieNeedle));
fileIndexEntry fie;
- alKey * ret = NULL;
+ availablePackage alp;
+ fnpyKey * ret = NULL;
const char * fileName;
+ if (keyp) *keyp = RPMAL_NOMATCH;
if ((fileName = dsiGetN(ds)) == NULL || *fileName != '/')
return NULL;
@@ -770,9 +792,12 @@ alKey * alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds)
dsiNotify(ds, _("(added files)"), 0);
+ alp = al->list + fie->pkgNum;
ret = xrealloc(ret, (found+2) * sizeof(*ret));
if (ret) /* can't happen */
- ret[found++] = alNum2Key(al, fie->pkgNum);
+ ret[found++] = alp->key;
+ if (keyp)
+ *keyp = alNum2Key(al, fie->pkgNum);
}
/*@=branchstate@*/
@@ -792,38 +817,39 @@ exit:
* @param ds dependency
* @return available package pointer
*/
-/*@unused@*/ static /*@dependent@*/ /*@null@*/ alKey
-alFileSatisfiesDepend(const availableList al, const rpmDepSet ds)
+/*@unused@*/ static /*@dependent@*/ /*@null@*/ fnpyKey
+alFileSatisfiesDepend(const availableList al, const rpmDepSet ds, alKey * keyp)
/*@*/
{
- alKey ret = NULL;
- alKey * tmp = alAllFileSatisfiesDepend(al, ds);
+ fnpyKey * tmp = alAllFileSatisfiesDepend(al, ds, keyp);
if (tmp) {
- ret = tmp[0];
- tmp = _free(tmp);
+ fnpyKey ret = tmp[0];
+ free(tmp);
+ return ret;
}
- return ret;
+ return NULL;
}
#endif /* DYING */
-alKey *
-alAllSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey *
+alAllSatisfiesDepend(const availableList al, const rpmDepSet ds, alKey * keyp)
{
availableIndex ai = &al->index;
availableIndexEntry needle =
memset(alloca(sizeof(*needle)), 0, sizeof(*needle));
availableIndexEntry match;
- alKey * ret = NULL;
+ fnpyKey * ret = NULL;
const char * KName;
availablePackage alp;
int rc, found;
+ if (keyp) *keyp = RPMAL_NOMATCH;
if ((KName = dsiGetN(ds)) == NULL)
return ret;
if (*KName == '/') {
- ret = alAllFileSatisfiesDepend(al, ds);
+ ret = alAllFileSatisfiesDepend(al, ds, keyp);
/* XXX Provides: /path was broken with added packages (#52183). */
if (ret != NULL && *ret != NULL)
return ret;
@@ -857,10 +883,8 @@ alAllSatisfiesDepend(const availableList al, const rpmDepSet ds)
if (alp->provides != NULL) /* XXX can't happen */
switch (match->type) {
case IET_PROVIDES:
- alp->provides->i = match->entryIx;
-
/* XXX single step on dsiNext to regenerate DNEVR string */
- alp->provides->i--;
+ (void) dsiSetIx(alp->provides, match->entryIx - 1);
if (dsiNext(alp->provides) >= 0)
rc = dsCompare(alp->provides, ds);
@@ -874,7 +898,9 @@ alAllSatisfiesDepend(const availableList al, const rpmDepSet ds)
if (rc) {
ret = xrealloc(ret, (found + 2) * sizeof(*ret));
if (ret) /* can't happen */
- ret[found++] = ((alKey)(alp - al->list));
+ ret[found++] = alp->key;
+ if (keyp)
+ *keyp = ((alKey)(alp - al->list));
}
/*@=branchstate@*/
}
@@ -885,14 +911,15 @@ alAllSatisfiesDepend(const availableList al, const rpmDepSet ds)
return ret;
}
-alKey alSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey
+alSatisfiesDepend(const availableList al, const rpmDepSet ds, alKey * keyp)
{
- alKey * tmp = alAllSatisfiesDepend(al, ds);
+ fnpyKey * tmp = alAllSatisfiesDepend(al, ds, keyp);
if (tmp) {
- alKey ret = tmp[0];
- tmp = _free(tmp);
+ fnpyKey ret = tmp[0];
+ free(tmp);
return ret;
}
- return RPMAL_NOMATCH;
+ return NULL;
}
diff --git a/lib/rpmal.h b/lib/rpmal.h
index 8f8074125..d3fc4f646 100644
--- a/lib/rpmal.h
+++ b/lib/rpmal.h
@@ -126,10 +126,12 @@ void alDelPackage(availableList al, /*@null@*/ alKey pkgKey)
* Add package to available list.
* @param al available list
* @param pkgKey package key, RPMAL_NOMATCH to force an append
+ * @param key associated file name/python object
* @param h package header
* @return available package index
*/
-alKey alAddPackage(availableList al, /*@null@*/ alKey pkgKey, Header h)
+alKey alAddPackage(availableList al, /*@null@*/ alKey pkgKey,
+ fnpyKey key, Header h)
/*@modifies al, h @*/;
/**
@@ -155,36 +157,42 @@ void alMakeIndex(availableList al)
* Check added package file lists for package(s) that provide a file.
* @param al available list
* @param ds dependency set
- * @return available package pointer
+ * @retval keyp added package key pointer (or NULL)
+ * @return associated package key(s), NULL if none
*/
/*@-exportlocal@*/
/*@only@*/ /*@null@*/
-alKey * alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey * alAllFileSatisfiesDepend(const availableList al, const rpmDepSet ds,
+ /*@null@*/ alKey * keyp)
/*@globals fileSystem @*/
- /*@modifies al, fileSystem @*/;
+ /*@modifies al, *keyp, fileSystem @*/;
/*@=exportlocal@*/
/**
* Check added package file lists for package(s) that have a provide.
* @param al available list
* @param ds dependency set
- * @return available package keys
+ * @retval keyp added package key pointer (or NULL)
+ * @return associated package key(s), NULL if none
*/
/*@only@*/ /*@null@*/
-alKey * alAllSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey * alAllSatisfiesDepend(const availableList al, const rpmDepSet ds,
+ /*@null@*/ alKey * keyp)
/*@globals fileSystem @*/
- /*@modifies al, fileSystem @*/;
+ /*@modifies al, *keyp, fileSystem @*/;
/**
* Check added package file lists for first package that has a provide.
* @todo Eliminate.
* @param al available list
* @param ds dependency set
- * @return available package index, -1 on not found
+ * @retval keyp added package key pointer (or NULL)
+ * @return associated package key, NULL if none
*/
-alKey alSatisfiesDepend(const availableList al, const rpmDepSet ds)
+fnpyKey alSatisfiesDepend(const availableList al, const rpmDepSet ds,
+ /*@null@*/ alKey * keyp)
/*@globals fileSystem @*/
- /*@modifies al, fileSystem @*/;
+ /*@modifies al, *keyp, fileSystem @*/;
#ifdef __cplusplus
}
diff --git a/lib/rpmcli.h b/lib/rpmcli.h
index ef494e67d..4e4e922e8 100644
--- a/lib/rpmcli.h
+++ b/lib/rpmcli.h
@@ -408,7 +408,7 @@ extern int packagesTotal;
const rpmCallbackType what,
const unsigned long amount,
const unsigned long total,
- /*@null@*/ const void * pkgKey,
+ /*@null@*/ fnpyKey key,
/*@null@*/ void * data)
/*@globals fileSystem, internalState @*/
/*@modifies fileSystem, internalState @*/;
diff --git a/lib/rpmds.c b/lib/rpmds.c
index 47051e349..1e4320770 100644
--- a/lib/rpmds.c
+++ b/lib/rpmds.c
@@ -18,6 +18,26 @@
/*@unchecked@*/
static int _fns_debug = 0;
+/*@-shadow@*/ /* XXX copy from depends.c for now. */
+static char * hGetNVR(Header h, /*@out@*/ const char ** np)
+ /*@modifies *np @*/
+{
+ const char * n, * v, * r;
+ char * NVR, * t;
+
+ (void) headerNVR(h, &n, &v, &r);
+ NVR = t = xcalloc(1, strlen(n) + strlen(v) + strlen(r) + sizeof("--"));
+ t = stpcpy(t, n);
+ t = stpcpy(t, "-");
+ t = stpcpy(t, v);
+ t = stpcpy(t, "-");
+ t = stpcpy(t, r);
+ if (np)
+ *np = n;
+ return NVR;
+}
+/*@=shadow@*/
+
rpmFNSet fnsFree(rpmFNSet fns)
{
HFD_t hfd = headerFreeData;
@@ -55,6 +75,9 @@ rpmFNSet fnsNew(Header h, rpmTag tagN, int scareMem)
(scareMem ? (HGE_t) headerGetEntryMinMemory : (HGE_t) headerGetEntry);
rpmFNSet fns = NULL;
const char * Type;
+ const char ** N;
+ rpmTagType Nt;
+ int_32 Count;
rpmTag tagBN, tagDI, tagF, tagDN;
if (tagN == RPMTAG_BASENAMES) {
@@ -66,15 +89,21 @@ rpmFNSet fnsNew(Header h, rpmTag tagN, int scareMem)
} else
goto exit;
- fns = xcalloc(1, sizeof(*fns));
- fns->i = -1;
+ /*@-branchstate@*/
+ if (hge(h, tagBN, &Nt, (void **) &N, &Count)
+ && N != NULL && Count > 0)
+ {
+ int xx;
- fns->Type = Type;
+ fns = xcalloc(1, sizeof(*fns));
+ fns->h = (scareMem ? headerLink(h, "fnsNew") : NULL);
+ fns->i = -1;
+ fns->Type = Type;
+ fns->tagN = tagN;
+ fns->BN = N;
+ fns->BNt = Nt;
+ fns->Count = Count;
- fns->tagN = tagN;
- fns->h = (scareMem ? headerLink(h, "fnsNew") : NULL);
- if (hge(h, tagBN, &fns->BNt, (void **) &fns->BN, &fns->Count)) {
- int xx;
xx = hge(h, tagDN, &fns->DNt, (void **) &fns->DN, &fns->DCount);
xx = hge(h, tagDI, &fns->DIt, (void **) &fns->DI, NULL);
if (!scareMem && fns->DI != NULL)
@@ -84,17 +113,19 @@ rpmFNSet fnsNew(Header h, rpmTag tagN, int scareMem)
if (!scareMem && fns->Flags != NULL)
fns->Flags = memcpy(xmalloc(fns->Count * sizeof(*fns->Flags)),
fns->Flags, fns->Count * sizeof(*fns->Flags));
- } else
- fns->h = headerFree(fns->h, "fnsNew");
-
-exit:
/*@-modfilesystem@*/
if (_fns_debug)
fprintf(stderr, "*** fns %p ++ %s[%d]\n", fns, fns->Type, fns->Count);
/*@=modfilesystem@*/
- return fns;
+ }
+ /*@-branchstate@*/
+
+exit:
+ /*@-nullret@*/ /* FIX: fns->{DI,Flags} may be NULL. */
+/*@i@*/ return fns;
+ /*@=nullret@*/
}
/*@access rpmDepSet @*/
@@ -226,7 +257,7 @@ fprintf(stderr, "*** ds %p ++\t%s[%d]\n", ds, ds->Type, ds->Count);
exit:
/*@-nullret@*/ /* FIX: ds->Flags may be NULL. */
- return ds;
+/*@i@*/ return ds;
/*@=nullret@*/
}
@@ -270,6 +301,27 @@ char * dsDNEVR(const char * dspfx, const rpmDepSet ds)
return tbuf;
}
+int dsiGetCount(rpmDepSet ds)
+{
+ return (ds != NULL ? ds->Count : 0);
+}
+
+int dsiGetIx(rpmDepSet ds)
+{
+ return (ds != NULL ? ds->i : -1);
+}
+
+int dsiSetIx(rpmDepSet ds, int ix)
+{
+ int i = -1;
+
+ if (ds != NULL) {
+ i = ds->i;
+ ds->i = ix;
+ }
+ return i;
+}
+
const char * dsiGetDNEVR(rpmDepSet ds)
{
const char * DNEVR = NULL;
@@ -485,28 +537,30 @@ exit:
}
void dsProblem(problemsSet psp, Header h, const rpmDepSet ds,
- const alKey * suggestedPkgs)
+ const fnpyKey * suggestedKeys)
{
rpmDependencyConflict dcp;
const char * Name = dsiGetN(ds);
const char * DNEVR = dsiGetDNEVR(ds);
const char * EVR = dsiGetEVR(ds);
+#ifdef DYING
int_32 Flags = dsiGetFlags(ds);
const char * name, * version, * release;
int xx;
xx = headerNVR(h, &name, &version, &release);
+#else
+ char * byNEVR = hGetNVR(h, NULL);
+#endif
/*@-branchstate@*/
- if (Name == NULL) Name = "???";
- if (EVR == NULL) EVR = "???";
- if (DNEVR == NULL) DNEVR = "?????";
+ if (Name == NULL) Name = "?N?";
+ if (EVR == NULL) EVR = "?EVR?";
+ if (DNEVR == NULL) DNEVR = "? ?N? ?OP? ?EVR?";
/*@=branchstate@*/
- rpmMessage(RPMMESS_DEBUG, _("package %s-%s-%s has unsatisfied %s: %s\n"),
- name, version, release,
- ds->Type,
- DNEVR+2);
+ rpmMessage(RPMMESS_DEBUG, _("package %s has unsatisfied %s: %s\n"),
+ byNEVR, ds->Type, DNEVR+2);
if (psp->num == psp->alloced) {
psp->alloced += 5;
@@ -517,6 +571,7 @@ void dsProblem(problemsSet psp, Header h, const rpmDepSet ds,
dcp = psp->problems + psp->num;
psp->num++;
+#ifdef DYING
dcp->byHeader = headerLink(h, "dsProblem");
dcp->byName = xstrdup(name);
dcp->byVersion = xstrdup(version);
@@ -524,15 +579,18 @@ void dsProblem(problemsSet psp, Header h, const rpmDepSet ds,
dcp->needsName = xstrdup(Name);
dcp->needsVersion = xstrdup(EVR);
dcp->needsFlags = Flags;
-
if (ds->tagN == RPMTAG_REQUIRENAME)
dcp->sense = RPMDEP_SENSE_REQUIRES;
else if (ds->tagN == RPMTAG_CONFLICTNAME)
dcp->sense = RPMDEP_SENSE_CONFLICTS;
else
dcp->sense = 0;
+#else
+ dcp->byNEVR = byNEVR;
+ dcp->needsNEVR = xstrdup(DNEVR);
+#endif
- dcp->suggestedPkgs = suggestedPkgs;
+ dcp->suggestedKeys = suggestedKeys;
}
int rangeMatchesDepFlags (Header h, const rpmDepSet req)
diff --git a/lib/rpmds.h b/lib/rpmds.h
index 36150e178..5441a9a29 100644
--- a/lib/rpmds.h
+++ b/lib/rpmds.h
@@ -36,14 +36,14 @@ struct rpmFNSet_s {
/*@refcounted@*/ /*@null@*/
Header h; /*!< Header for file name set (or NULL) */
-/*@only@*/ /*@null@*/
- const char ** BN; /*!< File base name. */
-/*@only@*/ /*@null@*/
+/*@only@*/
+ const char ** BN; /*!< File base name(s). */
+/*@only@*/
const int_32 * DI; /*!< File directory index. */
-/*@only@*/ /*@null@*/
+/*@only@*/
const uint_32 * Flags; /*!< File flags. */
-/*@only@*/ /*@null@*/
- const char ** DN; /*!< Directory name. */
+/*@only@*/
+ const char ** DN; /*!< Directory name(s). */
int_32 DCount; /*!< No. of directories. */
rpmTagType BNt, DIt, Ft, DNt; /*!< Tag data types. */
int_32 Count; /*!< No. of files. */
@@ -127,6 +127,31 @@ char * dsDNEVR(const char * dspfx, const rpmDepSet ds)
/*@*/;
/**
+ * Return dependency set count.
+ * @param ds dependency set
+ * @return current count
+ */
+int dsiGetCount(/*@null@*/ rpmDepSet ds)
+ /*@*/;
+
+/**
+ * Return dependency set index.
+ * @param ds dependency set
+ * @return current index
+ */
+int dsiGetIx(/*@null@*/ rpmDepSet ds)
+ /*@*/;
+
+/**
+ * Set dependency set index.
+ * @param ds dependency set
+ * @param ix new index
+ * @return current index
+ */
+int dsiSetIx(/*@null@*/ rpmDepSet ds, int ix)
+ /*@modifies ds @*/;
+
+/**
* Return current formatted dependency string.
* @param ds dependency set
* @return current dependency DNEVR, NULL on invalid
@@ -203,7 +228,7 @@ int dsCompare(const rpmDepSet A, const rpmDepSet B)
* Report a Requires: or Conflicts: dependency problem.
*/
void dsProblem(problemsSet psp, Header h, const rpmDepSet ds,
- /*@only@*/ /*@null@*/ const alKey * suggestedPkgs)
+ /*@only@*/ /*@null@*/ const fnpyKey * suggestedKeys)
/*@modifies psp, h @*/;
/**
diff --git a/lib/rpminstall.c b/lib/rpminstall.c
index 055bd3c4c..c0043a2f6 100644
--- a/lib/rpminstall.c
+++ b/lib/rpminstall.c
@@ -74,7 +74,7 @@ void * rpmShowProgress(/*@null@*/ const void * arg,
const rpmCallbackType what,
const unsigned long amount,
const unsigned long total,
- /*@null@*/ const void * pkgKey,
+ /*@null@*/ fnpyKey key,
/*@null@*/ void * data)
/*@globals hashesPrinted, progressCurrent, progressTotal,
fileSystem @*/
@@ -87,7 +87,9 @@ void * rpmShowProgress(/*@null@*/ const void * arg,
char * s;
int flags = (int) ((long)data);
void * rc = NULL;
- const char * filename = pkgKey;
+ /*@-assignexpose -abstract @*/
+ const char * filename = (const char *)key;
+ /*@=assignexpose =abstract @*/
static FD_t fd = NULL;
switch (what) {
@@ -420,9 +422,11 @@ restart:
}
/*@-nullstate@*/ /* FIX: ts->rootDir may be NULL? */
- rc = rpmtransAddPackage(ts, eiu->h, NULL, fileName,
+ /*@-abstract@*/
+ rc = rpmtransAddPackage(ts, eiu->h, NULL, (fnpyKey)fileName,
(interfaceFlags & INSTALL_UPGRADE) != 0,
relocations);
+ /*@=abstract@*/
/*@=nullstate@*/
/* XXX reference held by transaction set */
diff --git a/lib/rpmlib.h b/lib/rpmlib.h
index 6b00370a3..6958e5fc6 100644
--- a/lib/rpmlib.h
+++ b/lib/rpmlib.h
@@ -1009,6 +1009,7 @@ void printDepFlags(FILE *fp, const char *version, int flags)
/**
*/
struct rpmDependencyConflict_s {
+#ifdef DYING
const char * byName; /*!< package name */
const char * byVersion; /*!< package version */
const char * byRelease; /*!< package release */
@@ -1020,12 +1021,19 @@ struct rpmDependencyConflict_s {
const char * needsName; /*!< dependency name */
const char * needsVersion; /*!< dependency epoch:version-release */
int needsFlags; /*!< dependency flags */
+#else
+ char * byNEVR; /*!< package name-version-release */
+ char * needsNEVR; /*!< dependency [R|C] name ?? epoch:version-release */
+#endif
/*@owned@*/ /*@null@*/
- const alKey * suggestedPkgs; /* terminated by NULL */
+ const fnpyKey * suggestedKeys; /*!< Added package keys, NULL terminated. */
+
+#ifdef DYING
enum {
RPMDEP_SENSE_REQUIRES, /*!< requirement not satisfied. */
RPMDEP_SENSE_CONFLICTS /*!< conflict was found. */
} sense;
+#endif
};
/**
@@ -1087,7 +1095,7 @@ void rpmProblemSetPrint(FILE *fp, rpmProblemSet tsprobs)
*/
void rpmProblemSetAppend(rpmProblemSet tsprobs, rpmProblemType type,
/*@only@*/ /*@null@*/ const char * pkgNEVR,
- /*@exposed@*/ /*@null@*/ const void * key,
+ /*@exposed@*/ /*@null@*/ fnpyKey key,
const char * dn, const char * bn,
/*@only@*/ /*@null@*/ const char * altNEVR,
unsigned long ulong1)
@@ -1421,7 +1429,7 @@ rpmdbMatchIterator rpmtsInitIterator(const rpmTransactionSet ts, int rpmtag,
* @return 0 on success, 1 on I/O error, 2 needs capabilities
*/
int rpmtransAddPackage(rpmTransactionSet ts, Header h, /*@null@*/ FD_t fd,
- /*@null@*/ /*@owned@*/ const void * key, int upgrade,
+ /*@null@*/ /*@owned@*/ const fnpyKey key, int upgrade,
/*@null@*/ rpmRelocation * relocs)
/*@globals fileSystem, internalState @*/
/*@modifies fd, h, ts, fileSystem, internalState @*/;
@@ -1435,7 +1443,7 @@ int rpmtransAddPackage(rpmTransactionSet ts, Header h, /*@null@*/ FD_t fd,
*/
/*@unused@*/
void rpmtransAvailablePackage(rpmTransactionSet ts, Header h,
- /*@null@*/ /*@owned@*/ const void * key)
+ /*@null@*/ /*@owned@*/ fnpyKey key)
/*@modifies h, ts @*/;
/** \ingroup rpmtrans
@@ -1483,7 +1491,7 @@ void rpmtransSetScriptFd(rpmTransactionSet ts, FD_t fd)
*/
/*@unused@*/
int rpmtransGetKeys(const rpmTransactionSet ts,
- /*@null@*/ /*@out@*/ const void *** ep,
+ /*@null@*/ /*@out@*/ fnpyKey ** ep,
/*@null@*/ /*@out@*/ int * nep)
/*@modifies ep, nep @*/;
diff --git a/lib/transaction.c b/lib/transaction.c
index b4b2f081a..f2481afa3 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -58,6 +58,7 @@ extern int statvfs (const char * file, /*@out@*/ struct statvfs * buf)
/*@access PSM_t@*/
/*@access alKey@*/
+/*@access fnpyKey@*/
/*@access TFI_t@*/
/*@access teIterator@*/
@@ -110,13 +111,13 @@ void rpmtransSetScriptFd(rpmTransactionSet ts, FD_t fd)
/*@=type@*/
}
-int rpmtransGetKeys(const rpmTransactionSet ts, const void *** ep, int * nep)
+int rpmtransGetKeys(const rpmTransactionSet ts, fnpyKey ** ep, int * nep)
{
int rc = 0;
if (nep) *nep = ts->orderCount;
if (ep) {
- const void ** e;
+ fnpyKey * e;
int oc;
*ep = e = xmalloc(ts->orderCount * sizeof(*e));
@@ -1041,7 +1042,7 @@ int keep_header = 1; /* XXX rpmProblemSetAppend prevents dumping headers. */
#endif
{
const char * n, * v, * r;
- const void * key;
+ fnpyKey key;
rpmdbMatchIterator mi;
Header h;
diff --git a/lib/verify.c b/lib/verify.c
index 6a73d713c..a2f0aac07 100644
--- a/lib/verify.c
+++ b/lib/verify.c
@@ -13,10 +13,11 @@
#include "misc.h" /* XXX for uidToUname() and gnameToGid() */
#include "debug.h"
-/*@access rpmTransactionSet*/
-/*@access TFI_t*/
-/*@access PSM_t*/
-/*@access FD_t*/ /* XXX compared with NULL */
+/*@access rpmDependencyConflict @*/
+/*@access rpmTransactionSet @*/
+/*@access TFI_t @*/
+/*@access PSM_t @*/
+/*@access FD_t @*/ /* XXX compared with NULL */
#define S_ISDEV(m) (S_ISBLK((m)) || S_ISCHR((m)))
@@ -501,26 +502,37 @@ static int verifyDependencies(/*@unused@*/ QVA_t qva, rpmTransactionSet ts,
/*@-branchstate@*/
if (numConflicts) {
+ rpmDependencyConflict c;
+#ifdef DYING
const char *n, *v, *r;
+#endif
char * t, * te;
int nb = 512;
+
+#ifdef DYING
(void) headerNVR(h, &n, &v, &r);
+#endif
/*@-type@*/ /* FIX: rpmDependencyConflict usage */
for (i = 0; i < numConflicts; i++) {
- nb += strlen(conflicts[i].needsName) + sizeof(", ") - 1;
+ c = conflicts + i;
+ nb += strlen(c->needsNEVR+2) + sizeof(", ") - 1;
+#ifdef DYING
if (conflicts[i].needsFlags)
nb += strlen(conflicts[i].needsVersion) + 5;
+#endif
}
te = t = alloca(nb);
*te = '\0';
- sprintf(te, _("Unsatisfied dependencies for %s-%s-%s: "), n, v, r);
+ sprintf(te, _("Unsatisifed dependencies for %s:"), conflicts[0].byNEVR);
te += strlen(te);
for (i = 0; i < numConflicts; i++) {
+ c = conflicts + i;
if (i) te = stpcpy(te, ", ");
- te = stpcpy(te, conflicts[i].needsName);
+#ifdef DYING
+ te = stpcpy(te, c->needsName);
if (conflicts[i].needsFlags) {
- int flags = conflicts[i].needsFlags;
+ int flags = c->needsFlags;
*te++ = ' ';
if (flags & RPMSENSE_LESS) *te++ = '<';
if (flags & RPMSENSE_GREATER) *te++ = '>';
@@ -528,6 +540,9 @@ static int verifyDependencies(/*@unused@*/ QVA_t qva, rpmTransactionSet ts,
*te++ = ' ';
te = stpcpy(te, conflicts[i].needsVersion);
}
+#else
+ te = stpcpy(te, c->needsNEVR+2);
+#endif
}
conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
/*@=type@*/
diff --git a/po/rpm.pot b/po/rpm.pot
index 2fe60b181..8a2001bd6 100644
--- a/po/rpm.pot
+++ b/po/rpm.pot
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-11-06 17:01-0500\n"
+"POT-Creation-Date: 2001-11-07 18:58-0500\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"
@@ -1430,73 +1430,73 @@ msgstr ""
msgid "older package %s already added, replacing with %s\n"
msgstr ""
-#: lib/depends.c:634
+#: lib/depends.c:631
msgid "(cached)"
msgstr ""
-#: lib/depends.c:659
+#: lib/depends.c:656
msgid "(rpmrc provides)"
msgstr ""
-#: lib/depends.c:675
+#: lib/depends.c:672
msgid "(rpmlib provides)"
msgstr ""
-#: lib/depends.c:696
+#: lib/depends.c:693
msgid "(db files)"
msgstr ""
-#: lib/depends.c:708
+#: lib/depends.c:705
msgid "(db provides)"
msgstr ""
-#: lib/depends.c:721
+#: lib/depends.c:718
msgid "(db package)"
msgstr ""
-#: lib/depends.c:760
+#: lib/depends.c:757
#, c-format
msgid "%9s: (%s, %s) added to Depends cache.\n"
msgstr ""
-#: lib/depends.c:762 lib/rpmds.c:326 lib/rpmds.c:481
+#: lib/depends.c:759 lib/rpmds.c:378 lib/rpmds.c:533
msgid "NO "
msgstr ""
-#: lib/depends.c:762 lib/rpmds.c:326 lib/rpmds.c:481
+#: lib/depends.c:759 lib/rpmds.c:378 lib/rpmds.c:533
msgid "YES"
msgstr ""
-#: lib/depends.c:1103
+#: lib/depends.c:1098
#, c-format
msgid "removing %s \"%s\" from tsort relations.\n"
msgstr ""
#. Record all relations.
-#: lib/depends.c:1345
+#: lib/depends.c:1344
msgid "========== recording tsort relations\n"
msgstr ""
#. T4. Scan for zeroes.
-#: lib/depends.c:1419
+#: lib/depends.c:1418
msgid ""
"========== tsorting packages (order, #predecessors, #succesors, depth)\n"
msgstr ""
-#: lib/depends.c:1494
+#: lib/depends.c:1493
msgid "========== successors only (presentation order)\n"
msgstr ""
-#: lib/depends.c:1555
+#: lib/depends.c:1554
msgid "LOOP:\n"
msgstr ""
-#: lib/depends.c:1590
+#: lib/depends.c:1589
msgid "========== continuing tsort ...\n"
msgstr ""
#. Return no. of packages that could not be ordered.
-#: lib/depends.c:1595
+#: lib/depends.c:1594
#, c-format
msgid "rpmdepOrder failed, %d elements remain\n"
msgstr ""
@@ -2105,67 +2105,75 @@ msgstr ""
msgid "generate signature"
msgstr ""
-#: lib/problems.c:225
+#: lib/problems.c:244
#, c-format
msgid " is needed by %s-%s-%s\n"
msgstr ""
-#: lib/problems.c:228
+#: lib/problems.c:247
#, c-format
msgid " conflicts with %s-%s-%s\n"
msgstr ""
-#: lib/problems.c:268
+#: lib/problems.c:253
+msgid "conflicts with"
+msgstr ""
+
+#: lib/problems.c:253
+msgid "is needed by"
+msgstr ""
+
+#: lib/problems.c:294
#, c-format
msgid "package %s is for a different architecture"
msgstr ""
-#: lib/problems.c:273
+#: lib/problems.c:299
#, c-format
msgid "package %s is for a different operating system"
msgstr ""
-#: lib/problems.c:278
+#: lib/problems.c:304
#, c-format
msgid "package %s is already installed"
msgstr ""
-#: lib/problems.c:283
+#: lib/problems.c:309
#, c-format
msgid "path %s in package %s is not relocateable"
msgstr ""
-#: lib/problems.c:288
+#: lib/problems.c:314
#, c-format
msgid "file %s conflicts between attempted installs of %s and %s"
msgstr ""
-#: lib/problems.c:293
+#: lib/problems.c:319
#, c-format
msgid "file %s from install of %s conflicts with file from package %s"
msgstr ""
-#: lib/problems.c:298
+#: lib/problems.c:324
#, c-format
msgid "package %s (which is newer than %s) is already installed"
msgstr ""
-#: lib/problems.c:303
+#: lib/problems.c:329
#, c-format
msgid "installing package %s needs %ld%cb on the %s filesystem"
msgstr ""
-#: lib/problems.c:313
+#: lib/problems.c:339
#, c-format
msgid "installing package %s needs %ld inodes on the %s filesystem"
msgstr ""
-#: lib/problems.c:318
+#: lib/problems.c:344
#, c-format
msgid "package %s pre-transaction syscall(s): %s failed: %s"
msgstr ""
-#: lib/problems.c:325
+#: lib/problems.c:351
#, c-format
msgid "unknown error %d encountered while manipulating package %s"
msgstr ""
@@ -2319,8 +2327,8 @@ msgstr ""
msgid "can't query %s: %s\n"
msgstr ""
-#: lib/query.c:600 lib/query.c:638 lib/rpminstall.c:326 lib/rpminstall.c:466
-#: lib/rpminstall.c:837
+#: lib/query.c:600 lib/query.c:638 lib/rpminstall.c:328 lib/rpminstall.c:470
+#: lib/rpminstall.c:841
#, c-format
msgid "open of %s failed: %s\n"
msgstr ""
@@ -2334,7 +2342,7 @@ msgstr ""
msgid "old format source packages cannot be queried\n"
msgstr ""
-#: lib/query.c:648 lib/rpminstall.c:479
+#: lib/query.c:648 lib/rpminstall.c:483
#, c-format
msgid "%s: read manifest failed: %s\n"
msgstr ""
@@ -2393,16 +2401,16 @@ msgstr ""
msgid "record %u could not be read\n"
msgstr ""
-#: lib/query.c:854 lib/rpminstall.c:625
+#: lib/query.c:854 lib/rpminstall.c:629
#, c-format
msgid "package %s is not installed\n"
msgstr ""
-#: lib/rpmal.c:771
+#: lib/rpmal.c:793
msgid "(added files)"
msgstr ""
-#: lib/rpmal.c:868
+#: lib/rpmal.c:892
msgid "(added provide)"
msgstr ""
@@ -2470,102 +2478,102 @@ msgid "OK"
msgstr ""
#. XXX legacy epoch-less requires/conflicts compatibility
-#: lib/rpmds.c:451
+#: lib/rpmds.c:503
#, c-format
msgid ""
"the \"B\" dependency needs an epoch (assuming same as \"A\")\n"
"\tA %s\tB %s\n"
msgstr ""
-#: lib/rpmds.c:480
+#: lib/rpmds.c:532
#, c-format
msgid " %s A %s\tB %s\n"
msgstr ""
#. @=branchstate@
-#: lib/rpmds.c:506
+#: lib/rpmds.c:562
#, c-format
-msgid "package %s-%s-%s has unsatisfied %s: %s\n"
+msgid "package %s has unsatisfied %s: %s\n"
msgstr ""
-#: lib/rpminstall.c:153
+#: lib/rpminstall.c:155
msgid "Preparing..."
msgstr ""
-#: lib/rpminstall.c:155
+#: lib/rpminstall.c:157
msgid "Preparing packages for installation..."
msgstr ""
-#: lib/rpminstall.c:274
+#: lib/rpminstall.c:276
#, c-format
msgid "Retrieving %s\n"
msgstr ""
#. XXX undefined %{name}/%{version}/%{release} here
#. XXX %{_tmpdir} does not exist
-#: lib/rpminstall.c:286
+#: lib/rpminstall.c:288
#, c-format
msgid " ... as %s\n"
msgstr ""
-#: lib/rpminstall.c:290
+#: lib/rpminstall.c:292
#, c-format
msgid "skipping %s - transfer failed - %s\n"
msgstr ""
-#: lib/rpminstall.c:388
+#: lib/rpminstall.c:390
#, c-format
msgid "package %s is not relocateable\n"
msgstr ""
-#: lib/rpminstall.c:440
+#: lib/rpminstall.c:444
#, c-format
msgid "error reading from file %s\n"
msgstr ""
-#: lib/rpminstall.c:446
+#: lib/rpminstall.c:450
#, c-format
msgid "file %s requires a newer version of RPM\n"
msgstr ""
-#: lib/rpminstall.c:458 lib/rpminstall.c:693
+#: lib/rpminstall.c:462 lib/rpminstall.c:697
#, c-format
msgid "%s cannot be installed\n"
msgstr ""
-#: lib/rpminstall.c:494
+#: lib/rpminstall.c:498
#, c-format
msgid "found %d source and %d binary packages\n"
msgstr ""
-#: lib/rpminstall.c:512
+#: lib/rpminstall.c:516
msgid "failed dependencies:\n"
msgstr ""
-#: lib/rpminstall.c:535
+#: lib/rpminstall.c:539
msgid "installing binary packages\n"
msgstr ""
-#: lib/rpminstall.c:558
+#: lib/rpminstall.c:562
#, c-format
msgid "cannot open file %s: %s\n"
msgstr ""
-#: lib/rpminstall.c:628
+#: lib/rpminstall.c:632
#, c-format
msgid "\"%s\" specifies multiple packages\n"
msgstr ""
-#: lib/rpminstall.c:652
+#: lib/rpminstall.c:656
msgid "removing these packages would break dependencies:\n"
msgstr ""
-#: lib/rpminstall.c:679
+#: lib/rpminstall.c:683
#, c-format
msgid "cannot open %s: %s\n"
msgstr ""
-#: lib/rpminstall.c:685
+#: lib/rpminstall.c:689
#, c-format
msgid "Installing %s\n"
msgstr ""
@@ -2812,36 +2820,36 @@ msgstr ""
msgid "Signature: UNKNOWN (%d)\n"
msgstr ""
-#: lib/transaction.c:247
+#: lib/transaction.c:248
#, c-format
msgid "%s skipped due to missingok flag\n"
msgstr ""
#. @innercontinue@
-#: lib/transaction.c:886
+#: lib/transaction.c:887
#, c-format
msgid "excluding directory %s\n"
msgstr ""
-#: lib/verify.c:242
+#: lib/verify.c:243
msgid "package lacks both user name and id lists (this should never happen)\n"
msgstr ""
-#: lib/verify.c:263
+#: lib/verify.c:264
msgid "package lacks both group name and id lists (this should never happen)\n"
msgstr ""
-#: lib/verify.c:420
+#: lib/verify.c:421
#, c-format
msgid "missing %s"
msgstr ""
-#: lib/verify.c:517
+#: lib/verify.c:527
#, c-format
-msgid "Unsatisfied dependencies for %s-%s-%s: "
+msgid "Unsatisifed dependencies for %s:"
msgstr ""
-#: lib/verify.c:562
+#: lib/verify.c:577
#, c-format
msgid "%s-%s-%s: immutable header region digest check failed\n"
msgstr ""
diff --git a/python/rpmmodule.c b/python/rpmmodule.c
index a36323bfc..63b2a7237 100644
--- a/python/rpmmodule.c
+++ b/python/rpmmodule.c
@@ -30,6 +30,12 @@ extern int _rpmio_debug;
return 0;
}
+/* XXX These names/constants have been removed from the rpmlib API. */
+enum {
+ RPMDEP_SENSE_REQUIRES, /*!< requirement not satisfied. */
+ RPMDEP_SENSE_CONFLICTS /*!< conflict was found. */
+};
+
#ifdef __LCLINT__
#undef PyObject_HEAD
#define PyObject_HEAD int _PyObjectHead
@@ -1217,8 +1223,8 @@ static PyTypeObject rpmdbType = {
* requirement or conflict.
* The needsFlags is a bitfield that describes the versioned
* nature of a requirement or conflict. The constants
- * rpm.RPMDEP_SENSE_LESS, rpm.RPMDEP_SENSE_GREATER, and
- * rpm.RPMDEP_SENSE_EQUAL can be logical ANDed with the needsFlags
+ * rpm.RPMSENSE_LESS, rpm.RPMSENSE_GREATER, and
+ * rpm.RPMSENSE_EQUAL can be logical ANDed with the needsFlags
* to get versioned dependency information.
* suggestedPackage is a tuple if the dependency check was aware
* of a package that solves this dependency problem when the
@@ -1350,7 +1356,7 @@ static PyObject * rpmtransRemove(rpmtransObject * s, PyObject * args) {
/** \ingroup python
*/
static PyObject * rpmtransDepCheck(rpmtransObject * s, PyObject * args) {
- rpmDependencyConflict conflicts;
+ rpmDependencyConflict conflicts, c;
int numConflicts;
PyObject * list, * cf;
int i;
@@ -1361,8 +1367,9 @@ static PyObject * rpmtransDepCheck(rpmtransObject * s, PyObject * args) {
if (numConflicts) {
list = PyList_New(0);
- /* XXX TODO: rpmlib-4.0.3 can return multiple suggested packages. */
+ /* XXX TODO: rpm >= 4.0.3 can return multiple suggested keys. */
for (i = 0; i < numConflicts; i++) {
+#ifdef DYING
cf = Py_BuildValue("((sss)(ss)iOi)", conflicts[i].byName,
conflicts[i].byVersion, conflicts[i].byRelease,
@@ -1373,6 +1380,46 @@ static PyObject * rpmtransDepCheck(rpmtransObject * s, PyObject * args) {
conflicts[i].suggestedPkgs ?
conflicts[i].suggestedPkgs[0] : Py_None,
conflicts[i].sense);
+#else
+ char * byName, * byVersion, * byRelease;
+ char * needsName, * needsOP, * needsVersion;
+ int needsFlags, sense;
+ fnpyKey key;
+
+ c = conflicts + i;
+
+ byName = c->byNEVR;
+ if ((byRelease = strrchr(byName, '-')) != NULL)
+ *byRelease++ = '\0';
+ if ((byVersion = strrchr(byName, '-')) != NULL)
+ *byVersion++ = '\0';
+
+ key = c->suggestedKeys[0];
+
+ needsName = c->needsNEVR;
+ if (needsName[1] == ' ') {
+ sense = (needsName[0] == 'C')
+ ? RPMDEP_SENSE_CONFLICTS : RPMDEP_SENSE_REQUIRES;
+ needsName += 2;
+ } else
+ sense = RPMDEP_SENSE_REQUIRES;
+ if ((needsVersion = strrchr(needsName, ' ')) != NULL)
+ *needsVersion++ = '\0';
+
+ needsFlags = 0;
+ if ((needsOP = strrchr(needsName, ' ')) != NULL) {
+ for (*needsOP++ = '\0'; *needsOP != '\0'; needsOP++) {
+ if (*needsOP == '<') needsFlags |= RPMSENSE_LESS;
+ else if (*needsOP == '>') needsFlags |= RPMSENSE_GREATER;
+ else if (*needsOP == '=') needsFlags |= RPMSENSE_EQUAL;
+ }
+ }
+
+ cf = Py_BuildValue("((sss)(ss)iOi)", byName, byVersion, byRelease,
+ needsName, needsVersion, needsFlags,
+ (key != NULL ? key : Py_None),
+ sense);
+#endif
PyList_Append(list, (PyObject *) cf);
Py_DECREF(cf);
}
@@ -2461,7 +2508,6 @@ void initrpm(void) {
int i;
const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
struct headerSprintfExtension_s * ext;
-
m = Py_InitModule("rpm", rpmModuleMethods);
hdrType.ob_type = &PyType_Type;
diff --git a/rpm.spec.in b/rpm.spec.in
index db9a58940..b51a97876 100644
--- a/rpm.spec.in
+++ b/rpm.spec.in
@@ -563,3 +563,5 @@ fi
- fix: big-endian's with sizeof(time_t) != sizeof(int_32) mtime broken.
- fix: add Korean message catalogs (#54473).
- add RPHNPLATFORM and PLATFORM tags.
+- linear search on added package provides is dumb.
+- discarding entire signature header when using --addsign is dumb.
diff --git a/rpmio/rpmmessages.h b/rpmio/rpmmessages.h
index b9efff8fd..3f761a05d 100644
--- a/rpmio/rpmmessages.h
+++ b/rpmio/rpmmessages.h
@@ -31,6 +31,10 @@
#define rpmIsDebug() \
(rpmlogSetMask(0) >= RPMLOG_MASK( RPMMESS_DEBUG ))
+/*@-redef@*/ /* LCL: ??? */
+typedef /*@abstract@*/ const void * fnpyKey;
+/*@=redef@*/
+
/**
*/
typedef enum rpmCallbackType_e {
@@ -61,7 +65,7 @@ typedef void * (*rpmCallbackFunction)
const rpmCallbackType what,
const unsigned long amount,
const unsigned long total,
- /*@null@*/ const void * pkgKey,
+ /*@null@*/ fnpyKey key,
/*@null@*/ rpmCallbackData data)
/*@globals internalState@*/
/*@modifies internalState@*/;