- change transaction_init to transaction_create, add solver flag setting/getting
authorMichael Schroeder <mls@suse.de>
Mon, 20 Jun 2011 16:30:31 +0000 (18:30 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 20 Jun 2011 16:30:31 +0000 (18:30 +0200)
13 files changed:
bindings/solv.i
examples/solv.c
src/libsolv.ver
src/solver.c
src/solver.h
src/solver_private.h
src/solverdebug.c
src/solverdebug.h
src/transaction.c
src/transaction.h
tools/findfileconflicts.c
tools/installcheck.c
tools/patchcheck.c

index 597c746..d561bbd 100644 (file)
@@ -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;
index 3ceab94..c314511 100644 (file)
@@ -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)
index 474877f..5080879 100644 (file)
@@ -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:
                *;
index 53db3c7..eb55f4a 100644 (file)
@@ -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 */
 
index 9614202..0e6722a 100644 (file)
@@ -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);
index cc37e11..cbe3272 100644 (file)
@@ -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
index 44d7fca..cd7183b 100644 (file)
@@ -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;
index 9f06557..a1d6663 100644 (file)
@@ -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);
index dbce59f..4ef7cd0 100644 (file)
@@ -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
index 0d77e01..a5d3015 100644 (file)
@@ -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 */
index 9d7f1a2..c078ed2 100644 (file)
@@ -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);
     }
index 806f9b0..dc4d01d 100644 (file)
@@ -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)
        {
index 9ebb535..4d170f8 100644 (file)
@@ -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))
         {