@@ -1398,6 +1398,8 @@ solver_free(Solver *solv)
13981398 map_free (& solv -> droporphanedmap );
13991399 map_free (& solv -> cleandepsmap );
14001400 map_free (& solv -> allowuninstallmap );
1401+ map_free (& solv -> excludefromweakmap );
1402+
14011403
14021404 solv_free (solv -> favormap );
14031405 solv_free (solv -> decisionmap );
@@ -2202,6 +2204,20 @@ prune_disfavored(Solver *solv, Queue *plist)
22022204 queue_truncate (plist , j );
22032205}
22042206
2207+ static void
2208+ prune_exclude_from_weak (Solver * solv , Queue * plist )
2209+ {
2210+ int i , j ;
2211+ for (i = j = 0 ; i < plist -> count ; i ++ )
2212+ {
2213+ Id p = plist -> elements [i ];
2214+ if (!MAPTST (& solv -> excludefromweakmap , p ))
2215+ plist -> elements [j ++ ] = p ;
2216+ }
2217+ if (i != j )
2218+ queue_truncate (plist , j );
2219+ }
2220+
22052221static int
22062222resolve_weak (Solver * solv , int level , int disablerules , Queue * dq , Queue * dqs , int * rerunp )
22072223{
@@ -2275,6 +2291,8 @@ resolve_weak(Solver *solv, int level, int disablerules, Queue *dq, Queue *dqs, i
22752291 continue ;
22762292 if (solv -> havedisfavored && solv -> favormap [i ] < 0 )
22772293 continue ; /* disfavored supplements, do not install */
2294+ if (solv -> excludefromweakmap .size && MAPTST (& solv -> excludefromweakmap , i ))
2295+ continue ; /* excluded for weak deps, do not install */
22782296 queue_push (dqs , i );
22792297 }
22802298 }
@@ -2283,6 +2301,10 @@ resolve_weak(Solver *solv, int level, int disablerules, Queue *dq, Queue *dqs, i
22832301 if (dq -> count && solv -> havedisfavored )
22842302 prune_disfavored (solv , dq );
22852303
2304+ /* filter out weak_excluded recommended packages */
2305+ if (solv -> excludefromweakmap .size )
2306+ prune_exclude_from_weak (solv , dq );
2307+
22862308 /* filter out all packages obsoleted by installed packages */
22872309 /* this is no longer needed if we have (and trust) reverse obsoletes */
22882310 if ((dqs -> count || dq -> count ) && solv -> installed )
@@ -3319,6 +3341,37 @@ add_complex_jobrules(Solver *solv, Id dep, int flags, int jobidx, int weak)
33193341}
33203342#endif
33213343
3344+ static void
3345+ solver_add_exclude_from_weak (Solver * solv )
3346+ {
3347+ Queue * job = & solv -> job ;
3348+ Pool * pool = solv -> pool ;
3349+ int i ;
3350+ Id p , pp , how , what , select ;
3351+ for (i = 0 ; i < job -> count ; i += 2 )
3352+ {
3353+ how = job -> elements [i ];
3354+ if ((how & SOLVER_JOBMASK ) != SOLVER_EXCLUDEFROMWEAK )
3355+ continue ;
3356+ if (!solv -> excludefromweakmap .size )
3357+ map_grow (& solv -> excludefromweakmap , pool -> nsolvables );
3358+ what = job -> elements [i + 1 ];
3359+ select = how & SOLVER_SELECTMASK ;
3360+ if (select == SOLVER_SOLVABLE_REPO )
3361+ {
3362+ Repo * repo = pool_id2repo (pool , what );
3363+ if (repo )
3364+ {
3365+ Solvable * s ;
3366+ FOR_REPO_SOLVABLES (repo , p , s )
3367+ MAPSET (& solv -> excludefromweakmap , p );
3368+ }
3369+ }
3370+ FOR_JOB_SELECT (p , pp , select , what )
3371+ MAPSET (& solv -> excludefromweakmap , p );
3372+ }
3373+ }
3374+
33223375static void
33233376setup_favormap (Solver * solv )
33243377{
@@ -3385,6 +3438,7 @@ solver_solve(Solver *solv, Queue *job)
33853438 int hasfavorjob = 0 ;
33863439 int haslockjob = 0 ;
33873440 int hasblacklistjob = 0 ;
3441+ int hasexcludefromweakjob = 0 ;
33883442
33893443 solve_start = solv_timems (0 );
33903444
@@ -3436,6 +3490,7 @@ solver_solve(Solver *solv, Queue *job)
34363490 map_zerosize (& solv -> droporphanedmap );
34373491 solv -> allowuninstall_all = 0 ;
34383492 map_zerosize (& solv -> allowuninstallmap );
3493+ map_zerosize (& solv -> excludefromweakmap );
34393494 map_zerosize (& solv -> cleandepsmap );
34403495 map_zerosize (& solv -> weakrulemap );
34413496 solv -> favormap = solv_free (solv -> favormap );
@@ -3999,6 +4054,10 @@ solver_solve(Solver *solv, Queue *job)
39994054 POOL_DEBUG (SOLV_DEBUG_JOB , "job: blacklist %s\n" , solver_select2str (pool , select , what ));
40004055 hasblacklistjob = 1 ;
40014056 break ;
4057+ case SOLVER_EXCLUDEFROMWEAK :
4058+ POOL_DEBUG (SOLV_DEBUG_JOB , "job: excludefromweak %s\n" , solver_select2str (pool , select , what ));
4059+ hasexcludefromweakjob = 1 ;
4060+ break ;
40024061 default :
40034062 POOL_DEBUG (SOLV_DEBUG_JOB , "job: unknown job\n" );
40044063 break ;
@@ -4057,6 +4116,9 @@ solver_solve(Solver *solv, Queue *job)
40574116 else
40584117 solv -> blackrules = solv -> blackrules_end = solv -> nrules ;
40594118
4119+ if (hasexcludefromweakjob )
4120+ solver_add_exclude_from_weak (solv );
4121+
40604122 if (solv -> havedisfavored && solv -> strongrecommends && solv -> recommendsruleq )
40614123 solver_addrecommendsrules (solv );
40624124 else
0 commit comments