add SOLVER_RULE_JOB_UNSUPPORTED and SOLVER_RULE_JOB_UNKNOWN_PACKAGE
authorMichael Schroeder <mls@suse.de>
Tue, 7 May 2013 09:35:05 +0000 (11:35 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 7 May 2013 09:35:05 +0000 (11:35 +0200)
src/problems.c
src/rules.c
src/rules.h
src/solver.c

index 1be6577..0b77c98 100644 (file)
@@ -1041,8 +1041,12 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ
       return pool_tmpjoin(pool, "problem with installed package ", pool_solvid2str(pool, source), 0);
     case SOLVER_RULE_JOB:
       return "conflicting requests";
+    case SOLVER_RULE_JOB_UNSUPPORTED:
+      return "unsupported request";
     case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
       return pool_tmpjoin(pool, "nothing provides requested ", pool_dep2str(pool, dep), 0);
+    case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
+      return pool_tmpjoin(pool, "package ", pool_dep2str(pool, dep), " does not exist");
     case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
       return pool_tmpjoin(pool, pool_dep2str(pool, dep), " is provided by the system", 0);
     case SOLVER_RULE_RPM:
index 317dc77..a144c40 100644 (file)
@@ -2178,14 +2178,16 @@ solver_ruleinfo(Solver *solv, Id rid, Id *fromp, Id *top, Id *depp)
        *depp = solv->job.elements[jidx + 1];
       if ((r->d == 0 || r->d == -1) && r->w2 == 0 && r->p == -SYSTEMSOLVABLE)
        {
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME))
+         Id how = solv->job.elements[jidx];
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME))
+           return SOLVER_RULE_JOB_UNKNOWN_PACKAGE;
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES))
            return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES))
-           return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_NAME))
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_NAME))
            return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
-         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES))
+         if ((how & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES))
            return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
+         return SOLVER_RULE_JOB_UNSUPPORTED;
        }
       return SOLVER_RULE_JOB;
     }
index 4d6b8ad..9205b86 100644 (file)
@@ -63,6 +63,8 @@ typedef enum {
   SOLVER_RULE_JOB = 0x400,
   SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP,
   SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM,
+  SOLVER_RULE_JOB_UNKNOWN_PACKAGE,
+  SOLVER_RULE_JOB_UNSUPPORTED,
   SOLVER_RULE_DISTUPGRADE = 0x500,
   SOLVER_RULE_INFARCH = 0x600,
   SOLVER_RULE_CHOICE = 0x700,
index e1fe034..69fbc35 100644 (file)
@@ -3374,7 +3374,9 @@ solver_solve(Solver *solv, Queue *job)
                queue_push(&q, p);
              if (!q.count)
                {
-                 /* no candidate found, make this an impossible rule */
+                 if (select == SOLVER_SOLVABLE_ONE_OF)
+                   break;      /* ignore empty installs */
+                 /* no candidate found or unsupported, make this an impossible rule */
                  queue_push(&q, -SYSTEMSOLVABLE);
                }
              p = queue_shift(&q);      /* get first candidate */