return 0;
}
-/* Return rpmdb iterator with removals pruned out */
-static rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag, const char * key)
+/* Return rpmdb iterator with removals optionally pruned out */
+static rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag,
+ const char * key, int prune)
{
rpmdbMatchIterator mi = rpmtsInitIterator(ts, tag, key, 0);
- tsMembers tsmem = rpmtsMembers(ts);
- rpmdbPruneIterator(mi, tsmem->removedPackages);
+ if (prune) {
+ tsMembers tsmem = rpmtsMembers(ts);
+ rpmdbPruneIterator(mi, tsmem->removedPackages);
+ }
return mi;
}
if (rstreq(rpmteN(p), Name))
continue;
- mi = rpmtsPrunedIterator(ts, RPMDBI_NAME, Name);
+ mi = rpmtsPrunedIterator(ts, RPMDBI_NAME, Name, 1);
while((oh = rpmdbNextIterator(mi)) != NULL) {
/* Ignore colored packages not in our rainbow. */
rpmdbMatchIterator mi = NULL;
Header h = NULL;
int rc = 0;
+ /* pretrans deps are provided by current packages, don't prune erasures */
+ int prune = (rpmdsFlags(dep) & RPMSENSE_PRETRANS) ? 0 : 1;
/* See if we already looked this up */
- if (depCacheGetEntry(dcache, DNEVR, &cachedrc, NULL, NULL)) {
+ if (prune && depCacheGetEntry(dcache, DNEVR, &cachedrc, NULL, NULL)) {
rc = *cachedrc;
rpmdsNotify(dep, "(cached)", rc);
return rc;
* not installed files can not satisfy a dependency.
*/
if (Name[0] == '/') {
- mi = rpmtsPrunedIterator(ts, RPMDBI_INSTFILENAMES, Name);
+ mi = rpmtsPrunedIterator(ts, RPMDBI_INSTFILENAMES, Name, prune);
while ((h = rpmdbNextIterator(mi)) != NULL) {
rpmdsNotify(dep, "(db files)", rc);
break;
/* Otherwise look in provides no matter what the dependency looks like */
if (h == NULL) {
- mi = rpmtsPrunedIterator(ts, RPMDBI_PROVIDENAME, Name);
+ mi = rpmtsPrunedIterator(ts, RPMDBI_PROVIDENAME, Name, prune);
while ((h = rpmdbNextIterator(mi)) != NULL) {
if (rpmdsMatchesDep(h, rpmdbGetIteratorFileNum(mi), dep, _rpmds_nopromote)) {
rpmdsNotify(dep, "(db provides)", rc);
rc = (h != NULL) ? 0 : 1;
/* Cache the relatively expensive rpmdb lookup results */
- depCacheAddEntry(dcache, xstrdup(DNEVR), rc);
+ /* Caching the oddball non-pruned case would mess up other results */
+ if (prune)
+ depCacheAddEntry(dcache, xstrdup(DNEVR), rc);
return rc;
}
rpmTag depTag, const char *dep)
{
Header h;
- rpmdbMatchIterator mi = rpmtsPrunedIterator(ts, depTag, dep);
+ rpmdbMatchIterator mi = rpmtsPrunedIterator(ts, depTag, dep, 1);
while ((h = rpmdbNextIterator(mi)) != NULL) {
char * pkgNEVRA = headerGetAsString(h, RPMTAG_NEVRA);