#include "pool.h"
#include "repo.h"
+#include "solver.h"
#include "evr.h"
+#include "bitmap.h"
#include "linkedpkg.h"
#ifdef ENABLE_LINKED_PKGS
return 0;
}
+void
+extend_updatemap_to_buddies(Solver *solv)
+{
+ Pool *pool = solv->pool;
+ Repo *installed = solv->installed;
+ Solvable *s;
+ int p, ip;
+
+ if (!installed)
+ return;
+ if (!solv->updatemap.size || !solv->instbuddy)
+ return;
+ FOR_REPO_SOLVABLES(installed, p, s)
+ {
+ if (!MAPTST(&solv->updatemap, p - installed->start))
+ continue;
+ if ((ip = solv->instbuddy[p - installed->start]) <= 1)
+ continue;
+ if (!has_package_link(pool, s)) /* only look at pseudo -> real relations */
+ continue;
+ if (ip < installed->start || ip >= installed->end || pool->solvables[ip].repo != installed)
+ continue; /* just in case... */
+ MAPSET(&solv->updatemap, ip - installed->start);
+ }
+}
#endif
/* generic */
extern void find_package_link(Pool *pool, Solvable *s, Id *reqidp, Queue *qr, Id *prvidp, Queue *qp);
extern int pool_link_evrcmp(Pool *pool, Solvable *s1, Solvable *s2);
+extern void extend_updatemap_to_buddies(Solver *solv);
#endif
Id qsbuf[64];
int isorphaned = 0;
Rule *r;
- int islinkedpseudo = 0;
p = s - pool->solvables;
-#ifdef ENABLE_LINKED_PKGS
- islinkedpseudo = is_linked_pseudo_package(solv, s);
-#endif
-
/* Orphan detection. We cheat by looking at the feature rule, which
* we already calculated */
r = solv->rules + solv->featurerules + (p - solv->installed->start);
- if (!r->p && !islinkedpseudo)
+ if (!r->p)
{
+#ifdef ENABLE_LINKED_PKGS
+ if (is_linked_pseudo_package(solv, s))
+ {
+ solver_addrule(solv, 0, 0, 0);
+ return;
+ }
+#endif
p = 0;
queue_push(&solv->orphaned, s - pool->solvables); /* an orphaned package */
if (solv->keep_orphans && !(solv->droporphanedmap_all || (solv->droporphanedmap.size && MAPTST(&solv->droporphanedmap, s - pool->solvables - solv->installed->start))))
else
policy_findupdatepackages(solv, s, &qs, 0);
-#ifdef ENABLE_LINKED_PKGS
- if (islinkedpseudo)
- {
- /* a linked pseudo package. As it is linked, we do not need an update/feature rule */
- /* nevertheless we set specialupdaters so we can update */
- solver_addrule(solv, 0, 0, 0);
- if (qs.count)
- {
- if (p != -SYSTEMSOLVABLE)
- queue_unshift(&qs, p);
- if (qs.count)
- set_specialupdaters(solv, s, pool_queuetowhatprovides(pool, &qs));
- }
- queue_free(&qs);
- return;
- }
-#endif
-
if (qs.count && solv->multiversion.size)
{
int i, j;
rr -= solv->installed->end - solv->installed->start;
if (!rr->p) /* identical to update rule? */
rr = r;
- if (!rr->p && !(specialupdaters && specialupdaters[i - installed->start]))
- continue; /* orpaned package */
+ if (!rr->p)
+ continue; /* orpaned package or pseudo package */
/* check if we should update this package to the latest version
* noupdate is set for erase jobs, in that case we want to deinstall
queue_empty(&dq);
if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || (rr->p && rr->p != i)))
{
- if (!rr->p)
- {
- /* specialupdater with no update/feature rule, i.e. a pseudo package */
- /* ignore if we also update the linked package */
- /* XXX: better map package in the updatemap? */
- if (solv->instbuddy && solv->instbuddy[s - pool->solvables - installed->start] > 1)
- {
- Id ip = solv->instbuddy[s - pool->solvables - installed->start];
- if (ip >= installed->start && ip < installed->end)
- if (MAPTST(&solv->noupdate, ip - installed->start) || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, ip - installed->start)))
- continue;
- }
- for (d = specialupdaters[i - installed->start]; (p = pool->whatprovidesdata[d++]) != 0; )
- {
- if (solv->decisionmap[p] > 0)
- {
- dq.count = 0;
- break;
- }
- if (!solv->decisionmap[p])
- queue_push(&dq, p);
- }
- }
- else if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
+ if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
{
/* special multiversion handling, make sure best version is chosen */
if (rr->p == i && solv->decisionmap[i] >= 0)
else
solv->duprules = solv->duprules_end = solv->nrules;
+#ifdef ENABLE_LINKED_PKGS
+ if (solv->instbuddy && solv->updatemap.size)
+ extend_updatemap_to_buddies(solv);
+#endif
+
if (solv->bestupdatemap_all || solv->bestupdatemap.size || hasbestinstalljob)
solver_addbestrules(solv, hasbestinstalljob);
else