X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsolver.c;h=a4e0c4b666496dc88c6437d0469736ecdba08316;hb=2491213c77850ed26991b572809a5ca4a61fa89b;hp=102d81411b6f12f1246d4d8bb467038dbd051fa4;hpb=0e46e80434781d1acbc4f5716827bf8688450a30;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/solver.c b/src/solver.c index 102d814..a4e0c4b 100644 --- a/src/solver.c +++ b/src/solver.c @@ -431,7 +431,7 @@ propagate(Solver *solv, int level) Id *decisionmap = solv->decisionmap; Id *watches = solv->watches + pool->nsolvables; /* place ptr in middle */ - POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "----- propagate level %d -----\n", level); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "----- propagate -----\n"); /* foreach non-propagated decision */ while (solv->propagate_index < solv->decisionq.count) @@ -444,7 +444,7 @@ propagate(Solver *solv, int level) IF_POOLDEBUG (SOLV_DEBUG_PROPAGATE) { - POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "propagate decision %d:", -pkg); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "propagate for decision %d level %d\n", -pkg, level); solver_printruleelement(solv, SOLV_DEBUG_PROPAGATE, 0, -pkg); } @@ -462,10 +462,10 @@ propagate(Solver *solv, int level) continue; } - IF_POOLDEBUG (SOLV_DEBUG_WATCHES) + IF_POOLDEBUG (SOLV_DEBUG_PROPAGATE) { - POOL_DEBUG(SOLV_DEBUG_WATCHES, " watch triggered "); - solver_printrule(solv, SOLV_DEBUG_WATCHES, r); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE," watch triggered "); + solver_printrule(solv, SOLV_DEBUG_PROPAGATE, r); } /* @@ -532,12 +532,12 @@ propagate(Solver *solv, int level) * if we found some p that is UNDEF or TRUE, move * watch to it */ - IF_POOLDEBUG (SOLV_DEBUG_WATCHES) + IF_POOLDEBUG (SOLV_DEBUG_PROPAGATE) { if (p > 0) - POOL_DEBUG(SOLV_DEBUG_WATCHES, " -> move w%d to %s\n", (pkg == r->w1 ? 1 : 2), pool_solvid2str(pool, p)); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE, " -> move w%d to %s\n", (pkg == r->w1 ? 1 : 2), pool_solvid2str(pool, p)); else - POOL_DEBUG(SOLV_DEBUG_WATCHES, " -> move w%d to !%s\n", (pkg == r->w1 ? 1 : 2), pool_solvid2str(pool, -p)); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE, " -> move w%d to !%s\n", (pkg == r->w1 ? 1 : 2), pool_solvid2str(pool, -p)); } *rp = *next_rp; @@ -593,7 +593,7 @@ propagate(Solver *solv, int level) } /* while we have non-decided decisions */ - POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "----- propagate end -----\n"); + POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "----- propagate end-----\n"); return 0; /* all is well */ } @@ -1790,69 +1790,6 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq) return level; } -/* one or more installed cleandeps packages in dq that are to be updated */ -/* we need to emulate the code in resolve_installed */ -static void -do_cleandeps_update_filter(Solver *solv, Queue *dq) -{ - Pool *pool = solv->pool; - Repo *installed = solv->installed; - Id *specialupdaters = solv->specialupdaters; - Id p, p2, pp, d; - Queue q; - int i, j, k; - - queue_init(&q); - for (i = 0; i < dq->count; i++) - { - Id p = dq->elements[i]; - if (p < 0) - p = -p; - if (pool->solvables[p].repo != installed || !MAPTST(&solv->cleandepsmap, p - installed->start)) - continue; - queue_empty(&q); - /* find updaters */ - if (specialupdaters && (d = specialupdaters[p - installed->start]) != 0) - { - while ((p2 = pool->whatprovidesdata[d++]) != 0) - if (solv->decisionmap[p2] >= 0) - queue_push(&q, p2); - } - else - { - Rule *r = solv->rules + solv->updaterules + (p - installed->start); - if (r->p) - { - FOR_RULELITERALS(p2, pp, r) - if (solv->decisionmap[p2] >= 0) - queue_push(&q, p2); - } - } - if (q.count && solv->update_targets && solv->update_targets->elements[p - installed->start]) - prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[p - installed->start], &q); - /* mark all elements in dq that are in the updaters list */ - dq->elements[i] = -p; - for (j = 0; j < dq->count; j++) - { - p = dq->elements[j]; - if (p < 0) - continue; - for (k = 0; k < q.count; k++) - if (q.elements[k] == p) - { - dq->elements[j] = -p; - break; - } - } - } - /* now prune to marked elements */ - for (i = j = 0; i < dq->count; i++) - if ((p = dq->elements[i]) < 0) - dq->elements[j++] = -p; - dq->count = j; - queue_free(&q); -} - static int resolve_dependencies(Solver *solv, int level, int disablerules, Queue *dq) { @@ -1880,8 +1817,6 @@ resolve_dependencies(Solver *solv, int level, int disablerules, Queue *dq) } if (i == solv->nrules) i = 1; - if (solv->focus_best && solv->do_extra_reordering && i >= solv->featurerules) - continue; r = solv->rules + i; if (r->d < 0) /* ignore disabled rules */ continue; @@ -1950,25 +1885,15 @@ resolve_dependencies(Solver *solv, int level, int disablerules, Queue *dq) /* prune to cleandeps packages */ if (solv->cleandepsmap.size && solv->installed) { - int cleandeps_update = 0; Repo *installed = solv->installed; for (j = 0; j < dq->count; j++) if (pool->solvables[dq->elements[j]].repo == installed && MAPTST(&solv->cleandepsmap, dq->elements[j] - installed->start)) - { - if (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, dq->elements[j] - installed->start))) - { - cleandeps_update = 1; /* cleandeps package is marked for update */ - continue; - } - break; - } + break; if (j < dq->count) { dq->elements[0] = dq->elements[j]; queue_truncate(dq, 1); } - else if (cleandeps_update) - do_cleandeps_update_filter(solv, dq); /* special update filter */ } if (dq->count > 1 && postponed >= 0) @@ -3032,7 +2957,9 @@ add_update_target(Solver *solv, Id p, Id how) Pool *pool = solv->pool; Solvable *s = pool->solvables + p; Repo *installed = solv->installed; - Id pi, pip; + Id pi, pip, identicalp; + int startcnt, endcnt; + if (!solv->update_targets) { solv->update_targets = solv_calloc(1, sizeof(Queue)); @@ -3043,6 +2970,8 @@ add_update_target(Solver *solv, Id p, Id how) queue_push2(solv->update_targets, p, p); return; } + identicalp = 0; + startcnt = solv->update_targets->count; FOR_PROVIDES(pi, pip, s->name) { Solvable *si = pool->solvables + pi; @@ -3057,9 +2986,9 @@ add_update_target(Solver *solv, Id p, Id how) if (how & SOLVER_CLEANDEPS) add_cleandeps_updatepkg(solv, pi); queue_push2(solv->update_targets, pi, p); - /* check if it's ok to keep the installed package */ + /* remember an installed package that is identical to p */ if (s->evr == si->evr && solvable_identical(s, si)) - queue_push2(solv->update_targets, pi, pi); + identicalp = pi; } if (s->obsoletes) { @@ -3089,6 +3018,12 @@ add_update_target(Solver *solv, Id p, Id how) } } } + /* also allow upgrading to an identical installed package */ + if (identicalp) + { + for (endcnt = solv->update_targets->count; startcnt < endcnt; startcnt += 2) + queue_push2(solv->update_targets, solv->update_targets->elements[startcnt], identicalp); + } } static int @@ -3308,7 +3243,6 @@ solver_solve(Solver *solv, Queue *job) POOL_DEBUG(SOLV_DEBUG_STATS, "solver started\n"); POOL_DEBUG(SOLV_DEBUG_STATS, "dosplitprovides=%d, noupdateprovide=%d, noinfarchcheck=%d\n", solv->dosplitprovides, solv->noupdateprovide, solv->noinfarchcheck); POOL_DEBUG(SOLV_DEBUG_STATS, "allowuninstall=%d, allowdowngrade=%d, allownamechange=%d, allowarchchange=%d, allowvendorchange=%d\n", solv->allowuninstall, solv->allowdowngrade, solv->allownamechange, solv->allowarchchange, solv->allowvendorchange); - POOL_DEBUG(SOLV_DEBUG_STATS, "dupallowdowngrade=%d, dupallownamechange=%d, dupallowarchchange=%d, dupallowvendorchange=%d\n", solv->dup_allowdowngrade, solv->dup_allownamechange, solv->dup_allowarchchange, solv->dup_allowvendorchange); POOL_DEBUG(SOLV_DEBUG_STATS, "promoteepoch=%d, forbidselfconflicts=%d\n", pool->promoteepoch, pool->forbidselfconflicts); POOL_DEBUG(SOLV_DEBUG_STATS, "obsoleteusesprovides=%d, implicitobsoleteusesprovides=%d, obsoleteusescolors=%d, implicitobsoleteusescolors=%d\n", pool->obsoleteusesprovides, pool->implicitobsoleteusesprovides, pool->obsoleteusescolors, pool->implicitobsoleteusescolors); POOL_DEBUG(SOLV_DEBUG_STATS, "dontinstallrecommended=%d, addalreadyrecommended=%d\n", solv->dontinstallrecommended, solv->addalreadyrecommended); @@ -3812,10 +3746,6 @@ solver_solve(Solver *solv, Queue *job) name_s = s; } solver_addjobrule(solv, -p, 0, 0, i, weak); -#ifdef ENABLE_LINKED_PKGS - if (solv->instbuddy && installed && s->repo == installed && solv->instbuddy[p - installed->start] > 1) - solver_addjobrule(solv, -solv->instbuddy[p - installed->start], 0, 0, i, weak); -#endif } /* special case for "erase a specific solvable": we also * erase all other solvables with that name, so that they @@ -3883,14 +3813,7 @@ solver_solve(Solver *solv, Queue *job) } } FOR_JOB_SELECT(p, pp, select, what) - { - s = pool->solvables + p; - solver_addjobrule(solv, installed && s->repo == installed ? p : -p, 0, 0, i, weak); -#ifdef ENABLE_LINKED_PKGS - if (solv->instbuddy && installed && s->repo == installed && solv->instbuddy[p - installed->start] > 1) - solver_addjobrule(solv, solv->instbuddy[p - installed->start], 0, 0, i, weak); -#endif - } + solver_addjobrule(solv, installed && pool->solvables[p].repo == installed ? p : -p, 0, 0, i, weak); break; case SOLVER_DISTUPGRADE: POOL_DEBUG(SOLV_DEBUG_JOB, "job: distupgrade %s\n", solver_select2str(pool, select, what));