return dep_possible(solv, rd->evr, m);
}
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
- return solver_splitprovides(solv, rd->evr);
+ return solver_splitprovides(solv, rd->evr, m);
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
return solver_dep_installed(solv, rd->evr);
}
return check_xsupp(solv, depq, rd->evr);
}
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
+#if 0
return solver_splitprovides(solv, rd->evr);
+#else
+ return 0;
+#endif
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
return solver_dep_installed(solv, rd->evr);
}
* and is only true if pkg is installed and contains the specified path.
* we also make sure that pkg is selected for an update, otherwise the
* update would always be forced onto the user.
+ * Map m is the map used when called from dep_possible.
*/
+
+static int
+solver_is_updating(Solver *solv, Id p)
+{
+ /* check if the update rule is true */
+ Pool *pool = solv->pool;
+ Rule *r;
+ Id l, pp;
+ if (solv->decisionmap[p] >= 0)
+ return 0; /* old package stayed */
+ r = solv->rules + solv->updaterules + (p - solv->installed->start);
+ FOR_RULELITERALS(l, pp, r)
+ if (l > 0 && l != p && solv->decisionmap[l] > 0)
+ return 1;
+ return 0;
+}
+
int
-solver_splitprovides(Solver *solv, Id dep)
+solver_splitprovides(Solver *solv, Id dep, Map *m)
{
Pool *pool = solv->pool;
Id p, pp;
Reldep *rd;
Solvable *s;
- if (!solv->dosplitprovides || !solv->installed || (!solv->updatemap_all && !solv->updatemap.size))
+ if (!solv->dosplitprovides || !solv->installed)
return 0;
if (!ISRELDEP(dep))
return 0;
/* here we have packages that provide the correct name and contain the path,
* now do extra filtering */
s = pool->solvables + p;
- if (s->repo == solv->installed && s->name == rd->name &&
- (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, p - solv->installed->start))))
+ if (s->repo != solv->installed || s->name != rd->name)
+ continue;
+ /* check if the package is updated. if m is set, we're called from dep_possible */
+ if (m || solver_is_updating(solv, p))
return 1;
}
return 0;
return r1 == 2 || r2 == 2 ? 2 : 1;
}
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
- return solver_splitprovides(solv, rd->evr);
+ return solver_splitprovides(solv, rd->evr, 0);
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
return solver_dep_installed(solv, rd->evr);
if (rd->flags == REL_NAMESPACE && (q = solv->installsuppdepq) != 0)
/* filter out all already supplemented packages if requested */
if (!solv->addalreadyrecommended && dqs.count)
{
- int dosplitprovides_old = solv->dosplitprovides;
/* turn off all new packages */
for (i = 0; i < solv->decisionq.count; i++)
{
if (s->repo && s->repo != solv->installed)
solv->decisionmap[p] = -solv->decisionmap[p];
}
- solv->dosplitprovides = 0;
/* filter out old supplements */
for (i = j = 0; i < dqs.count; i++)
{
if (s->repo && s->repo != solv->installed)
solv->decisionmap[p] = -solv->decisionmap[p];
}
- solv->dosplitprovides = dosplitprovides_old;
}
/* multiversion doesn't mix well with supplements.
*/
oldnrules = solv->nrules;
if (hasdupjob && !solv->updatemap_all && solv->dosplitprovides && solv->installed)
- {
- /* solver_splitprovides checks if the package is in the update map, but the update
- * map is extended for dup jobs. So temporarily set updatemap_all */
- solv->updatemap_all = 1;
- solver_addpkgrulesforweak(solv, &addedmap);
- solv->updatemap_all = 0;
- }
+ solver_addpkgrulesforweak(solv, &addedmap);
else
solver_addpkgrulesforweak(solv, &addedmap);
POOL_DEBUG(SOLV_DEBUG_STATS, "added %d pkg rules because of weak dependencies\n", solv->nrules - oldnrules);
extern void solver_reset(Solver *solv);
extern int solver_dep_installed(Solver *solv, Id dep);
-extern int solver_splitprovides(Solver *solv, Id dep);
+extern int solver_splitprovides(Solver *solv, Id dep, Map *m);
static inline int
solver_dep_fulfilled(Solver *solv, Id dep)
return solver_dep_fulfilled(solv, rd->evr);
}
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
- return solver_splitprovides(solv, rd->evr);
+ return solver_splitprovides(solv, rd->evr, 0);
if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
return solver_dep_installed(solv, rd->evr);
}