@@ -3225,6 +3225,40 @@ solver_choicerulecheck2(Solver *solv, Id pi, Id pt, Queue *q)
32253225 return 0 ; /* not newest */
32263226}
32273227
3228+ static int
3229+ solver_choicerulecheck3 (Solver * solv , Id pt , Queue * q )
3230+ {
3231+ Pool * pool = solv -> pool ;
3232+ Id p , pp ;
3233+ int i ;
3234+
3235+ if (!q -> count || q -> elements [0 ] != pt )
3236+ {
3237+ Solvable * s = pool -> solvables + pt ;
3238+ if (q -> count )
3239+ queue_empty (q );
3240+ /* no installed package, so check all with same name */
3241+ queue_push2 (q , pt , 0 );
3242+ FOR_PROVIDES (p , pp , s -> name )
3243+ if (pool -> solvables [p ].name == s -> name && p != pt )
3244+ queue_push (q , p );
3245+ queue_push (q , pt );
3246+ }
3247+ if (q -> count <= 3 )
3248+ return q -> count == 3 && q -> elements [2 ] == pt ? 1 : 0 ;
3249+ if (!q -> elements [1 ])
3250+ {
3251+ queue_deleten (q , 0 , 2 );
3252+ policy_filter_unwanted (solv , q , POLICY_MODE_CHOOSE );
3253+ queue_unshift (q , 1 ); /* filter mark */
3254+ queue_unshift (q , pt );
3255+ }
3256+ for (i = 2 ; i < q -> count ; i ++ )
3257+ if (q -> elements [i ] == pt )
3258+ return 1 ;
3259+ return 0 ; /* not newest */
3260+ }
3261+
32283262static inline void
32293263queue_removeelement (Queue * q , Id el )
32303264{
@@ -3381,6 +3415,11 @@ solver_addchoicerules(Solver *solv)
33813415 isnewest = 0 ;
33823416 break ;
33833417 }
3418+ if (!p2 && !solver_choicerulecheck3 (solv , - p , & qcheck2 ))
3419+ {
3420+ isnewest = 0 ;
3421+ break ;
3422+ }
33843423 }
33853424 /* do extra checking */
33863425 for (i = j = 0 ; i < qi .count ; i += 2 )
0 commit comments