Skip to content

Commit 316da14

Browse files
committed
improve conda variant handling
1 parent e2ed3f2 commit 316da14

4 files changed

Lines changed: 121 additions & 17 deletions

File tree

src/conda.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ solv_vercmp_conda(const char *s1, const char *q1, const char *s2, const char *q2
134134
return -1;
135135
if (s1p - s1 > s2p - s2)
136136
return 1;
137-
r = s1p - s1 ? strncmp(s1, s2, s1p - s1) : 0;
137+
r = (s1p - s1) ? strncmp(s1, s2, s1p - s1) : 0;
138138
if (r)
139139
return r;
140140
}

src/policy.c

Lines changed: 89 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,11 @@ pool_buildflavorcmp(Pool *pool, Solvable *s1, Solvable *s2)
874874
void
875875
prune_to_best_version(Pool *pool, Queue *plist)
876876
{
877+
#ifdef ENABLE_CONDA
878+
if (pool->disttype == DISTTYPE_CONDA)
879+
return prune_to_best_version_conda(pool, plist);
880+
#endif
881+
877882
int i, j, r;
878883
Solvable *s, *best;
879884

@@ -909,30 +914,16 @@ prune_to_best_version(Pool *pool, Queue *plist)
909914
}
910915

911916
r = 0;
912-
#ifdef ENABLE_CONDA
913-
if (pool->disttype == DISTTYPE_CONDA)
914-
r = pool_featurecountcmp(pool, best, s);
915-
#endif
916917
if (r == 0)
917918
r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0;
918919
#ifdef ENABLE_LINKED_PKGS
919920
if (r == 0 && has_package_link(pool, s))
920921
r = pool_link_evrcmp(pool, best, s);
921-
#endif
922-
#ifdef ENABLE_CONDA
923-
if (pool->disttype == DISTTYPE_CONDA)
924-
{
925-
if (r == 0)
926-
r = (best->repo ? best->repo->subpriority : 0) - (s->repo ? s->repo->subpriority : 0);
927-
if (r == 0)
928-
r = pool_buildversioncmp(pool, best, s);
929-
if (r == 0)
930-
r = pool_buildflavorcmp(pool, best, s);
931-
}
932922
#endif
933923
if (r < 0)
934924
best = s;
935925
}
926+
936927
plist->elements[j++] = best - pool->solvables; /* finish last group */
937928
plist->count = j;
938929

@@ -947,6 +938,89 @@ prune_to_best_version(Pool *pool, Queue *plist)
947938
}
948939
}
949940

