From: Michael Schroeder Date: Mon, 20 Jun 2011 16:30:31 +0000 (+0200) Subject: - change transaction_init to transaction_create, add solver flag setting/getting X-Git-Tag: BASE-SuSE-Code-12_1-Branch~35 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e29f9ccb48086b27462c751d1905ed3c5e703dfd;p=platform%2Fupstream%2Flibsolv.git - change transaction_init to transaction_create, add solver flag setting/getting --- diff --git a/bindings/solv.i b/bindings/solv.i index 597c746..d561bbd 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -1962,10 +1962,7 @@ rb_eval_string( } %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); } } @@ -1999,7 +1996,6 @@ rb_eval_string( static const int SOLVER_TRANSACTION_KEEP_ORDERDATA = SOLVER_TRANSACTION_KEEP_ORDERDATA; ~Transaction() { transaction_free($self); - sat_free($self); } #ifdef SWIGRUBY %rename("isempty?") isempty; diff --git a/examples/solv.c b/examples/solv.c index 3ceab94..c314511 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -2938,19 +2938,19 @@ rerunsolver: 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; @@ -3006,7 +3006,7 @@ rerunsolver: solv = 0; } - trans = &solv->trans; + trans = solver_create_transaction(solv); if (!trans->steps.count) { printf("Nothing to do.\n"); @@ -3022,7 +3022,7 @@ rerunsolver: } printf("\n"); printf("Transaction summary:\n\n"); - solver_printtransaction(solv); + transaction_print(trans); #if !defined(FEDORA) && !defined(DEBIAN) if (1) diff --git a/src/libsolv.ver b/src/libsolv.ver index 474877f..5080879 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -243,6 +243,7 @@ SOLV_1.0 { solver_create; solver_create_decisions_obsoletesmap; solver_create_state_maps; + solver_create_transaction; solver_describe_decision; solver_describe_weakdep_decision; solver_disableproblem; @@ -254,6 +255,7 @@ SOLV_1.0 { solver_get_decisionblock; solver_get_decisionlevel; solver_get_decisionqueue; + solver_get_flag; solver_get_lastdecisionblocklevel; solver_next_problem; solver_next_solution; @@ -270,7 +272,6 @@ SOLV_1.0 { solver_printruleclass; solver_printruleelement; solver_printsolution; - solver_printtransaction; solver_printtrivial; solver_printwatches; solver_problem_count; @@ -281,6 +282,7 @@ SOLV_1.0 { solver_ruleliterals; solver_samerule; solver_select2str; + solver_set_flag; solver_solution_count; solver_solutionelement2str; solver_solutionelement_count; @@ -301,18 +303,19 @@ SOLV_1.0 { 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: *; diff --git a/src/solver.c b/src/solver.c index 53db3c7..eb55f4a 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1264,7 +1264,6 @@ solver_create(Pool *pool) 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); @@ -1302,7 +1301,6 @@ solver_create(Pool *pool) void solver_free(Solver *solv) { - transaction_free(&solv->trans); queue_free(&solv->job); queue_free(&solv->ruletojob); queue_free(&solv->decisionq); @@ -1341,6 +1339,74 @@ solver_free(Solver *solv) 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; +} + /*------------------------------------------------------------------- * @@ -3014,16 +3080,19 @@ solver_solve(Solver *solv, Queue *job) */ 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 */ diff --git a/src/solver.h b/src/solver.h index 9614202..0e6722a 100644 --- a/src/solver.h +++ b/src/solver.h @@ -41,8 +41,6 @@ struct _Solver { 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 @@ -273,9 +271,23 @@ typedef struct _Solver Solver; #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); diff --git a/src/solver_private.h b/src/solver_private.h index cc37e11..cbe3272 100644 --- a/src/solver_private.h +++ b/src/solver_private.h @@ -18,8 +18,6 @@ struct _Solver { 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 diff --git a/src/solverdebug.c b/src/solverdebug.c index 44d7fca..cd7183b 100644 --- a/src/solverdebug.c +++ b/src/solverdebug.c @@ -297,6 +297,7 @@ solver_printdecisions(Solver *solv) { Pool *pool = solv->pool; Repo *installed = solv->installed; + Transaction *trans = solver_create_transaction(solv); Id p, type; int i, j; Solvable *s; @@ -306,11 +307,11 @@ solver_printdecisions(Solver *solv) 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: @@ -354,7 +355,7 @@ solver_printdecisions(Solver *solv) 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"); @@ -422,6 +423,7 @@ solver_printdecisions(Solver *solv) } POOL_DEBUG(SAT_DEBUG_RESULT, "\n"); } + transaction_free(trans); } static inline @@ -431,9 +433,8 @@ const char *id2strnone(Pool *pool, Id id) } 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; diff --git a/src/solverdebug.h b/src/solverdebug.h index 9f06557..a1d6663 100644 --- a/src/solverdebug.h +++ b/src/solverdebug.h @@ -25,7 +25,6 @@ extern void solver_printproblem(Solver *solv, Id v); 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); @@ -33,6 +32,8 @@ extern void solver_printsolution(Solver *solv, Id problem, Id solution); 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); diff --git a/src/transaction.c b/src/transaction.c index dbce59f..4ef7cd0 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -627,15 +627,16 @@ create_transaction_info(Transaction *trans, Queue *decisionq) } -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); @@ -683,6 +684,7 @@ transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap) if (p > 0 && MAPTST(&trans->transactsmap, p)) queue_push(&trans->steps, p); } + return trans; } int @@ -788,18 +790,18 @@ struct _TransactionOrderdata { #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) @@ -821,6 +823,7 @@ transaction_init_clone(Transaction *trans, Transaction *srctrans) memcpy(trans->orderdata->invedgedata, od->invedgedata, od->ninvedgedata * sizeof(Id)); trans->orderdata->ninvedgedata = od->ninvedgedata; } + return trans; } void @@ -832,6 +835,7 @@ transaction_free(Transaction *trans) map_free(&trans->transactsmap); map_free(&trans->noobsmap); transaction_free_orderdata(trans); + free(trans); } void diff --git a/src/transaction.h b/src/transaction.h index 0d77e01..a5d3015 100644 --- a/src/transaction.h +++ b/src/transaction.h @@ -80,11 +80,11 @@ typedef struct _Transaction { /* 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 */ diff --git a/tools/findfileconflicts.c b/tools/findfileconflicts.c index 9d7f1a2..c078ed2 100644 --- a/tools/findfileconflicts.c +++ b/tools/findfileconflicts.c @@ -64,13 +64,17 @@ int main() 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); } diff --git a/tools/installcheck.c b/tools/installcheck.c index 806f9b0..dc4d01d 100644 --- a/tools/installcheck.c +++ b/tools/installcheck.c @@ -213,7 +213,7 @@ main(int argc, char **argv) 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++) @@ -282,7 +282,7 @@ main(int argc, char **argv) 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) { diff --git a/tools/patchcheck.c b/tools/patchcheck.c index 9ebb535..4d170f8 100644 --- a/tools/patchcheck.c +++ b/tools/patchcheck.c @@ -292,7 +292,7 @@ test_all_packages_installable(context_t *c, Id pid) 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)) { @@ -321,7 +321,7 @@ test_all_packages_installable(context_t *c, Id pid) 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)) { @@ -420,7 +420,7 @@ test_can_upgrade_all_packages(context_t *c, Id pid) 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)) {