diff options
-rw-r--r-- | lib/depends.c | 37 | ||||
-rw-r--r-- | lib/depends.h | 2 | ||||
-rw-r--r-- | lib/problems.c | 30 | ||||
-rw-r--r-- | lib/psm.c | 2 | ||||
-rw-r--r-- | lib/psm.h | 2 | ||||
-rw-r--r-- | lib/rpmal.c | 103 | ||||
-rw-r--r-- | lib/rpmal.h | 28 | ||||
-rw-r--r-- | lib/rpmcli.h | 2 | ||||
-rw-r--r-- | lib/rpmds.c | 104 | ||||
-rw-r--r-- | lib/rpmds.h | 39 | ||||
-rw-r--r-- | lib/rpminstall.c | 10 | ||||
-rw-r--r-- | lib/rpmlib.h | 18 | ||||
-rw-r--r-- | lib/transaction.c | 7 | ||||
-rw-r--r-- | lib/verify.c | 31 | ||||
-rw-r--r-- | po/rpm.pot | 138 | ||||
-rw-r--r-- | python/rpmmodule.c | 56 | ||||
-rw-r--r-- | rpm.spec.in | 2 | ||||
-rw-r--r-- | rpmio/rpmmessages.h | 6 |
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 } } @@ -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; @@ -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@*/; |