]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add SOLVER_FLAG_INSTALL_ALSO_UPDATES solver flag
authorMichael Schroeder <mls@suse.de>
Wed, 23 Nov 2016 13:27:11 +0000 (14:27 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 23 Nov 2016 13:27:11 +0000 (14:27 +0100)
bindings/solv.i
ext/testcase.c
src/solver.c
src/solver.h

index 9e0a81766baad1c38f55fcd2c544170491279eab..03fd139471aa6c4f65a2ee12548b470cb6e8add0 100644 (file)
@@ -3288,6 +3288,7 @@ rb_eval_string(
   static const int SOLVER_FLAG_NEED_UPDATEPROVIDE = SOLVER_FLAG_NEED_UPDATEPROVIDE;
   static const int SOLVER_FLAG_FOCUS_BEST = SOLVER_FLAG_FOCUS_BEST;
   static const int SOLVER_FLAG_STRONG_RECOMMENDS = SOLVER_FLAG_STRONG_RECOMMENDS;
+  static const int SOLVER_FLAG_INSTALL_ALSO_UPDATES = SOLVER_FLAG_INSTALL_ALSO_UPDATES;
 
   static const int SOLVER_REASON_UNRELATED = SOLVER_REASON_UNRELATED;
   static const int SOLVER_REASON_UNIT_RULE = SOLVER_REASON_UNIT_RULE;
index ce090b66471bb9fb1e39be8bd2f03e38d274f44f..ccfcb61d1fd174f3d2e5e6777ff942784f9158bb 100644 (file)
@@ -117,6 +117,7 @@ static struct solverflags2str {
   { SOLVER_FLAG_URPM_REORDER,               "urpmreorder", 0 },
   { SOLVER_FLAG_FOCUS_BEST,                 "focusbest", 0 },
   { SOLVER_FLAG_STRONG_RECOMMENDS,          "strongrecommends", 0 },
+  { SOLVER_FLAG_INSTALL_ALSO_UPDATES,       "installalsoupdates", 0 },
   { 0, 0, 0 }
 };
 
index 08ad92d1fed8818aeec4045f7b4eb137c4ec2368..c75974661119ef8b6bf164db42ea18ec76ec6903 100644 (file)
@@ -1711,6 +1711,8 @@ solver_get_flag(Solver *solv, int flag)
     return solv->urpmreorder;
   case SOLVER_FLAG_STRONG_RECOMMENDS:
     return solv->strongrecommends;
+  case SOLVER_FLAG_INSTALL_ALSO_UPDATES:
+    return solv->install_also_updates;
   default:
     break;
   }
@@ -1798,6 +1800,9 @@ solver_set_flag(Solver *solv, int flag, int value)
   case SOLVER_FLAG_STRONG_RECOMMENDS:
     solv->strongrecommends = value;
     break;
+  case SOLVER_FLAG_INSTALL_ALSO_UPDATES:
+    solv->install_also_updates = value;
+    break;
   default:
     break;
   }
@@ -1838,24 +1843,26 @@ resolve_jobrules(Solver *solv, int level, int disablerules, Queue *dq)
        continue;
       /* prune to installed if not updating */
       if (dq->count > 1 && solv->installed && !solv->updatemap_all &&
+         !solv->install_also_updates &&
          !(solv->job.elements[solv->ruletojob.elements[i - solv->jobrules]] & SOLVER_ORUPDATE))
        {
-         int j, k;
-         for (j = k = 0; j < dq->count; j++)
+         int j = dq->count, k;
+         if (solv->updatemap.size)
            {
-             Solvable *s = pool->solvables + dq->elements[j];
-             if (s->repo == solv->installed)
-               {
-                 dq->elements[k++] = dq->elements[j];
-                 if (solv->updatemap.size && MAPTST(&solv->updatemap, dq->elements[j] - solv->installed->start))
-                   {
-                     k = 0;    /* package wants to be updated, do not prune */
-                     break;
-                   }
-               }
+             /* do not prune if an installed package wants to be updated */
+             for (j = 0; j < dq->count; j++)
+               if (pool->solvables[dq->elements[j]].repo == solv->installed
+                   && MAPTST(&solv->updatemap, dq->elements[j] - solv->installed->start))
+                 break;
+           }
+         if (j == dq->count)
+           {
+             for (j = k = 0; j < dq->count; j++)
+               if (pool->solvables[dq->elements[j]].repo == solv->installed)
+                 dq->elements[k++] = dq->elements[j];
+             if (k)
+               dq->count = k;
            }
-         if (k)
-           dq->count = k;
        }
       olevel = level;
       level = selectandinstall(solv, level, dq, disablerules, i, SOLVER_REASON_RESOLVE_JOB);
index 8f0b0dbe422df99bb29c75ac30f445577590654d..15fdf3f213cb61a2248c5e6cb2540338b3115982 100644 (file)
@@ -165,6 +165,7 @@ struct _Solver {
   int do_yum_obsoletes;                        /* true: add special yumobs rules */
   int urpmreorder;                     /* true: do special urpm package reordering */
   int strongrecommends;                        /* true: create weak rules for recommends */
+  int install_also_updates;            /* true: do not prune install job rules to installed packages */
 
   Map dupmap;                          /* dup these packages*/
   int dupmap_all;                      /* dup all packages */
@@ -313,6 +314,7 @@ typedef struct _Solver Solver;
 #define SOLVER_FLAG_URPM_REORDER               23
 #define SOLVER_FLAG_FOCUS_BEST                 24
 #define SOLVER_FLAG_STRONG_RECOMMENDS          25
+#define SOLVER_FLAG_INSTALL_ALSO_UPDATES       26
 
 #define GET_USERINSTALLED_NAMES                        (1 << 0)        /* package names instead of ids */
 #define GET_USERINSTALLED_INVERTED             (1 << 1)        /* autoinstalled */