}
%newobject transaction;
Transaction *transaction() {
- Transaction *t;
- t = sat_calloc(1, sizeof(*t));
- transaction_init_clone(t, &$self->trans);
- return t;
+ return solver_create_transaction($self);
}
}
static const int SOLVER_TRANSACTION_KEEP_ORDERDATA = SOLVER_TRANSACTION_KEEP_ORDERDATA;
~Transaction() {
transaction_free($self);
- sat_free($self);
}
#ifdef SWIGRUBY
%rename("isempty?") isempty;
int pcnt, scnt;
solv = solver_create(pool);
- solv->ignorealreadyrecommended = 1;
+ solver_set_flag(solv, SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED, 1);
solv->updatesystem = allpkgs && !repofilter && (mainmode == MODE_UPDATE || mainmode == MODE_DISTUPGRADE);
solv->dosplitprovides = solv->updatesystem;
solv->fixsystem = allpkgs && !repofilter && mainmode == MODE_VERIFY;
if (mainmode == MODE_DISTUPGRADE && allpkgs && !repofilter)
{
solv->distupgrade = 1;
- solv->allowdowngrade = 1;
- solv->allowarchchange = 1;
- solv->allowvendorchange = 1;
+ solver_set_flag(solv, SOLVER_FLAG_ALLOW_DOWNGRADE, 1);
+ solver_set_flag(solv, SOLVER_FLAG_ALLOW_ARCHCHANGE, 1);
+ solver_set_flag(solv, SOLVER_FLAG_ALLOW_VENDORCHANGE, 1);
}
if (mainmode == MODE_ERASE || mainmode == MODE_ERASECLEAN)
- solv->allowuninstall = 1; /* don't nag */
+ solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1); /* don't nag */
if (!solver_solve(solv, &job))
break;
solv = 0;
}
- trans = &solv->trans;
+ trans = solver_create_transaction(solv);
if (!trans->steps.count)
{
printf("Nothing to do.\n");
}
printf("\n");
printf("Transaction summary:\n\n");
- solver_printtransaction(solv);
+ transaction_print(trans);
#if !defined(FEDORA) && !defined(DEBIAN)
if (1)
solver_create;
solver_create_decisions_obsoletesmap;
solver_create_state_maps;
+ solver_create_transaction;
solver_describe_decision;
solver_describe_weakdep_decision;
solver_disableproblem;
solver_get_decisionblock;
solver_get_decisionlevel;
solver_get_decisionqueue;
+ solver_get_flag;
solver_get_lastdecisionblocklevel;
solver_next_problem;
solver_next_solution;
solver_printruleclass;
solver_printruleelement;
solver_printsolution;
- solver_printtransaction;
solver_printtrivial;
solver_printwatches;
solver_problem_count;
solver_ruleliterals;
solver_samerule;
solver_select2str;
+ solver_set_flag;
solver_solution_count;
solver_solutionelement2str;
solver_solutionelement_count;
transaction_all_obs_pkgs;
transaction_calc_duchanges;
transaction_calc_installsizechange;
- transaction_calculate;
transaction_check_order;
transaction_classify;
transaction_classify_pkgs;
+ transaction_create;
+ transaction_create_clone;
+ transaction_create_decisionq;
transaction_free;
transaction_free_orderdata;
- transaction_init;
- transaction_init_clone;
transaction_installedresult;
transaction_obs_pkg;
transaction_order;
transaction_order_add_choices;
+ transaction_print;
transaction_type;
local:
*;
solv->pool = pool;
solv->installed = pool->installed;
- transaction_init(&solv->trans, pool);
queue_init(&solv->ruletojob);
queue_init(&solv->decisionq);
queue_init(&solv->decisionq_why);
void
solver_free(Solver *solv)
{
- transaction_free(&solv->trans);
queue_free(&solv->job);
queue_free(&solv->ruletojob);
queue_free(&solv->decisionq);
sat_free(solv);
}
+int
+solver_get_flag(Solver *solv, int flag)
+{
+ switch (flag)
+ {
+ case SOLVER_FLAG_ALLOW_DOWNGRADE:
+ return solv->allowdowngrade;
+ case SOLVER_FLAG_ALLOW_ARCHCHANGE:
+ return solv->allowarchchange;
+ case SOLVER_FLAG_ALLOW_VENDORCHANGE:
+ return solv->allowvendorchange;
+ case SOLVER_FLAG_ALLOW_UNINSTALL:
+ return solv->allowuninstall;
+ case SOLVER_FLAG_NO_UPDATEPROVIDE:
+ return solv->noupdateprovide;
+ case SOLVER_FLAG_SPLITPROVIDES:
+ return solv->dosplitprovides;
+ case SOLVER_FLAG_IGNORE_RECOMMENDED:
+ return solv->dontinstallrecommended;
+ case SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED:
+ return solv->ignorealreadyrecommended;
+ case SOLVER_FLAG_NO_INFARCHCHECK:
+ return solv->noinfarchcheck;
+ default:
+ break;
+ }
+ return -1;
+}
+
+int
+solver_set_flag(Solver *solv, int flag, int value)
+{
+ int old = solver_get_flag(solv, flag);
+ switch (flag)
+ {
+ case SOLVER_FLAG_ALLOW_DOWNGRADE:
+ solv->allowdowngrade = value;
+ break;
+ case SOLVER_FLAG_ALLOW_ARCHCHANGE:
+ solv->allowarchchange = value;
+ break;
+ case SOLVER_FLAG_ALLOW_VENDORCHANGE:
+ solv->allowvendorchange = value;
+ break;
+ case SOLVER_FLAG_ALLOW_UNINSTALL:
+ solv->allowuninstall = value;
+ break;
+ case SOLVER_FLAG_NO_UPDATEPROVIDE:
+ solv->noupdateprovide = value;
+ break;
+ case SOLVER_FLAG_SPLITPROVIDES:
+ solv->dosplitprovides = value;
+ break;
+ case SOLVER_FLAG_IGNORE_RECOMMENDED:
+ solv->dontinstallrecommended = value;
+ break;
+ case SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED:
+ solv->ignorealreadyrecommended = value;
+ break;
+ case SOLVER_FLAG_NO_INFARCHCHECK:
+ solv->noinfarchcheck = value;
+ break;
+ default:
+ break;
+ }
+ return old;
+}
+
/*-------------------------------------------------------------------
*
*/
solver_prepare_solutions(solv);
- /*
- * finally prepare transaction info
- */
- transaction_calculate(&solv->trans, &solv->decisionq, &solv->noobsoletes);
-
POOL_DEBUG(SAT_DEBUG_STATS, "final solver statistics: %d problems, %d learned rules, %d unsolvable\n", solv->problems.count / 2, solv->stats_learned, solv->stats_unsolvable);
POOL_DEBUG(SAT_DEBUG_STATS, "solver_solve took %d ms\n", sat_timems(solve_start));
+
+ /* return number of problems */
return solv->problems.count ? solv->problems.count / 2 : 0;
}
+Transaction *
+solver_create_transaction(Solver *solv)
+{
+ return transaction_create_decisionq(solv->pool, &solv->decisionq, &solv->noobsoletes);
+}
+
/***********************************************************************/
/* disk usage computations */
Pool *pool; /* back pointer to pool */
Queue job; /* copy of the job we're solving */
- Transaction trans; /* calculated transaction */
-
Repo *installed; /* copy of pool->installed */
/* list of rules, ordered
#define SOLVER_REASON_RECOMMENDED 16
#define SOLVER_REASON_SUPPLEMENTED 17
+
+#define SOLVER_FLAG_ALLOW_DOWNGRADE 1
+#define SOLVER_FLAG_ALLOW_ARCHCHANGE 2
+#define SOLVER_FLAG_ALLOW_VENDORCHANGE 3
+#define SOLVER_FLAG_ALLOW_UNINSTALL 4
+#define SOLVER_FLAG_NO_UPDATEPROVIDE 5
+#define SOLVER_FLAG_SPLITPROVIDES 6
+#define SOLVER_FLAG_IGNORE_RECOMMENDED 7
+#define SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED 8
+#define SOLVER_FLAG_NO_INFARCHCHECK 9
+
extern Solver *solver_create(Pool *pool);
extern void solver_free(Solver *solv);
extern int solver_solve(Solver *solv, Queue *job);
+extern Transaction *solver_create_transaction(Solver *solv);
+extern int solver_set_flag(Solver *solv, int flag, int value);
+extern int solver_get_flag(Solver *solv, int flag);
extern int solver_get_decisionlevel(Solver *solv, Id p);
extern void solver_get_decisionqueue(Solver *solv, Queue *decisionq);
Pool *pool; /* back pointer to pool */
Queue job; /* copy of the job we're solving */
- Transaction trans; /* calculated transaction */
-
Repo *installed; /* copy of pool->installed */
/* list of rules, ordered
{
Pool *pool = solv->pool;
Repo *installed = solv->installed;
+ Transaction *trans = solver_create_transaction(solv);
Id p, type;
int i, j;
Solvable *s;
POOL_DEBUG(SAT_DEBUG_RESULT, "transaction:\n");
queue_init(&iq);
- for (i = 0; i < solv->trans.steps.count; i++)
+ for (i = 0; i < trans->steps.count; i++)
{
- p = solv->trans.steps.elements[i];
+ p = trans->steps.elements[i];
s = pool->solvables + p;
- type = transaction_type(&solv->trans, p, SOLVER_TRANSACTION_SHOW_ACTIVE|SOLVER_TRANSACTION_SHOW_ALL|SOLVER_TRANSACTION_SHOW_OBSOLETES|SOLVER_TRANSACTION_SHOW_MULTIINSTALL);
+ type = transaction_type(trans, p, SOLVER_TRANSACTION_SHOW_ACTIVE|SOLVER_TRANSACTION_SHOW_ALL|SOLVER_TRANSACTION_SHOW_OBSOLETES|SOLVER_TRANSACTION_SHOW_MULTIINSTALL);
switch(type)
{
case SOLVER_TRANSACTION_MULTIINSTALL:
case SOLVER_TRANSACTION_CHANGE:
case SOLVER_TRANSACTION_UPGRADE:
case SOLVER_TRANSACTION_OBSOLETES:
- transaction_all_obs_pkgs(&solv->trans, p, &iq);
+ transaction_all_obs_pkgs(trans, p, &iq);
if (iq.count)
{
POOL_DEBUG(SAT_DEBUG_RESULT, " (obsoletes");
}
POOL_DEBUG(SAT_DEBUG_RESULT, "\n");
}
+ transaction_free(trans);
}
static inline
}
void
-solver_printtransaction(Solver *solv)
+transaction_print(Transaction *trans)
{
- Transaction *trans = &solv->trans;
Pool *pool = trans->pool;
Queue classes, pkgs;
int i, j, mode, l, linel;
extern void solver_printwatches(Solver *solv, int type);
extern void solver_printdecisionq(Solver *solv, int type);
extern void solver_printdecisions(Solver *solv);
-extern void solver_printtransaction(Solver *solv);
extern void solver_printproblemruleinfo(Solver *solv, Id rule);
extern void solver_printprobleminfo(Solver *solv, Id problem);
extern void solver_printcompleteprobleminfo(Solver *solv, Id problem);
extern void solver_printallsolutions(Solver *solv);
extern void solver_printtrivial(Solver *solv);
+extern void transaction_print(Transaction *trans);
+
extern const char *solver_select2str(Pool *pool, Id select, Id what);
extern const char *pool_job2str(Pool *pool, Id how, Id what, int withflags);
extern const char *solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id target, Id dep);
}
-void
-transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap)
+Transaction *
+transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *noobsmap)
{
- Pool *pool = trans->pool;
Repo *installed = pool->installed;
int i, neednoobs;
Id p;
Solvable *s;
+ Transaction *trans;
+ trans = transaction_create(pool);
if (noobsmap && !noobsmap->size)
noobsmap = 0; /* ignore empty map */
queue_empty(&trans->steps);
if (p > 0 && MAPTST(&trans->transactsmap, p))
queue_push(&trans->steps, p);
}
+ return trans;
}
int
#define EDGEDATA_BLOCK 127
-void
-transaction_init(Transaction *trans, Pool *pool)
+Transaction *
+transaction_create(Pool *pool)
{
- memset(trans, 0, sizeof(*trans));
+ Transaction *trans = sat_calloc(1, sizeof(*trans));
trans->pool = pool;
+ return trans;
}
-void
-transaction_init_clone(Transaction *trans, Transaction *srctrans)
+Transaction *
+transaction_create_clone(Transaction *srctrans)
{
- memset(trans, 0, sizeof(*trans));
- trans->pool = srctrans->pool;
+ Transaction *trans = transaction_create(srctrans->pool);
queue_init_clone(&trans->steps, &srctrans->steps);
queue_init_clone(&trans->transaction_info, &srctrans->transaction_info);
if (srctrans->transaction_installed)
memcpy(trans->orderdata->invedgedata, od->invedgedata, od->ninvedgedata * sizeof(Id));
trans->orderdata->ninvedgedata = od->ninvedgedata;
}
+ return trans;
}
void
map_free(&trans->transactsmap);
map_free(&trans->noobsmap);
transaction_free_orderdata(trans);
+ free(trans);
}
void
/* order flags */
#define SOLVER_TRANSACTION_KEEP_ORDERDATA (1 << 0)
-extern void transaction_init(Transaction *trans, struct _Pool *pool);
-extern void transaction_init_clone(Transaction *trans, Transaction *srctrans);
+extern Transaction *transaction_create(struct _Pool *pool);
+extern Transaction *transaction_create_decisionq(struct _Pool *pool, Queue *decisionq, Map *noobsmap);
+extern Transaction *transaction_create_clone(Transaction *srctrans);
extern void transaction_free(Transaction *trans);
extern void transaction_free_orderdata(Transaction *trans);
-extern void transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap);
/* if p is installed, returns with pkg(s) obsolete p */
/* if p is not installed, returns with pkg(s) we obsolete */
Solver *solv = solver_create(pool);
queue_push2(&job, SOLVER_VERIFY|SOLVER_SOLVABLE_ALL, 0);
#if 0
- solv->allowuninstall = 1;
+ solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
#endif
problemcnt = solver_solve(solv, &job);
if (problemcnt)
solver_printallsolutions(solv);
else
- solver_printtransaction(solv);
+ {
+ Transaction *trans = solver_create_transaction(solv);
+ transaction_print(trans);
+ transaction_free(trans);
+ }
queue_free(&job);
solver_free(solv);
}
queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
queue_push(&job, archlock);
}
- solv->dontinstallrecommended = 1;
+ solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
solver_solve(solv, &job);
/* prune... */
for (i = j = 0; i < cand.count; i++)
queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
queue_push(&job, archlock);
}
- solv->dontinstallrecommended = 1;
+ solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
problemcount = solver_solve(solv, &job);
if (problemcount)
{
queue_push(&job, pool_str2id(pool, "aaa_base", 1));
solv = solver_create(pool);
- solv->dontinstallrecommended = 0;
+ /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
++solver_runs;
if (solver_solve(solv, &job))
{
queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
queue_push(&job, pid);
solv = solver_create(pool);
- /*solv->dontinstallrecommended = 1;*/
+ /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
++solver_runs;
if (solver_solve(solv, &job))
{
queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
queue_push(&job, pid);
solv = solver_create(pool);
- solv->dontinstallrecommended = 1;
+ solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
++solver_runs;
if (solver_solve(solv, &job))
{