941+
#ifdef ENABLE_CONDA
942+
/*
943+
* prune_to_best_version_conda
944+
*
945+
* sort list of packages (given through plist) by name and evr
946+
* return result through plist
947+
*/
948+
void
949+
prune_to_best_version_conda(Pool *pool, Queue *plist)
950+
{
951+
int i, j, r;
952+
Solvable *s, *best;
953+
954+
if (plist->count < 2) /* no need to prune for a single entry */
955+
return;
956+
POOL_DEBUG(SOLV_DEBUG_POLICY, "prune_to_best_version_conda %d\n", plist->count);
957+
958+
/* sort by name first, prefer installed */
959+
solv_sort(plist->elements, plist->count, sizeof(Id), prune_to_best_version_sortcmp, pool);
960+
961+
/* now find best 'per name' */
962+
best = 0;
963+
for (i = j = 0; i < plist->count; i++)
964+
{
965+
s = pool->solvables + plist->elements[i];
966+
967+
POOL_DEBUG(SOLV_DEBUG_POLICY, "- %s [%d]%s\n",
968+
pool_solvable2str(pool, s), plist->elements[i],
969+
(pool->installed && s->repo == pool->installed) ? "I" : "");
970+
971+
if (!best) /* if no best yet, the current is best */
972+
{
973+
best = s;
974+
continue;
975+
}
976+
977+
/* name switch: finish group, re-init */
978+
if (best->name != s->name) /* new name */
979+
{
980+
plist->elements[j++] = best - pool->solvables; /* move old best to front */
981+
best = s; /* take current as new best */
982+
continue;
983+
}
984+
985+
r = 0;
986+
r = pool_featurecountcmp(pool, best, s);
987+
if (r == 0)
988+
r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0;
989+
if (r == 0)
990+
r = (best->repo ? best->repo->subpriority : 0) - (s->repo ? s->repo->subpriority : 0);
991+
if (r == 0)
992+
r = pool_buildversioncmp(pool, best, s);
993+
if (r == 0)
994+
r = pool_buildflavorcmp(pool, best, s);
995+
if (r < 0)
996+
best = s;
997+
}
998+
999+
Queue q;
1000+
queue_init(&q);
1001+
for (i = j = 0; i < plist->count; i++)
1002+
{
1003+
s = pool->solvables + plist->elements[i];
1004+
r = pool_featurecountcmp(pool, best, s);
1005+
if (r == 0)
1006+
r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0;
1007+
if (r == 0)
1008+
r = (best->repo ? best->repo->subpriority : 0) - (s->repo ? s->repo->subpriority : 0);
1009+
if (r == 0)
1010+
r = pool_buildversioncmp(pool, best, s);
1011+
if (r == 0)
1012+
queue_push(&q, s - pool->solvables);
1013+
}
1014+
1015+
for (i = 0; i < q.count; ++i)
1016+
{
1017+
plist->elements[i] = q.elements[i];
1018+
}
1019+
1020+
plist->count = q.count;
1021+
queue_free(&q);
1022+
}
1023+
#endif // ENABLE_CONDA
9501024

9511025
static int
9521026
sort_by_name_evr_sortcmp(const void *ap, const void *bp, void *dp)

src/policy.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ extern void pool_best_solvables(Pool *pool, Queue *plist, int flags);
4343

4444
/* internal, do not use */
4545
extern void prune_to_best_version(Pool *pool, Queue *plist);
46+
#ifdef ENABLE_CONDA
47+
extern void prune_to_best_version_conda(Pool *pool, Queue *plist);
48+
#endif
4649
extern void policy_prefer_favored(Solver *solv, Queue *plist);
4750

4851

src/solver.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3360,6 +3360,30 @@ setup_favormap(Solver *solv)
33603360
}
33613361
}
33623362

3363+
static void
3364+
setup_trackfeatures_favor(Solver *solv)
3365+
{
3366+
Pool *pool = solv->pool;
3367+
int idx, cnt;
3368+
Id p;
3369+
3370+
solv_free(solv->favormap);
3371+
solv->favormap = solv_calloc(pool->nsolvables, sizeof(Id));
3372+
3373+
idx = 0;
3374+
FOR_POOL_SOLVABLES(p)
3375+
{
3376+
Solvable *s = pool->solvables + p;
3377+
cnt = solvable_lookup_count(s, SOLVABLE_TRACK_FEATURES);
3378+
if (cnt != 0)
3379+
{
3380+
idx++;
3381+
solv->favormap[p] = -idx;
3382+
solv->havedisfavored = 1;
3383+
}
3384+
}
3385+
}
3386+
33633387
/*
33643388
*
33653389
* solve job queue
@@ -4022,7 +4046,10 @@ solver_solve(Solver *solv, Queue *job)
40224046
/* create favormap if we have favor jobs */
40234047
if (hasfavorjob)
40244048
setup_favormap(solv);
4025-
4049+
#ifdef ENABLE_CONDA
4050+
else
4051+
setup_trackfeatures_favor(solv);
4052+
#endif
40264053
/* now create infarch and dup rules */
40274054
if (!solv->noinfarchcheck)
40284055
solver_addinfarchrules(solv, &addedmap);

0 commit comments

Comments
 (0)