- add SOLVER_NOAUTOSET to disable automatic SET deduction
authorMichael Schroeder <mls@suse.de>
Mon, 31 May 2010 10:20:34 +0000 (12:20 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 31 May 2010 10:20:34 +0000 (12:20 +0200)
examples/solv.c
src/rules.c
src/solver.h

index 437ed9d..4b71473 100644 (file)
@@ -1754,9 +1754,17 @@ limitrepo(Pool *pool, Id repofilter, Queue *job)
              i = 0;
            }
          matched = 1;
-         /* here we assume that repo == vendor */
-         job->elements[i] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
-         job->elements[i + 1] = pool_queuetowhatprovides(pool, &mq);
+         /* here we assume that repo == vendor, so we also set SOLVER_SETVENDOR */
+         if (mq.count == 1)
+           {
+             job->elements[i] = SOLVER_SOLVABLE | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_NOAUTOSET;
+             job->elements[i + 1] = mq.elements[0];
+           }
+         else
+           {
+             job->elements[i] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
+             job->elements[i + 1] = pool_queuetowhatprovides(pool, &mq);
+           }
        }
       else if (matched)
        {
index 635bb55..2ce386a 100644 (file)
@@ -1348,28 +1348,34 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
     {
     case SOLVER_INSTALL:
       set = how & SOLVER_SETMASK;
-      if (select == SOLVER_SOLVABLE)
-       set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
-      else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what))
+      if (!(set & SOLVER_NOAUTOSET))
        {
-         Reldep *rd = GETRELDEP(pool, what);
-         if (rd->flags == REL_EQ && select == SOLVER_SOLVABLE_NAME)
+         /* automatically add set bits by analysing the job */
+         if (select == SOLVER_SOLVABLE)
+           set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
+         else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what))
            {
+             Reldep *rd = GETRELDEP(pool, what);
+             if (rd->flags == REL_EQ && select == SOLVER_SOLVABLE_NAME)
+               {
 #if !defined(DEBIAN_SEMANTICS)
-             const char *evr = id2str(pool, rd->evr);
-             if (strchr(evr, '-'))
-               set |= SOLVER_SETEVR;
-             else
-               set |= SOLVER_SETEV;
+                 const char *evr = id2str(pool, rd->evr);
+                 if (strchr(evr, '-'))
+                   set |= SOLVER_SETEVR;
+                 else
+                   set |= SOLVER_SETEV;
 #else
-             set |= SOLVER_SETEVR;
+                 set |= SOLVER_SETEVR;
 #endif
+               }
+             if (rd->flags <= 7 && ISRELDEP(rd->name))
+               rd = GETRELDEP(pool, rd->name);
+             if (rd->flags == REL_ARCH)
+               set |= SOLVER_SETARCH;
            }
-         if (rd->flags <= 7 && ISRELDEP(rd->name))
-           rd = GETRELDEP(pool, rd->name);
-         if (rd->flags == REL_ARCH)
-           set |= SOLVER_SETARCH;
        }
+      else
+       set &= ~SOLVER_NOAUTOSET;
       if (!set)
        return;
       if ((set & SOLVER_SETARCH) != 0 && solv->infarchrules != solv->infarchrules_end)
@@ -1493,8 +1499,11 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
        }
       if (omap.size)
         map_free(&omap);
-      if (select == SOLVER_SOLVABLE || qstart == q->count)
-       return;         /* all done already */
+
+      if (qstart == q->count)
+       return;         /* nothing to prune */
+      if ((set & (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR)) == (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR))
+       return;         /* all is set */
 
       /* now that we know which installed packages are obsoleted check each of them */
       for (i = j = qstart; i < q->count; i += 2)
@@ -1530,6 +1539,7 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
        }
       queue_truncate(q, j);
       return;
+
     case SOLVER_ERASE:
       if (!installed)
        break;
index 1b09522..e672ba5 100644 (file)
@@ -252,8 +252,9 @@ typedef struct _Solver {
 #define SOLVER_SETARCH                 0x04000000
 #define SOLVER_SETVENDOR               0x08000000
 #define SOLVER_SETREPO                 0x10000000
+#define SOLVER_NOAUTOSET               0x20000000
 
-#define SOLVER_SETMASK                 0x1f000000
+#define SOLVER_SETMASK                 0x2f000000
 
 /* old API compatibility, do not use in new code */
 #if 1