Skip to content

Commit 5995c5b

Browse files
committed
put prune to best version into conda specific version
1 parent 79b364f commit 5995c5b

3 files changed

Lines changed: 97 additions & 55 deletions

File tree

src/policy.c

Lines changed: 88 additions & 49 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,67 +914,19 @@ 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
}
936926

937-
#ifdef ENABLE_CONDA
938-
/**************
939-
* do some conda stuff
940-
**************/
941-
942-
Queue q;
943-
queue_init(&q);
944-
for (i = j = 0; i < plist->count; i++) {
945-
s = pool->solvables + plist->elements[i];
946-
if (pool->disttype == DISTTYPE_CONDA)
947-
r = pool_featurecountcmp(pool, best, s);
948-
if (r == 0)
949-
r = best->evr != s->evr
950-
? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE)
951-
: 0;
952-
if (pool->disttype == DISTTYPE_CONDA) {
953-
if (r == 0)
954-
r = (best->repo ? best->repo->subpriority : 0) -
955-
(s->repo ? s->repo->subpriority : 0);
956-
if (r == 0) r = pool_buildversioncmp(pool, best, s);
957-
if (r <= 0) {
958-
queue_push(&q, s - pool->solvables);
959-
continue;
960-
}
961-
}
962-
}
963-
964-
for (i = 0; i < q.count; ++i) {
965-
plist->elements[i] = q.elements[i];
966-
}
967-
plist->count = q.count;
968-
queue_free(&q);
969-
#else
970927
plist->elements[j++] = best - pool->solvables; /* finish last group */
971928
plist->count = j;
972-
#endif
929+
973930
/* we reduced the list to one package per name, now look at
974931
* package obsoletes */
975932
if (plist->count > 1)
@@ -982,6 +939,88 @@ prune_to_best_version(Pool *pool, Queue *plist)
982939
}
983940

984941

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+
9851024
static int
9861025
sort_by_name_evr_sortcmp(const void *ap, const void *bp, void *dp)
9871026
{

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: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3376,12 +3376,12 @@ setup_trackfeatures_favor(Solver *solv)
33763376
Solvable *s = pool->solvables + p;
33773377
cnt = solvable_lookup_count(s, SOLVABLE_TRACK_FEATURES);
33783378
if (cnt != 0)
3379-
{
3380-
idx += 1;
3381-
solv->favormap[p] = -idx;
3382-
solv->havedisfavored = 1;
3383-
}
3384-
}
3379+
{
3380+
idx++;
3381+
solv->favormap[p] = -idx;
3382+
solv->havedisfavored = 1;
3383+
}
3384+
}
33853385
}
33863386

33873387
/*

0 commit comments

Comments
 (0)