]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Conda: de-priorize track features
authorMichael Schroeder <mls@suse.de>
Thu, 16 Apr 2020 21:30:43 +0000 (23:30 +0200)
committerMichael Schroeder <mls@suse.de>
Thu, 16 Apr 2020 21:32:40 +0000 (23:32 +0200)
Based on a pull request by Wolf Vollprecht. Thanks!

ext/repo_conda.c
src/knownid.h
src/policy.c

index 9352b71e3cec517acc7ef990f827218f0c83a59c..48cc1cd14a6fed3ce8c8e47b8e51d4974e11f7ba 100644 (file)
@@ -60,6 +60,30 @@ parse_otherdeps(struct parsedata *pd, struct solv_jsonparser *jp, Id handle, Id
   return type;
 }
 
+static int
+parse_trackfeatures(struct parsedata *pd, struct solv_jsonparser *jp, Id handle)
+{
+  int type = JP_ARRAY;
+  while (type > 0 && (type = jsonparser_parse(jp)) > 0 && type != JP_ARRAY_END)
+    {
+      if (type == JP_STRING)
+       {
+         char *p = jp->value, *pe;
+         while (*p == ' ' || *p == '\t')
+           p++;
+         if (!*p)
+           continue;
+         for (pe = p + strlen(p) - 1; pe > p; pe--)
+           if (*pe != ' ' && *pe != '\t')
+             break;
+         repodata_add_idarray(pd->data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pd->pool, p, pe - p + 1, 1));
+       }
+      else
+       type = jsonparser_skip(jp, type);
+    }
+  return type;
+}
+
 static int
 parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
 {
@@ -107,6 +131,22 @@ parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
            ts /= 1000;
          repodata_set_num(data, handle, SOLVABLE_BUILDTIME, ts);
        }
+      else if (type == JP_STRING && !strcmp(jp->key, "track_features"))
+       {
+         char *p = jp->value, *pe;
+         for (; *p; p++)
+           {
+             if (*p == ' ' || *p == '\t' || *p == ',')
+               continue;
+             pe = p + 1;
+             while (*pe && *pe != ' ' && *pe != '\t' && *pe != ',')
+               pe++;
+             repodata_add_idarray(data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pool, p, pe - p, 1));
+             p = pe - 1;
+           }
+       }
+      else if (type == JP_ARRAY && !strcmp(jp->key, "track_features"))
+       type = parse_trackfeatures(pd, jp, handle);
       else
        type = jsonparser_skip(jp, type);
     }
index 96c9adf019d0be3e0136aa3b5cf23b78cff57625..4c1730b579f16789cec6302ecb16bbc1dcca6cde 100644 (file)
@@ -266,6 +266,7 @@ KNOWNID(UPDATE_STATUS,                      "update:status"),               /* "stable", "testing", ...*/
 KNOWNID(LIBSOLV_SELF_DESTRUCT_PKG,      "libsolv-self-destruct-pkg()"),        /* this package will self-destruct on installation */
 
 KNOWNID(SOLVABLE_CONSTRAINS,           "solvable:constrains"),         /* conda */
+KNOWNID(SOLVABLE_TRACK_FEATURES,       "solvable:track_features"),     /* conda */
 
 KNOWNID(ID_NUM_INTERNAL,               0)
 
index 10a2c4df6a0c34e3da0eb717e4a01de01e975ad5..020571c6cf2c12b23f3abdf7b3c68ecb646b66f5 100644 (file)
@@ -846,8 +846,14 @@ pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2)
 static int
 pool_buildflavorcmp(Pool *pool, Solvable *s1, Solvable *s2)
 {
-  const char *f1 = solvable_lookup_str(s1, SOLVABLE_BUILDFLAVOR);
-  const char *f2 = solvable_lookup_str(s2, SOLVABLE_BUILDFLAVOR);
+  const char *f1, *f2;
+  unsigned int cnt1, cnt2;
+  cnt1 = solvable_lookup_count(s1, SOLVABLE_TRACK_FEATURES);
+  cnt2 = solvable_lookup_count(s2, SOLVABLE_TRACK_FEATURES);
+  if (cnt1 != cnt2)
+    return cnt1 > cnt2 ? -1 : 1;
+  f1 = solvable_lookup_str(s1, SOLVABLE_BUILDFLAVOR);
+  f2 = solvable_lookup_str(s2, SOLVABLE_BUILDFLAVOR);
   if (!f1 && !f2)
     return 0;
   return pool_evrcmp_str(pool, f1 ? f1 : "" , f2 ? f2 : "", EVRCMP_COMPARE);