From: Michael Schroeder Date: Mon, 15 Oct 2007 13:25:30 +0000 (+0000) Subject: also prune to suggests/enhances, fixes tpctl testcases X-Git-Tag: BASE-SuSE-Code-12_1-Branch~1233 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6b3d8735f1f333f79c1e59c9f6ff88f7aa84165d;p=platform%2Fupstream%2Flibsolv.git also prune to suggests/enhances, fixes tpctl testcases --- diff --git a/src/solver.c b/src/solver.c index 6213b58..dba72df 100644 --- a/src/solver.c +++ b/src/solver.c @@ -117,11 +117,12 @@ prune_to_recommended(Solver *solv, Queue *plist) Pool *pool = solv->pool; int i, j; Solvable *s; - Id p, *pp, sup, *supp, rec, *recp; + Id p, *pp, sup, *supp, rec, *recp, sug, *sugp, enh, *enhp; if (solv->recommends_index < 0) { MAPZERO(&solv->recommends); + MAPZERO(&solv->suggests); solv->recommends_index = 0; } while (solv->recommends_index < solv->decisionq.count) @@ -130,12 +131,16 @@ prune_to_recommended(Solver *solv, Queue *plist) if (p < 0) continue; s = pool->solvables + p; - if (!(recp = s->recommends)) - continue; - while ((rec = *recp++) != 0) - FOR_PROVIDES(p, pp, rec) - MAPSET(&solv->recommends, p); - } + if ((recp = s->recommends) != 0) + while ((rec = *recp++) != 0) + FOR_PROVIDES(p, pp, rec) + MAPSET(&solv->recommends, p); + if ((sugp = s->suggests) != 0) + while ((sug = *sugp++) != 0) + FOR_PROVIDES(p, pp, sug) + MAPSET(&solv->suggests, p); + } + /* prune to recommended/supplemented */ for (i = j = 0; i < plist->count; i++) { p = plist->elements[i]; @@ -167,6 +172,30 @@ prune_to_recommended(Solver *solv, Queue *plist) } if (j) plist->count = j; + + /* prune to suggested/enhanced*/ + if (plist->count < 2) + return; + for (i = j = 0; i < plist->count; i++) + { + p = plist->elements[i]; + if (MAPTST(&solv->suggests, p)) + { + plist->elements[j++] = p; + continue; + } + s = pool->solvables + p; + if (!(enhp = s->enhances)) + continue; + while ((enh = *enhp++) != 0) + if (dep_fulfilled(solv, enh)) + break; + if (!enh) + continue; + plist->elements[j++] = s - pool->solvables; + } + if (j) + plist->count = j; } /* @@ -1693,6 +1722,7 @@ solver_create(Pool *pool, Source *system) queueinit(&solv->learnt_pool); mapinit(&solv->recommends, pool->nsolvables); + mapinit(&solv->suggests, pool->nsolvables); solv->recommends_index = 0; solv->decisionmap = (Id *)xcalloc(pool->nsolvables, sizeof(Id)); @@ -1716,6 +1746,7 @@ solver_free(Solver *solv) queuefree(&solv->learnt_why); queuefree(&solv->learnt_pool); mapfree(&solv->recommends); + mapfree(&solv->suggests); xfree(solv->decisionmap); xfree(solv->rules); xfree(solv->watches); diff --git a/src/solver.h b/src/solver.h index 470b087..7c8aa4e 100644 --- a/src/solver.h +++ b/src/solver.h @@ -77,6 +77,7 @@ typedef struct solver { Queue problems; Map recommends; /* recommended packages from decisionmap */ + Map suggests; /* suggested packages from decisionmap */ int recommends_index; /* recommended level */ int rc_output; /* output result compatible to redcarpet/zypp testsuite, set == 2 for pure rc (will suppress architecture) */