}
void
-solver_printprobleminfo(Solver *solv, Queue *job, Id problem)
+solver_printprobleminfo(Solver *solv, Id problem)
{
Pool *pool = solv->pool;
Id probr;
Id dep, source, target;
probr = solver_findproblemrule(solv, problem);
- switch (solver_problemruleinfo(solv, job, probr, &dep, &source, &target))
+ switch (solver_ruleinfo(solv, probr, &source, &target, &dep))
{
case SOLVER_RULE_DISTUPGRADE:
POOL_DEBUG(SAT_DEBUG_RESULT, "%s does not belong to a distupgrade repository\n", solvid2str(pool, source));
}
void
-solver_printsolutions(Solver *solv, Queue *job)
+solver_printsolution(Solver *solv, Id problem, Id solution)
{
Pool *pool = solv->pool;
- int pcnt;
- Id p, rp, how, what, select;
- Id problem, solution, element;
+ Id p, rp, element, how, what, select;
Solvable *s, *sd;
- POOL_DEBUG(SAT_DEBUG_RESULT, "Encountered problems! Here are the solutions:\n\n");
- pcnt = 1;
- problem = 0;
- while ((problem = solver_next_problem(solv, problem)) != 0)
+ element = 0;
+ while ((element = solver_next_solutionelement(solv, problem, solution, element, &p, &rp)) != 0)
{
- POOL_DEBUG(SAT_DEBUG_RESULT, "Problem %d:\n", pcnt++);
- POOL_DEBUG(SAT_DEBUG_RESULT, "====================================\n");
- solver_printprobleminfo(solv, job, problem);
- POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
- solution = 0;
- while ((solution = solver_next_solution(solv, problem, solution)) != 0)
- {
- element = 0;
- while ((element = solver_next_solutionelement(solv, problem, solution, element, &p, &rp)) != 0)
+ if (p == SOLVER_SOLUTION_JOB)
+ {
+ /* job, rp is index into job queue */
+ how = solv->job.elements[rp - 1];
+ what = solv->job.elements[rp];
+ select = how & SOLVER_SELECTMASK;
+ switch (how & SOLVER_JOBMASK)
{
- if (p == SOLVER_SOLUTION_JOB)
- {
- /* job, rp is index into job queue */
- how = job->elements[rp - 1];
- what = job->elements[rp];
- select = how & SOLVER_SELECTMASK;
- switch (how & SOLVER_JOBMASK)
- {
- case SOLVER_INSTALL:
- if (select == SOLVER_SOLVABLE && solv->installed && pool->solvables[what].repo == solv->installed)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not keep %s installed\n", solvid2str(pool, what));
- else if (select == SOLVER_SOLVABLE_PROVIDES)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install a solvable %s\n", solver_select2str(solv, select, what));
- else
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install %s\n", solver_select2str(solv, select, what));
- break;
- case SOLVER_ERASE:
- if (select == SOLVER_SOLVABLE && !(solv->installed && pool->solvables[what].repo == solv->installed))
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not forbid installation of %s\n", solvid2str(pool, what));
- else if (select == SOLVER_SOLVABLE_PROVIDES)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not deinstall all solvables %s\n", solver_select2str(solv, select, what));
- else
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not deinstall %s\n", solver_select2str(solv, select, what));
- break;
- case SOLVER_UPDATE:
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install most recent version of %s\n", solver_select2str(solv, select, what));
- break;
- case SOLVER_LOCK:
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do not lock %s\n", solver_select2str(solv, select, what));
- break;
- default:
- POOL_DEBUG(SAT_DEBUG_RESULT, "- do something different\n");
- break;
- }
- }
- else if (p == SOLVER_SOLUTION_INFARCH)
+ case SOLVER_INSTALL:
+ if (select == SOLVER_SOLVABLE && solv->installed && pool->solvables[what].repo == solv->installed)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not keep %s installed\n", solvid2str(pool, what));
+ else if (select == SOLVER_SOLVABLE_PROVIDES)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install a solvable %s\n", solver_select2str(solv, select, what));
+ else
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install %s\n", solver_select2str(solv, select, what));
+ break;
+ case SOLVER_ERASE:
+ if (select == SOLVER_SOLVABLE && !(solv->installed && pool->solvables[what].repo == solv->installed))
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not forbid installation of %s\n", solvid2str(pool, what));
+ else if (select == SOLVER_SOLVABLE_PROVIDES)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not deinstall all solvables %s\n", solver_select2str(solv, select, what));
+ else
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not deinstall %s\n", solver_select2str(solv, select, what));
+ break;
+ case SOLVER_UPDATE:
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not install most recent version of %s\n", solver_select2str(solv, select, what));
+ break;
+ case SOLVER_LOCK:
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do not lock %s\n", solver_select2str(solv, select, what));
+ break;
+ default:
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- do something different\n");
+ break;
+ }
+ }
+ else if (p == SOLVER_SOLUTION_INFARCH)
+ {
+ s = pool->solvables + rp;
+ if (solv->installed && s->repo == solv->installed)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- keep %s despite the inferior architecture\n", solvable2str(pool, s));
+ else
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- install %s despite the inferior architecture\n", solvable2str(pool, s));
+ }
+ else if (p == SOLVER_SOLUTION_DISTUPGRADE)
+ {
+ s = pool->solvables + rp;
+ if (solv->installed && s->repo == solv->installed)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- keep obsolete %s\n", solvable2str(pool, s));
+ else
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- install %s from excluded repository\n", solvable2str(pool, s));
+ }
+ else
+ {
+ /* policy, replace p with rp */
+ s = pool->solvables + p;
+ sd = rp ? pool->solvables + rp : 0;
+ if (s == sd && solv->distupgrade)
+ {
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- keep obsolete %s\n", solvable2str(pool, s));
+ }
+ else if (sd)
+ {
+ int gotone = 0;
+ if (!solv->allowdowngrade && evrcmp(pool, s->evr, sd->evr, EVRCMP_MATCH_RELEASE) > 0)
{
- s = pool->solvables + rp;
- if (solv->installed && s->repo == solv->installed)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- keep %s despite the inferior architecture\n", solvable2str(pool, s));
- else
- POOL_DEBUG(SAT_DEBUG_RESULT, "- install %s despite the inferior architecture\n", solvable2str(pool, s));
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow downgrade of %s to %s\n", solvable2str(pool, s), solvable2str(pool, sd));
+ gotone = 1;
}
- else if (p == SOLVER_SOLUTION_DISTUPGRADE)
+ if (!solv->allowarchchange && s->name == sd->name && s->arch != sd->arch && policy_illegal_archchange(solv, s, sd))
{
- s = pool->solvables + rp;
- if (solv->installed && s->repo == solv->installed)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- keep obsolete %s\n", solvable2str(pool, s));
- else
- POOL_DEBUG(SAT_DEBUG_RESULT, "- install %s from excluded repository\n", solvable2str(pool, s));
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow architecture change of %s to %s\n", solvable2str(pool, s), solvable2str(pool, sd));
+ gotone = 1;
}
- else
+ if (!solv->allowvendorchange && s->name == sd->name && s->vendor != sd->vendor && policy_illegal_vendorchange(solv, s, sd))
{
- /* policy, replace p with rp */
- s = pool->solvables + p;
- sd = rp ? pool->solvables + rp : 0;
- if (s == sd && solv->distupgrade)
- {
- POOL_DEBUG(SAT_DEBUG_RESULT, "- keep obsolete %s\n", solvable2str(pool, s));
- }
- else if (sd)
- {
- int gotone = 0;
- if (!solv->allowdowngrade && evrcmp(pool, s->evr, sd->evr, EVRCMP_MATCH_RELEASE) > 0)
- {
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow downgrade of %s to %s\n", solvable2str(pool, s), solvable2str(pool, sd));
- gotone = 1;
- }
- if (!solv->allowarchchange && s->name == sd->name && s->arch != sd->arch && policy_illegal_archchange(solv, s, sd))
- {
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow architecture change of %s to %s\n", solvable2str(pool, s), solvable2str(pool, sd));
- gotone = 1;
- }
- if (!solv->allowvendorchange && s->name == sd->name && s->vendor != sd->vendor && policy_illegal_vendorchange(solv, s, sd))
- {
- if (sd->vendor)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow vendor change from '%s' (%s) to '%s' (%s)\n", id2str(pool, s->vendor), solvable2str(pool, s), id2str(pool, sd->vendor), solvable2str(pool, sd));
- else
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow vendor change from '%s' (%s) to no vendor (%s)\n", id2str(pool, s->vendor), solvable2str(pool, s), solvable2str(pool, sd));
- gotone = 1;
- }
- if (!gotone)
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow replacement of %s with %s\n", solvable2str(pool, s), solvable2str(pool, sd));
- }
+ if (sd->vendor)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow vendor change from '%s' (%s) to '%s' (%s)\n", id2str(pool, s->vendor), solvable2str(pool, s), id2str(pool, sd->vendor), solvable2str(pool, sd));
else
- {
- POOL_DEBUG(SAT_DEBUG_RESULT, "- allow deinstallation of %s\n", solvable2str(pool, s));
- }
-
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow vendor change from '%s' (%s) to no vendor (%s)\n", id2str(pool, s->vendor), solvable2str(pool, s), solvable2str(pool, sd));
+ gotone = 1;
}
+ if (!gotone)
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow replacement of %s with %s\n", solvable2str(pool, s), solvable2str(pool, sd));
}
- POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
+ else
+ {
+ POOL_DEBUG(SAT_DEBUG_RESULT, "- allow deinstallation of %s\n", solvable2str(pool, s));
+ }
+
+ }
+ }
+}
+
+void
+solver_printallsolutions(Solver *solv)
+{
+ Pool *pool = solv->pool;
+ int pcnt;
+ Id problem, solution;
+
+ POOL_DEBUG(SAT_DEBUG_RESULT, "Encountered problems! Here are the solutions:\n\n");
+ pcnt = 0;
+ problem = 0;
+ while ((problem = solver_next_problem(solv, problem)) != 0)
+ {
+ pcnt++;
+ POOL_DEBUG(SAT_DEBUG_RESULT, "Problem %d:\n", pcnt);
+ POOL_DEBUG(SAT_DEBUG_RESULT, "====================================\n");
+ solver_printprobleminfo(solv, problem);
+ POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
+ solution = 0;
+ while ((solution = solver_next_solution(solv, problem, solution)) != 0)
+ {
+ solver_printsolution(solv, problem, solution);
+ POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
}
}
}
struct _TransactionElement *tes;
int ntes;
Id *invedgedata;
+ int ninvedgedata;
};
#define TYPE_BROKEN (1<<0)
trans->pool = pool;
}
+void
+transaction_init_clone(Transaction *trans, Transaction *srctrans)
+{
+ memset(trans, 0, sizeof(*trans));
+ trans->pool = srctrans->pool;
+ queue_init_clone(&trans->steps, &srctrans->steps);
+ queue_init_clone(&trans->transaction_info, &srctrans->transaction_info);
+ if (srctrans->transaction_installed)
+ {
+ Repo *installed = srctrans->pool->installed;
+ trans->transaction_installed = sat_calloc(installed->end - installed->start, sizeof(Id));
+ memcpy(trans->transaction_installed, srctrans->transaction_installed, (installed->end - installed->start) * sizeof(Id));
+ }
+ map_init_clone(&trans->transactsmap, &srctrans->transactsmap);
+ map_init_clone(&trans->noobsmap, &srctrans->noobsmap);
+ if (srctrans->orderdata)
+ {
+ struct _TransactionOrderdata *od = srctrans->orderdata;
+ trans->orderdata = sat_calloc(1, sizeof(*trans->orderdata));
+ trans->orderdata->tes = sat_malloc2(od->ntes, sizeof(*od->tes));
+ memcpy(trans->orderdata->tes, od->tes, od->ntes * sizeof(*od->tes));
+ trans->orderdata->ntes = od->ntes;
+ trans->orderdata->invedgedata = sat_malloc2(od->ninvedgedata, sizeof(Id));
+ memcpy(trans->orderdata->invedgedata, od->invedgedata, od->ninvedgedata * sizeof(Id));
+ trans->orderdata->ninvedgedata = od->ninvedgedata;
+ }
+}
+
void
transaction_free(Transaction *trans)
{
trans->transaction_installed = sat_free(trans->transaction_installed);
map_free(&trans->transactsmap);
map_free(&trans->noobsmap);
+ transaction_free_orderdata(trans);
+}
+
+void
+transaction_free_orderdata(Transaction *trans)
+{
if (trans->orderdata)
{
struct _TransactionOrderdata *od = trans->orderdata;
for (i = 1, te = od.tes + i; i < numte; i++, te++)
te->edges = te->mark; /* edges now points into invedgedata */
od.edgedata = sat_free(od.edgedata);
+ od.nedgedata = j + 1;
/* now the final ordering */
for (i = 1, te = od.tes + i; i < numte; i++, te++)
trans->orderdata->tes = od.tes;
trans->orderdata->ntes = numte;
trans->orderdata->invedgedata = od.invedgedata;
+ trans->orderdata->ninvedgedata = od.nedgedata;
}
else
{