add KEEP_ORPHANS and BREAK_ORPHANS solver flags
authorMichael Schroeder <mls@suse.de>
Wed, 16 Apr 2014 13:15:42 +0000 (15:15 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 16 Apr 2014 13:15:42 +0000 (15:15 +0200)
BREAK_ORPHANS is not implemented yet

ext/testcase.c
src/rules.c
src/solver.c
src/solver.h

index 70d98b3..32547c8 100644 (file)
@@ -102,6 +102,8 @@ static struct solverflags2str {
   { SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE,       "dupallowarchchange", 1 },
   { SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE,     "dupallowvendorchange", 1 },
   { SOLVER_FLAG_DUP_ALLOW_NAMECHANGE,       "dupallownamechange", 1 },
+  { SOLVER_FLAG_KEEP_ORPHANS,               "keeporphans", 0 },
+  { SOLVER_FLAG_BREAK_ORPHANS,              "breakorphans", 0 },
   { 0, 0, 0 }
 };
 
index 3ba5a0e..b86ad77 100644 (file)
@@ -1246,6 +1246,13 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all)
     }
 #endif
 
+  if (!allow_all && !p && solv->dupmap_all)
+    {
+      queue_push(&solv->orphaned, s - pool->solvables);                /* an orphaned package */
+      if (solv->keep_orphans)
+       p = s - pool->solvables;
+    }
+
   if (!allow_all && qs.count && solv->multiversion.size)
     {
       int i, j;
@@ -1286,7 +1293,7 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all)
                }
              if (j == 0 && p == -SYSTEMSOLVABLE && solv->dupmap_all)
                {
-                 queue_push(&solv->orphaned, s - pool->solvables);     /* treat as orphaned */
+                 queue_push(&solv->orphaned, s - pool->solvables);     /* also treat as orphaned */
                  j = qs.count;
                }
              qs.count = j;
index f188e3d..054567e 100644 (file)
@@ -1639,6 +1639,10 @@ solver_get_flag(Solver *solv, int flag)
     return solv->dup_allowarchchange;
   case SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE:
     return solv->dup_allowvendorchange;
+  case SOLVER_FLAG_KEEP_ORPHANS:
+    return solv->keep_orphans;
+  case SOLVER_FLAG_BREAK_ORPHANS:
+    return solv->break_orphans;
   default:
     break;
   }
@@ -1702,6 +1706,12 @@ solver_set_flag(Solver *solv, int flag, int value)
   case SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE:
     solv->dup_allowvendorchange = value;
     break;
+  case SOLVER_FLAG_KEEP_ORPHANS:
+    solv->keep_orphans = value;
+    break;
+  case SOLVER_FLAG_BREAK_ORPHANS:
+    solv->break_orphans = value;
+    break;
   default:
     break;
   }
@@ -3574,20 +3584,16 @@ solver_solve(Solver *solv, Queue *job)
           * check for and remove duplicate
           */
          r = solv->rules + solv->nrules - 1;           /* r: update rule */
+          if (!r->p)
+           continue;
          sr = r - (installed->end - installed->start); /* sr: feature rule */
-         /* it's orphaned if there is no feature rule or the feature rule
-           * consists just of the installed package */
-         if (!sr->p || (sr->p == i && !sr->d && !sr->w2))
+         /* it's also orphaned if the feature rule consists just of the installed package */
+         if (!solv->dupmap_all && sr->p == i && !sr->d && !sr->w2)
            queue_push(&solv->orphaned, i);
-          if (!r->p)
-           {
-             /* assert(solv->dupmap_all && !sr->p); */
-             continue;
-           }
          if (!solver_rulecmp(solv, r, sr))
            memset(sr, 0, sizeof(*sr));         /* delete unneeded feature rule */
          else
-           solver_disablerule(solv, sr);       /* disable feature rule */
+           solver_disablerule(solv, sr);       /* disable feature rule for now */
        }
       /* consistency check: we added a rule for _every_ installed solvable */
       assert(solv->nrules - solv->updaterules == installed->end - installed->start);
index 81c5f2b..3316e76 100644 (file)
@@ -185,6 +185,8 @@ struct _Solver {
 
   Queue addedmap_deduceq;              /* deduce addedmap from rpm rules */
   Id *instbuddy;                       /* buddies of installed packages */
+  int keep_orphans;                    /* how to treat orphans */
+  int break_orphans;                   /* how to treat orphans */
 #endif /* LIBSOLV_INTERNAL */
 };
 
@@ -282,6 +284,8 @@ typedef struct _Solver Solver;
 #define SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE       15
 #define SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE     16
 #define SOLVER_FLAG_DUP_ALLOW_NAMECHANGE       17
+#define SOLVER_FLAG_KEEP_ORPHANS               18
+#define SOLVER_FLAG_BREAK_ORPHANS              19
 
 #define GET_USERINSTALLED_NAMES                        (1 << 0)        /* package names instead if ids */
 #define GET_USERINSTALLED_INVERTED             (1 << 1)        /* autoinstalled */