]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Implement urpmi kernel reordering
authorMichael Schroeder <mls@suse.de>
Wed, 18 May 2016 12:49:30 +0000 (14:49 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 18 May 2016 12:49:30 +0000 (14:49 +0200)
src/policy.c

index 85c9e0751143588da757e849da6d26b518a677b1..3a0a73760026ef00e602b0765e4641c9b774f623 100644 (file)
@@ -1216,7 +1216,55 @@ urpm_reorder(Solver *solv, Queue *plist)
     {
       Solvable *s = pool->solvables + plist->elements[i];
       int score = 1;
-      if (s->requires)
+      const char *sn = pool_id2str(pool, s->name);
+
+      if (!strncmp(sn, "kernel-", 7))
+       {
+         const char *devel = strstr(sn, "-devel-");
+         if (devel && strlen(sn) < 256)
+           {
+             char kn[256];
+             Id p, pp, knid;
+             memcpy(kn, sn, devel - sn);
+             strcpy(kn + (devel - sn), devel + 6);
+             knid = pool_str2id(pool, kn, 0);
+             if (knid)
+               {
+                 FOR_PROVIDES(p, pp, knid)
+                   if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
+                     score = 3;
+               }
+           }
+       }
+      else if ((sn = strstr(sn, "-kernel-")) != 0)
+       {
+         sn += 8;
+         if (strlen(sn) < 256 - 8 && *sn >= '0' && *sn <= '9' && sn[1] == '.')
+           {
+             const char *flavor = strchr(sn, '-');
+             if (flavor)
+               {
+                 const char *release = strchr(flavor + 1, '-');
+                 if (release)
+                   {
+                     char kn[256];
+                     Id p, pp, knid;
+                     memcpy(kn, "kernel", 8);
+                     memcpy(kn + 6, flavor, release - flavor + 1);
+                     memcpy(kn + 6 + (release - flavor) + 1, sn, flavor - sn);
+                     strcpy(kn + 6 + (release + 1 - sn), release);
+                     knid = pool_str2id(pool, kn, 0);
+                     if (knid)
+                       {
+                         FOR_PROVIDES(p, pp, knid)
+                           if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
+                             score = 3;
+                       }
+                   }
+               }
+           }
+       }
+      if (score == 1 && s->requires)
        {
          Id id, *idp, p, pp;
          const char *deps;