]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add the SOLVER_FLAG_URPM_REORDER solver flag
authorMichael Schroeder <mls@suse.de>
Fri, 13 May 2016 13:03:39 +0000 (15:03 +0200)
committerMichael Schroeder <mls@suse.de>
Fri, 13 May 2016 13:03:39 +0000 (15:03 +0200)
It makes the solver reorder alternatives more
closely to what urpm does.

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

index 16c7a187e3a99147d584ed05fac3613bc24e5156..6e2b5746efb055f3b46a26b0874d3158ad9814c5 100644 (file)
@@ -114,6 +114,7 @@ static struct solverflags2str {
   { SOLVER_FLAG_FOCUS_INSTALLED,            "focusinstalled", 0 },
   { SOLVER_FLAG_YUM_OBSOLETES,              "yumobsoletes", 0 },
   { SOLVER_FLAG_NEED_UPDATEPROVIDE,         "needupdateprovide", 0 },
+  { SOLVER_FLAG_URPM_REORDER,               "urpmreorder", 0 },
   { 0, 0, 0 }
 };
 
@@ -1556,7 +1557,11 @@ testcase_setsolverflags(Solver *solv, const char *str)
          pool_debug(solv->pool, SOLV_ERROR, "setsolverflags: unknown flag '%.*s'\n", (int)(p - s), s);
          return 0;
        }
-      solver_set_flag(solv, solverflags2str[i].flag, v);
+      if (solver_set_flag(solv, solverflags2str[i].flag, v) == -1)
+       {
+         pool_debug(solv->pool, SOLV_ERROR, "setsolverflags: unsupported flag '%s'\n", solverflags2str[i].str);
+         return 0;
+       }
     }
   return 1;
 }
index 8b8412ddcfddd6f77612af2fae9f069fb830f1a2..85c9e0751143588da757e849da6d26b518a677b1 100644 (file)
@@ -1195,6 +1195,63 @@ dislike_old_versions(Pool *pool, Queue *plist)
     }
 }
 
+
+/* special lang package handling for urpm */
+/* see https://bugs.mageia.org/show_bug.cgi?id=18315 */
+
+static int
+urpm_reorder_cmp(const void *ap, const void *bp, void *dp)
+{
+  return ((Id *)bp)[1] - ((Id *)ap)[1];
+}
+
+static void
+urpm_reorder(Solver *solv, Queue *plist)
+{
+  Pool *pool = solv->pool;
+  int i, count = plist->count;
+  /* add locale score to packages */
+  queue_insertn(plist, count, count, 0);
+  for (i = count - 1; i >= 0; i--)
+    {
+      Solvable *s = pool->solvables + plist->elements[i];
+      int score = 1;
+      if (s->requires)
+       {
+         Id id, *idp, p, pp;
+         const char *deps;
+         for (idp = s->repo->idarraydata + s->requires; (id = *idp) != 0; idp++)
+           {
+             while (ISRELDEP(id))
+               {
+                 Reldep *rd = GETRELDEP(pool, id);
+                 id = rd->name;
+               }
+             deps = strstr(pool_id2str(pool, id), "locales-");
+             if (!deps)
+               continue;
+             if (!strncmp(deps + 8, "en", 2))
+               score = 2;
+             else
+               {
+                 score = 0;
+                 FOR_PROVIDES(p, pp, id)
+                   if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
+                     score = 3;
+                 break;
+               }
+           }
+       }
+      plist->elements[i * 2] = plist->elements[i];
+      plist->elements[i * 2 + 1] = score;
+    }
+  solv_sort(plist->elements, count, sizeof(Id) * 2, urpm_reorder_cmp, pool);
+  for (i = 0; i < count; i++)
+    plist->elements[i] = plist->elements[2 * i];
+  queue_truncate(plist, count);
+}
+
+
 /*
  *  POLICY_MODE_CHOOSE:     default, do all pruning steps
  *  POLICY_MODE_RECOMMEND:  leave out prune_to_recommended
@@ -1209,6 +1266,8 @@ policy_filter_unwanted(Solver *solv, Queue *plist, int mode)
       /* reorder only */
       dislike_old_versions(pool, plist);
       sort_by_common_dep(pool, plist);
+      if (solv->urpmreorder)
+        urpm_reorder(solv, plist);
       prefer_suggested(solv, plist);
       policy_prefer_favored(solv, plist);
       return;
@@ -1235,6 +1294,8 @@ policy_filter_unwanted(Solver *solv, Queue *plist, int mode)
 #endif
          dislike_old_versions(pool, plist);
          sort_by_common_dep(pool, plist);
+         if (solv->urpmreorder)
+           urpm_reorder(solv, plist);
          prefer_suggested(solv, plist);
          policy_prefer_favored(solv, plist);
        }
index dc42dcdcec36c53586aa6cfaf980ce9ecde762aa..5da8529547eb35aac6befb5d0cc6f38b7d2c74cf 100644 (file)
@@ -1784,6 +1784,8 @@ solver_get_flag(Solver *solv, int flag)
     return solv->do_yum_obsoletes;
   case SOLVER_FLAG_NEED_UPDATEPROVIDE:
     return solv->needupdateprovide;
+  case SOLVER_FLAG_URPM_REORDER:
+    return solv->urpmreorder;
   default:
     break;
   }
@@ -1862,6 +1864,9 @@ solver_set_flag(Solver *solv, int flag, int value)
   case SOLVER_FLAG_NEED_UPDATEPROVIDE:
     solv->needupdateprovide = value;
     break;
+  case SOLVER_FLAG_URPM_REORDER:
+    solv->urpmreorder = value;
+    break;
   default:
     break;
   }
index 9424902fa28676a4b7b3d0b57a2add0935cf90f3..3495fd8190b69e4cd0288d08870e5bb2cce1afb5 100644 (file)
@@ -167,6 +167,7 @@ struct _Solver {
   int noautotarget;                    /* true: do not assume targeted for up/dup jobs that contain no installed solvable */
   int focus_installed;                 /* true: resolve update rules first */
   int do_yum_obsoletes;                        /* true: add special yumobs rules */
+  int urpmreorder;                     /* true: do special urpm package reordering */
 
   Map dupmap;                          /* dup these packages*/
   int dupmap_all;                      /* dup all packages */
@@ -307,6 +308,7 @@ typedef struct _Solver Solver;
 #define SOLVER_FLAG_FOCUS_INSTALLED            20
 #define SOLVER_FLAG_YUM_OBSOLETES              21
 #define SOLVER_FLAG_NEED_UPDATEPROVIDE         22
+#define SOLVER_FLAG_URPM_REORDER               23
 
 #define GET_USERINSTALLED_NAMES                        (1 << 0)        /* package names instead of ids */
 #define GET_USERINSTALLED_INVERTED             (1 << 1)        /* autoinstalled */