ref: refs/heads/SuSE-Code-11-Branch
commit e15b66e259a25262fa841f4b413d6cba49007954
Author: Michael Schroeder
Date: Mon Mar 2 15:46:52 2009 +0100
- add solver_trivial_installable() to fix multiversion patches (bnc#480303)
---
src/pool.c | 37 +++++++++++++++++++++++++++++++------
src/pool.h | 1 +
src/solver.c | 10 ++++++++++
src/solver.h | 2 ++
4 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/src/pool.c b/src/pool.c
index 1071f4c..8daa57a 100644
--- a/src/pool.c
+++ b/src/pool.c
@@ -1387,7 +1387,23 @@ static inline Id dep2name(Pool *pool, Id dep)
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;
@@ -1397,6 +1413,9 @@ static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, in
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;
@@ -1416,7 +1435,7 @@ static inline int providedbyinstalled(Pool *pool, unsigned char *map, Id dep, in
*/
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;
@@ -1464,7 +1483,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
{
if (req == SOLVABLE_PREREQMARKER)
continue;
- r = providedbyinstalled(pool, map, req, 0);
+ r = providedbyinstalled(pool, map, req, 0, 0);
if (!r)
{
/* decided and miss */
@@ -1487,7 +1506,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
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;
@@ -1495,7 +1514,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
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;
}
}
@@ -1512,7 +1531,7 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
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;
@@ -1556,4 +1575,10 @@ pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
free(map);
}
+void
+pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res)
+{
+ pool_trivial_installable_noobsoletesmap(pool, installedmap, pkgs, res, 0);
+}
+
// EOF
diff --git a/src/pool.h b/src/pool.h
index c8f2c0d..8570324 100644
--- a/src/pool.h
+++ b/src/pool.h
@@ -293,6 +293,7 @@ typedef struct _duchanges {
void pool_calc_duchanges(Pool *pool, Map *installedmap, DUChanges *mps, int nmps);
int pool_calc_installsizechange(Pool *pool, Map *installedmap);
void pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res);
+void pool_trivial_installable_noobsoletesmap(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res, Map *noobsoletesmap);
/* loop over all providers of d */
diff --git a/src/solver.c b/src/solver.c
index 74669b5..4ec4354 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -4985,6 +4985,16 @@ solver_calc_installsizechange(Solver *solv)
return change;
}
+void
+solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res)
+{
+ Map installedmap;
+ solver_create_state_maps(solv, &installedmap, 0);
+ pool_trivial_installable_noobsoletesmap(solv->pool, &installedmap, pkgs, res, solv->noobsoletes.size ? &solv->noobsoletes : 0);
+ map_free(&installedmap);
+}
+
+
#define FIND_INVOLVED_DEBUG 0
void
solver_find_involved(Solver *solv, Queue *installedq, Solvable *ts, Queue *q)
diff --git a/src/solver.h b/src/solver.h
index d3757eb..7f2a0c6 100644
--- a/src/solver.h
+++ b/src/solver.h
@@ -335,9 +335,11 @@ solver_is_enhancing(Solver *solv, Solvable *s)
void solver_calc_duchanges(Solver *solv, DUChanges *mps, int nmps);
int solver_calc_installsizechange(Solver *solv);
+void solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res);
void solver_find_involved(Solver *solv, Queue *installedq, Solvable *s, Queue *q);
+
static inline void
solver_create_state_maps(Solver *solv, Map *installedmap, Map *conflictsmap)
{
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org