@@ -874,6 +874,11 @@ pool_buildflavorcmp(Pool *pool, Solvable *s1, Solvable *s2)
874874void
875875prune_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
9511025static int
9521026sort_by_name_evr_sortcmp (const void * ap , const void * bp , void * dp )
0 commit comments