return dep;
}
-static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, int ispatch)
+static int providedbyinstalled_multiversion(Pool *pool, unsigned char *map, Id n, Id dep)
+{
+ Id p, pp;
+ Solvable *sn = pool->solvables + n;
+
+ FOR_PROVIDES(p, pp, sn->name)
+ {
+ Solvable *s = pool->solvables + p;
+ if (s->name != sn->name || s->arch != sn->arch)
+ continue;
+ if ((map[p] & 9) == 9)
+ return 1;
+ }
+ return 0;
+}
+
+static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, int ispatch, Map *noobsoletesmap)
{
Id p, pp;
int r = 0;
return 1; /* always boring, as never constraining */
if (ispatch && !pool_match_nevr(pool, pool->solvables + p, dep))
continue;
+ if (ispatch && noobsoletesmap && noobsoletesmap->size && MAPTST(noobsoletesmap, p) && ISRELDEP(dep))
+ if (providedbyinstalled_multiversion(pool, map, p, dep))
+ continue;
if ((map[p] & 9) == 9)
return 9;
r |= map[p] & 17;
*/
void
-pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
+pool_trivial_installable_noobsoletesmap(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res, Map *noobsoletesmap)
{
int i, r, m, did;
Id p, *dp, con, *conp, req, *reqp;
{
if (req == SOLVABLE_PREREQMARKER)
continue;
- r = providedbyinstalled(pool, map, req, 0);
+ r = providedbyinstalled(pool, map, req, 0, 0);
if (!r)
{
/* decided and miss */
conp = s->repo->idarraydata + s->conflicts;
while ((con = *conp++) != 0)
{
- if ((providedbyinstalled(pool, map, con, ispatch) & 1) != 0)
+ if ((providedbyinstalled(pool, map, con, ispatch, noobsoletesmap) & 1) != 0)
{
map[p] = 2;
break;
if ((m == 1 || m == 17) && ISRELDEP(con))
{
con = dep2name(pool, con);
- if ((providedbyinstalled(pool, map, con, ispatch) & 1) != 0)
+ if ((providedbyinstalled(pool, map, con, ispatch, noobsoletesmap) & 1) != 0)
m = 9;
}
}
obsp = s->repo->idarraydata + s->obsoletes;
while ((obs = *obsp++) != 0)
{
- if ((providedbyinstalled(pool, map, obs, 0) & 1) != 0)
+ if ((providedbyinstalled(pool, map, obs, 0, 0) & 1) != 0)
{
map[p] = 2;
break;
free(map);
}
+void
+pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
+{
+ pool_trivial_installable_noobsoletesmap(pool, installedmap, pkgs, res, 0);
+}
+
// EOF
{
Pool *pool = solv->pool;
Queue in, out;
- Map installedmap;
Id p;
const char *n;
Solvable *s;
queue_free(&in);
return;
}
- solver_create_state_maps(solv, &installedmap, 0);
queue_init(&out);
- pool_trivial_installable(pool, &installedmap, &in, &out);
+ solver_trivial_installable(solv, &in, &out);
POOL_DEBUG(SAT_DEBUG_RESULT, "trivial installable status:\n");
for (i = 0; i < in.count; i++)
POOL_DEBUG(SAT_DEBUG_RESULT, " %s: %d\n", solvable2str(pool, pool->solvables + in.elements[i]), out.elements[i]);
POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
- map_free(&installedmap);
queue_free(&in);
queue_free(&out);
}