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)
{
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);
}
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)
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);