]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
- add solver_take_solution() function
authorMichael Schroeder <mls@suse.de>
Wed, 17 Jun 2009 09:08:51 +0000 (11:08 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 17 Jun 2009 09:08:51 +0000 (11:08 +0200)
- add solver_printsolution() function
- rename solver_printsolutions() to solver_printallsolutions()
- add transaction_init_clone() and transaction_free_orderdata()

src/problems.c
src/problems.h
src/solverdebug.c
src/solverdebug.h
src/transaction.c
src/transaction.h

index bed73035fd44269867181f6ec7a1132cd4ec59f2..57bb545384b0c5c0017a57d3b0fc00de44da69d5 100644 (file)
@@ -686,6 +686,41 @@ solver_next_solutionelement(Solver *solv, Id problem, Id solution, Id element, I
   return element + 1;
 }
 
+void
+solver_take_solutionelement(Solver *solv, Id p, Id rp, Queue *job)
+{
+  int i;
+
+  if (p == SOLVER_SOLUTION_JOB)
+    {
+      job->elements[rp - 1] = SOLVER_NOOP;
+      job->elements[rp] = 0;
+      return;
+    }
+  if (rp <= 0 && p <= 0)
+    return;    /* just in case */
+  if (rp > 0)
+    p = SOLVER_INSTALL|SOLVER_SOLVABLE;
+  else
+    {
+      rp = p;
+      p = SOLVER_ERASE|SOLVER_SOLVABLE;
+    }
+  for (i = 0; i < job->count; i += 2)
+    if (job->elements[i] == p && job->elements[i + 2] == rp)
+      return;
+  queue_push2(job, p, rp);
+}
+
+void
+solver_take_solution(Solver *solv, Id problem, Id solution, Queue *job)
+{
+  Id p, rp, element = 0;
+  while ((element = solver_next_solutionelement(solv, problem, solution, element, &p, &rp)) != 0)
+    solver_take_solutionelement(solv, p, rp, job);
+}
+
+
 /*-------------------------------------------------------------------
  * 
  * find problem rule
index fad88347e9b21e4c221bf27b4460a2501000e760..b2ed55be2b8ccfd83fc95a249e80bd8c442fba8f 100644 (file)
@@ -35,6 +35,9 @@ Id solver_next_solution(struct _Solver *solv, Id problem, Id solution);
 Id solver_solutionelement_count(struct _Solver *solv, Id problem, Id solution);
 Id solver_next_solutionelement(struct _Solver *solv, Id problem, Id solution, Id element, Id *p, Id *rp);
 
+void solver_take_solutionelement(struct _Solver *solv, Id p, Id rp, Queue *job);
+void solver_take_solution(struct _Solver *solv, Id problem, Id solution, Queue *job);
+
 Id solver_findproblemrule(struct _Solver *solv, Id problem);
 void solver_findallproblemrules(struct _Solver *solv, Id problem, Queue *rules);
 
index c0759f2f958a6e3a03f0d167787bcbcbdf263feb..1970f7573fcb0fd09416cfc610f9153cfc495fed 100644 (file)
@@ -501,14 +501,14 @@ solver_printtransaction(Solver *solv)
 }
 
 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));
@@ -561,121 +561,130 @@ solver_printprobleminfo(Solver *solv, Queue *job, Id problem)
 }
 
 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");
         }
     }
 }
index a581d3917f94079ffae71d72d858c2c834a9eaa1..8b2feec81bf78eb710740887aa512a4394668d77 100644 (file)
@@ -25,8 +25,9 @@ extern void solver_printproblem(Solver *solv, Id v);
 extern void solver_printwatches(Solver *solv, int type);
 extern void solver_printdecisions(Solver *solv);
 extern void solver_printtransaction(Solver *solv);
-extern void solver_printprobleminfo(Solver *solv, Queue *job, Id problem);
-extern void solver_printsolutions(Solver *solv, Queue *job);
+extern void solver_printprobleminfo(Solver *solv, Id problem);
+extern void solver_printsolution(Solver *solv, Id problem, Id solution);
+extern void solver_printallsolutions(Solver *solv);
 extern void solver_printtrivial(Solver *solv);
 extern const char *solver_select2str(Solver *solv, Id select, Id what);
 
index a591258921ebefe7e8d81d1fb1dce0f59929d324..6047dad0f235a911b254fcc985a24e9af384e85a 100644 (file)
@@ -678,6 +678,7 @@ struct _TransactionOrderdata {
   struct _TransactionElement *tes;
   int ntes;
   Id *invedgedata;
+  int ninvedgedata;
 };
 
 #define TYPE_BROKEN    (1<<0)
@@ -701,6 +702,34 @@ transaction_init(Transaction *trans, Pool *pool)
   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)
 {
@@ -709,6 +738,12 @@ 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;
@@ -1581,6 +1616,7 @@ transaction_order(Transaction *trans, int flags)
   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++)
@@ -1701,6 +1737,7 @@ printf("free %s [%d]\n", solvid2str(pool, te2->p), temedianr[od.invedgedata[j]])
       trans->orderdata->tes = od.tes;
       trans->orderdata->ntes = numte;
       trans->orderdata->invedgedata = od.invedgedata;
+      trans->orderdata->ninvedgedata = od.nedgedata;
     }
   else
     {
index 5309baba27788b2021507163dfd9bb72174ec390..2738e5c84bc909c10da9b05174c5009f8a244079 100644 (file)
@@ -80,7 +80,9 @@ typedef struct _Transaction {
 #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 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 */