From: Michael Schroeder Date: Thu, 16 Apr 2020 21:30:43 +0000 (+0200) Subject: Conda: de-priorize track features X-Git-Tag: 0.7.12~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c7d13d05a587cec227fa22cc8e4b403e85b778c6;p=thirdparty%2Flibsolv.git Conda: de-priorize track features Based on a pull request by Wolf Vollprecht. Thanks! --- diff --git a/ext/repo_conda.c b/ext/repo_conda.c index 9352b71e..48cc1cd1 100644 --- a/ext/repo_conda.c +++ b/ext/repo_conda.c @@ -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); } diff --git a/src/knownid.h b/src/knownid.h index 96c9adf0..4c1730b5 100644 --- a/src/knownid.h +++ b/src/knownid.h @@ -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) diff --git a/src/policy.c b/src/policy.c index 10a2c4df..020571c6 100644 --- a/src/policy.c +++ b/src/policy.c @@ -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);