obey droporphaned map in keep_orhans mode
authorMichael Schroeder <mls@suse.de>
Tue, 22 Apr 2014 16:19:07 +0000 (18:19 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 22 Apr 2014 16:19:07 +0000 (18:19 +0200)
src/rules.c
src/solver.c

index 78cc1e0..264a1b7 100644 (file)
@@ -1249,8 +1249,8 @@ solver_addupdaterule(Solver *solv, Solvable *s, int allow_all)
   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 (solv->keep_orphans && !(solv->droporphanedmap_all || (solv->droporphanedmap.size && MAPTST(&solv->droporphanedmap, s - pool->solvables - solv->installed->start))))
+       p = s - pool->solvables;        /* keep this orphaned package installed */
     }
 
   if (!allow_all && qs.count && solv->multiversion.size)
index 282dd78..065cb7f 100644 (file)
@@ -3359,6 +3359,7 @@ solver_solve(Solver *solv, Queue *job)
   if (installed)
     {
       /* check for update/verify jobs as they need to be known early */
+      /* also setup the droporphaned map, we need it when creating update rules */
       for (i = 0; i < job->count; i += 2)
        {
          how = job->elements[i];
@@ -3444,6 +3445,19 @@ solver_solve(Solver *solv, Queue *job)
                    add_update_target(solv, p, how);
                }
              break;
+           case SOLVER_DROP_ORPHANED:
+             if (select == SOLVER_SOLVABLE_ALL || (select == SOLVER_SOLVABLE_REPO && what == installed->repoid))
+               solv->droporphanedmap_all = 1;
+             FOR_JOB_SELECT(p, pp, select, what)
+               {
+                 s = pool->solvables + p;
+                 if (s->repo != installed)
+                   continue;
+                 if (!solv->droporphanedmap.size)
+                   map_grow(&solv->droporphanedmap, installed->end - installed->start);
+                 MAPSET(&solv->droporphanedmap, p - installed->start);
+               }
+             break;
            default:
              break;
            }
@@ -3777,17 +3791,6 @@ solver_solve(Solver *solv, Queue *job)
          break;
        case SOLVER_DROP_ORPHANED:
          POOL_DEBUG(SOLV_DEBUG_JOB, "job: drop orphaned %s\n", solver_select2str(pool, select, what));
-         if (select == SOLVER_SOLVABLE_ALL || (select == SOLVER_SOLVABLE_REPO && installed && what == installed->repoid))
-           solv->droporphanedmap_all = 1;
-         FOR_JOB_SELECT(p, pp, select, what)
-           {
-             s = pool->solvables + p;
-             if (!installed || s->repo != installed)
-               continue;
-             if (!solv->droporphanedmap.size)
-               map_grow(&solv->droporphanedmap, installed->end - installed->start);
-             MAPSET(&solv->droporphanedmap, p - installed->start);
-           }
          break;
        case SOLVER_USERINSTALLED:
          POOL_DEBUG(SOLV_DEBUG_JOB, "job: user installed %s\n", solver_select2str(pool, select, what));
@@ -3797,10 +3800,6 @@ solver_solve(Solver *solv, Queue *job)
          break;
        }
        
-       /*
-        * debug
-        */
-       
       IF_POOLDEBUG (SOLV_DEBUG_JOB)
        {
          int j;