oa = pool->whatprovides[*(Id *)ap];
ob = pool->whatprovides[*(Id *)bp];
if (oa == ob)
- return 0;
+ return *(Id *)ap - *(Id *)bp;
if (!oa)
return -1;
if (!ob)
return r;
if (*da)
return *da;
- return oa - ob;
+ return *(Id *)ap - *(Id *)bp;
}
static void
{
Id *pp;
s = pool->solvables + i;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue; /* sources do not provide anything */
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
- continue; /* architecture not installable */
pp = s->provides;
if (!pp) /* solvable does not provide anything */
continue;
+ if (!pool_installable(pool, s))
+ continue;
while ((id = *pp++) != ID_NULL)
{
if (ISRELDEP(id))
{
Id *pp;
s = pool->solvables + i;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue; /* sources do not provide anything */
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
- continue; /* architecture not installable */
pp = s->provides;
if (!pp) /* solvable does not provide anything */
continue;
+ if (!pool_installable(pool, s))
+ continue;
/* for all provides of this solvable */
while ((id = *pp++) != 0)
*/
Id *
-addrelproviders(Pool *pool, Id d)
+pool_addrelproviders(Pool *pool, Id d)
{
Reldep *rd = GETRELDEP(pool, d);
Reldep *prd;
#define GET_PROVIDESP(d, v) (ISRELDEP(d) ? \
(v = GETRELID(pool, d), pool->whatprovides[v] ? \
pool->whatprovidesdata + pool->whatprovides[v] : \
- addrelproviders(pool, d) \
+ pool_addrelproviders(pool, d) \
) : \
(pool->whatprovidesdata + pool->whatprovides[d]))
extern void pool_freewhatprovides(Pool *pool);
extern Id pool_queuetowhatprovides(Pool *pool, Queue *q);
-extern Id *addrelproviders(Pool *pool, Id d);
+extern Id *pool_addrelproviders(Pool *pool, Id d);
extern Source *pool_source(Pool *pool, Solvable *s);
+static inline int pool_installable(Pool *pool, Solvable *s)
+{
+ if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
+ return 0;
+ if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
+ return 0;
+ return 1;
+}
+
#ifdef __cplusplus
}
#endif
for (i = j = 0; i < plist->count; i++)
{
s = pool->solvables + plist->elements[i];
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
if (pool->verbose) printf("- %s-%s.%s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
/* compare whatprovidesdata */
ad = pool->whatprovidesdata + a->d;
bd = pool->whatprovidesdata + b->d;
- for (; *ad && *ad == *bd; ad++, bd++)
- ;
- return *ad - *bd;
+ while (*bd)
+ if ((x = *ad++ - *bd++) != 0)
+ return x;
+ return *ad;
}
if (MAPTST(m, i))
continue;
s = pool->solvables + i;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
+ if (!pool_installable(pool, s))
continue;
sup = 0;
if ((supp = s->supplements) != 0)
s = pool->solvables + i;
if ((enhp = s->enhances) == 0)
continue;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
+ if (!pool_installable(pool, s))
continue;
while ((enh = *enhp++) != ID_NULL)
- {
- FOR_PROVIDES(p, pp, enh)
- if (MAPTST(m, p))
- break;
- if (p)
- break;
- }
+ if (dep_possible(solv, enh, m))
+ break;
if (!enh)
continue;
if ((conp = s->conflicts) != 0)
s = pool->solvables + i;
if (!s->supplements && !s->freshens)
continue;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
+ if (!pool_installable(pool, s))
continue;
if ((supp = s->supplements) != 0)
{
s = pool->solvables + i;
if ((obsp = s->obsoletes) == 0)
continue;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
- continue;
+ if (!pool_installable(pool, s))
+ continue;
while ((obs = *obsp++) != 0)
FOR_PROVIDES(p, pp, obs)
{
s = pool->solvables + i;
if ((obsp = s->obsoletes) == 0)
continue;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
- continue;
+ if (!pool_installable(pool, s))
+ continue;
while ((obs = *obsp++) != 0)
FOR_PROVIDES(p, pp, obs)
{
addrulesforsupplements(solv, &addedmap);
addrulesforenhances(solv, &addedmap); /* do this last */
+#if 1
+ if (pool->verbose)
+ {
+ int possible = 0, installable = 0;
+ for (i = 1; i < pool->nsolvables; i++)
+ {
+ if (pool_installable(pool, pool->solvables + i))
+ installable++;
+ if (MAPTST(&addedmap, i))
+ possible++;
+ }
+ printf("%d of %d installable solvables used for solving\n", possible, installable);
+ }
+#endif
/*
* first pass done
/* find suggested packages */
if (!solv->problems.count)
{
- Id sug, *sugp, enh, *enhp;
+ Id sug, *sugp, enh, *enhp, req, *reqp, p, *pp;
/* create map of all suggests that are still open */
solv->recommends_index = -1;
{
if (solv->decisionmap[i] != 0)
continue;
+ s = pool->solvables + i;
if (!MAPTST(&solv->suggestsmap, i))
{
- s = pool->solvables + i;
- if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
- continue;
- if (pool->id2arch && (s->arch > pool->lastarch || !pool->id2arch[s->arch]))
- continue;
if ((enhp = s->enhances) == 0)
continue;
+ if (!pool_installable(pool, s))
+ continue;
while ((enh = *enhp++) != 0)
if (dep_fulfilled(solv, enh))
break;
if (!enh)
continue;
}
+ /* check if installation is possible at all */
+ if ((reqp = s->requires) != 0)
+ {
+ while ((req = *reqp++) != 0)
+ {
+ if (req == SOLVABLE_PREREQMARKER) /* skip the marker */
+ continue;
+ FOR_PROVIDES(p, pp, req)
+ if (solv->decisionmap[p] >= 0)
+ break;
+ if (!p && !strncmp(id2str(pool, req), "rpmlib(", 7))
+ continue;
+ if (!p)
+ break; /* no provider installable! */
+ }
+ if (req)
+ continue;
+ }
queuepush(&solv->suggestions, i);
}
prune_best_version_arch(pool, &solv->suggestions);