Imported Upstream version 0.7.20
[platform/upstream/libsolv.git] / src / cleandeps.c
index 1da28f6..31b1ad9 100644 (file)
@@ -669,6 +669,7 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
   queue_init(&iq);
   queue_init(&xsuppq);
 
+  /* setup userinstalled map and search for special namespace cleandeps erases */
   for (i = 0; i < job->count; i += 2)
     {
       how = job->elements[i];
@@ -748,7 +749,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
            continue;
          if (strncmp(pool_id2str(pool, s->name), "pattern:", 8) != 0)
            continue;
-         dp = s->repo->idarraydata + s->requires;
          for (dp = s->repo->idarraydata + s->requires; *dp; dp++)
            FOR_PROVIDES(p, pp, *dp)
              if (pool->solvables[p].repo == installed)
@@ -837,7 +837,7 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
                    if (MAPTST(&solv->multiversion, p))
                      break;
                  if (p)
-                   continue;
+                   continue;   /* found a multiversion package that will not obsolate anything */
                }
 
              om.size = 0;
@@ -875,23 +875,38 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
     }
   queue_init_clone(&iqcopy, &iq);
 
-  if (!unneeded)
-    {
-      if (solv->cleandeps_updatepkgs)
-       for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
-         queue_push(&iq, solv->cleandeps_updatepkgs->elements[i]);
-    }
-
   if (unneeded)
     queue_empty(&iq);  /* just in case... */
 
-  /* clear userinstalled bit for the packages we really want to delete/update */
+  /* clear userinstalled bits for the packages we really want to delete */
   for (i = 0; i < iq.count; i++)
     {
       p = iq.elements[i];
-      if (pool->solvables[p].repo != installed)
-       continue;
-      MAPCLR(&userinstalled, p - installed->start);
+      if (pool->solvables[p].repo == installed)
+        MAPCLR(&userinstalled, p - installed->start);
+    }
+  /* set userinstalled bits for all packages not in the considered map */
+  if (pool->considered)
+    {
+      for (p = installed->start; p < installed->end; p++)
+        if (!MAPTST(pool->considered, p))
+         MAPSET(&userinstalled, p - installed->start); /* we may not remove those */
+    }
+  if (!unneeded && solv->cleandeps_updatepkgs)
+    {
+      /* find update seeds */
+      queue_init(&updatepkgs_filtered);
+      find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
+      /* clear userinstalled bit for the packages we want to update */
+      /* also add them to the erase list */
+      for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
+       {
+         p = solv->cleandeps_updatepkgs->elements[i];
+         if (pool->considered && !MAPTST(pool->considered, p))
+           continue;
+         queue_push(&iq, p);
+         MAPCLR(&userinstalled, p - installed->start);
+       }
     }
 
   for (p = installed->start; p < installed->end; p++)
@@ -899,8 +914,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
       if (pool->solvables[p].repo != installed)
        continue;
       MAPSET(&installedm, p);
-      if (pool->considered && !MAPTST(pool->considered, p))
-       MAPSET(&userinstalled, p - installed->start);   /* we may not remove those */
       if (unneeded && !MAPTST(&userinstalled, p - installed->start))
        continue;
       MAPSET(&im, p);
@@ -908,13 +921,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
   MAPSET(&installedm, SYSTEMSOLVABLE);
   MAPSET(&im, SYSTEMSOLVABLE);
 
-  if (!unneeded && solv->cleandeps_updatepkgs)
-    {
-      /* find update "seeds" */
-      queue_init(&updatepkgs_filtered);
-      find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
-    }
-
 #ifdef CLEANDEPSDEBUG
   printf("REMOVE PASS\n");
 #endif
@@ -1368,11 +1374,11 @@ solver_check_cleandeps_mistakes(Solver *solv)
          if (!r->p || r == fr || cleandeps_rule_is_true(solv, r))
            {
              /* update rule is true, check best rules */
-             if (!solv->bestrules_pkg)
+             if (!solv->bestrules_info)
                continue;
              nj = solv->bestrules_end - solv->bestrules;
-             for (j = 0; j < nj; j++)
-               if (solv->bestrules_pkg[j] == i)
+             for (j = solv->bestrules_up - solv->bestrules; j < nj; j++)
+               if (solv->bestrules_info[j] == i)
                  {
                    r = solv->rules + solv->bestrules + j;
                    if (!cleandeps_rule_is_true(solv, r))