Skip to content

Commit c7d13d0

Browse files
committed
Conda: de-priorize track features
Based on a pull request by Wolf Vollprecht. Thanks!
1 parent 819bbc2 commit c7d13d0

3 files changed

Lines changed: 49 additions & 2 deletions

File tree

ext/repo_conda.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,30 @@ parse_otherdeps(struct parsedata *pd, struct solv_jsonparser *jp, Id handle, Id
6060
return type;
6161
}
6262

63+
static int
64+
parse_trackfeatures(struct parsedata *pd, struct solv_jsonparser *jp, Id handle)
65+
{
66+
int type = JP_ARRAY;
67+
while (type > 0 && (type = jsonparser_parse(jp)) > 0 && type != JP_ARRAY_END)
68+
{
69+
if (type == JP_STRING)
70+
{
71+
char *p = jp->value, *pe;
72+
while (*p == ' ' || *p == '\t')
73+
p++;
74+
if (!*p)
75+
continue;
76+
for (pe = p + strlen(p) - 1; pe > p; pe--)
77+
if (*pe != ' ' && *pe != '\t')
78+
break;
79+
repodata_add_idarray(pd->data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pd->pool, p, pe - p + 1, 1));
80+
}
81+
else
82+
type = jsonparser_skip(jp, type);
83+
}
84+
return type;
85+
}
86+
6387
static int
6488
parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
6589
{
@@ -107,6 +131,22 @@ parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
107131
ts /= 1000;
108132
repodata_set_num(data, handle, SOLVABLE_BUILDTIME, ts);
109133
}
134+
else if (type == JP_STRING && !strcmp(jp->key, "track_features"))
135+
{
136+
char *p = jp->value, *pe;
137+
for (; *p; p++)
138+
{
139+
if (*p == ' ' || *p == '\t' || *p == ',')
140+
continue;
141+
pe = p + 1;
142+
while (*pe && *pe != ' ' && *pe != '\t' && *pe != ',')
143+
pe++;
144+
repodata_add_idarray(data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pool, p, pe - p, 1));
145+
p = pe - 1;
146+
}
147+
}
148+
else if (type == JP_ARRAY && !strcmp(jp->key, "track_features"))
149+
type = parse_trackfeatures(pd, jp, handle);
110150
else
111151
type = jsonparser_skip(jp, type);
112152
}

src/knownid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ KNOWNID(UPDATE_STATUS, "update:status"), /* "stable", "testing", ...*/
266266
KNOWNID(LIBSOLV_SELF_DESTRUCT_PKG, "libsolv-self-destruct-pkg()"), /* this package will self-destruct on installation */
267267

268268
KNOWNID(SOLVABLE_CONSTRAINS, "solvable:constrains"), /* conda */
269+
KNOWNID(SOLVABLE_TRACK_FEATURES, "solvable:track_features"), /* conda */
269270

270271
KNOWNID(ID_NUM_INTERNAL, 0)
271272

src/policy.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -846,8 +846,14 @@ pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2)
846846
static int
847847
pool_buildflavorcmp(Pool *pool, Solvable *s1, Solvable *s2)
848848
{
849-
const char *f1 = solvable_lookup_str(s1, SOLVABLE_BUILDFLAVOR);
850-
const char *f2 = solvable_lookup_str(s2, SOLVABLE_BUILDFLAVOR);
849+
const char *f1, *f2;
850+
unsigned int cnt1, cnt2;
851+
cnt1 = solvable_lookup_count(s1, SOLVABLE_TRACK_FEATURES);
852+
cnt2 = solvable_lookup_count(s2, SOLVABLE_TRACK_FEATURES);
853+
if (cnt1 != cnt2)
854+
return cnt1 > cnt2 ? -1 : 1;
855+
f1 = solvable_lookup_str(s1, SOLVABLE_BUILDFLAVOR);
856+
f2 = solvable_lookup_str(s2, SOLVABLE_BUILDFLAVOR);
851857
if (!f1 && !f2)
852858
return 0;
853859
return pool_evrcmp_str(pool, f1 ? f1 : "" , f2 ? f2 : "", EVRCMP_COMPARE);

0 commit comments

Comments
 (0)