make solver_describe_decision always return a rule, add solver_rule2solvable()
authorMichael Schroeder <mls@suse.de>
Wed, 21 Aug 2013 12:34:46 +0000 (14:34 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 21 Aug 2013 12:34:46 +0000 (14:34 +0200)
that way users of describe_decision have the correct rule, they can use
solver_rule2solvable to get the id of the solvable.

src/libsolv.ver
src/rules.c
src/rules.h
src/solver.c

index 7982dbb..eec2018 100644 (file)
@@ -350,6 +350,7 @@ SOLV_1.0 {
                solver_problemruleinfo2str;
                solver_rule2job;
                solver_rule2jobidx;
+               solver_rule2solvable;
                solver_ruleclass;
                solver_ruleinfo;
                solver_ruleliterals;
index ae14eba..677807c 100644 (file)
@@ -2307,6 +2307,16 @@ solver_rule2job(Solver *solv, Id rid, Id *whatp)
   return solv->job.elements[idx];
 }
 
+Id
+solver_rule2solvable(Solver *solv, Id rid)
+{
+  if (rid >= solv->updaterules && rid < solv->updaterules_end)
+    return rid - solv->updaterules;
+  if (rid >= solv->featurerules && rid < solv->featurerules_end)
+    return rid - solv->featurerules;
+  return 0;
+}
+
 /* check if the newest versions of pi still provides the dependency we're looking for */
 static int
 solver_choicerulecheck(Solver *solv, Id pi, Rule *r, Map *m)
index 9205b86..42e8285 100644 (file)
@@ -138,6 +138,7 @@ extern SolverRuleinfo solver_ruleclass(struct _Solver *solv, Id rid);
 extern void solver_ruleliterals(struct _Solver *solv, Id rid, Queue *q);
 extern int  solver_rule2jobidx(struct _Solver *solv, Id rid);
 extern Id   solver_rule2job(struct _Solver *solv, Id rid, Id *whatp);
+extern Id   solver_rule2solvable(struct _Solver *solv, Id rid);
 
 
 #ifdef __cplusplus
index a846477..eb4afde 100644 (file)
@@ -4025,11 +4025,7 @@ solver_describe_decision(Solver *solv, Id p, Id *infop)
   if (i < solv->decisioncnt_update)
     {
       if (i == 0)
-       {
-         if (infop)
-           *infop = SYSTEMSOLVABLE;
-         return SOLVER_REASON_KEEP_INSTALLED;
-       }
+       return SOLVER_REASON_KEEP_INSTALLED;
       if (infop)
        *infop = why;
       return SOLVER_REASON_RESOLVE_JOB;
@@ -4039,12 +4035,7 @@ solver_describe_decision(Solver *solv, Id p, Id *infop)
       if (why == 0 && pp < 0)
        return SOLVER_REASON_CLEANDEPS_ERASE;
       if (infop)
-       {
-         if (why >= solv->updaterules && why < solv->updaterules_end)
-           *infop = why - solv->updaterules;
-         else if (why >= solv->featurerules && why < solv->featurerules_end)
-           *infop = why - solv->featurerules;
-       }
+       *infop = why;
       return SOLVER_REASON_UPDATE_INSTALLED;
     }
   if (i < solv->decisioncnt_resolve)
@@ -4052,12 +4043,7 @@ solver_describe_decision(Solver *solv, Id p, Id *infop)
       if (why == 0 && pp < 0)
        return SOLVER_REASON_CLEANDEPS_ERASE;
       if (infop)
-       {
-         if (why >= solv->updaterules && why < solv->updaterules_end)
-           *infop = why - solv->updaterules;
-         else if (why >= solv->featurerules && why < solv->featurerules_end)
-           *infop = why - solv->featurerules;
-       }
+       *infop = why;
       return SOLVER_REASON_KEEP_INSTALLED;
     }
   if (i < solv->decisioncnt_weak)