@@ -2101,6 +2101,97 @@ reenableduprule(Solver *solv, Id name)
21012101 }
21022102}
21032103
2104+ /***********************************************************************
2105+ ***
2106+ *** Black rule part
2107+ ***/
2108+
2109+ static inline void
2110+ disableblackrule (Solver * solv , Id p )
2111+ {
2112+ Rule * r ;
2113+ int i ;
2114+ for (i = solv -> blackrules , r = solv -> rules + i ; i < solv -> blackrules_end ; i ++ , r ++ )
2115+ if (r -> p == - p )
2116+ solver_disablerule (solv , r );
2117+ }
2118+
2119+ static inline void
2120+ reenableblackrule (Solver * solv , Id p )
2121+ {
2122+ Pool * pool = solv -> pool ;
2123+ Rule * r ;
2124+ int i ;
2125+ for (i = solv -> blackrules , r = solv -> rules + i ; i < solv -> blackrules_end ; i ++ , r ++ )
2126+ if (r -> p == - p )
2127+ {
2128+ solver_enablerule (solv , r );
2129+ IF_POOLDEBUG (SOLV_DEBUG_SOLUTIONS )
2130+ {
2131+ POOL_DEBUG (SOLV_DEBUG_SOLUTIONS , "@@@ re-enabling " );
2132+ solver_printruleclass (solv , SOLV_DEBUG_SOLUTIONS , r );
2133+ }
2134+ }
2135+ }
2136+
2137+ void
2138+ solver_addblackrules (Solver * solv )
2139+ {
2140+ int i ;
2141+ Id how , select , what , p , pp ;
2142+ Queue * job = & solv -> job ;
2143+ Pool * pool = solv -> pool ;
2144+ Repo * installed = solv -> installed ;
2145+ Map updatemap ;
2146+
2147+ map_init (& updatemap , 0 );
2148+ solv -> blackrules = solv -> nrules ;
2149+ if (installed )
2150+ {
2151+ for (i = 0 ; i < job -> count ; i += 2 )
2152+ {
2153+ how = job -> elements [i ];
2154+ select = job -> elements [i ] & SOLVER_SELECTMASK ;
2155+ what = job -> elements [i + 1 ];
2156+ switch (how & SOLVER_JOBMASK )
2157+ {
2158+ case SOLVER_BLACKLIST :
2159+ FOR_JOB_SELECT (p , pp , select , what )
2160+ {
2161+ Solvable * s = pool -> solvables + p ;
2162+ if (s -> repo != installed )
2163+ continue ;
2164+ if (!updatemap .size )
2165+ map_grow (& updatemap , pool -> ss .nstrings );
2166+ if (s -> name > 0 && s -> name < pool -> ss .nstrings )
2167+ MAPSET (& updatemap , s -> name );
2168+ }
2169+ }
2170+ }
2171+ }
2172+ for (i = 0 ; i < job -> count ; i += 2 )
2173+ {
2174+ how = job -> elements [i ];
2175+ select = job -> elements [i ] & SOLVER_SELECTMASK ;
2176+ what = job -> elements [i + 1 ];
2177+ switch (how & SOLVER_JOBMASK )
2178+ {
2179+ case SOLVER_BLACKLIST :
2180+ FOR_JOB_SELECT (p , pp , select , what )
2181+ {
2182+ Solvable * s = pool -> solvables + p ;
2183+ if (s -> repo == installed )
2184+ continue ;
2185+ if (updatemap .size && s -> name > 0 && s -> name < pool -> ss .nstrings && MAPTST (& updatemap , s -> name ))
2186+ continue ; /* installed package with same name is already blacklisted */
2187+ solver_addrule (solv , - p , 0 , 0 );
2188+ }
2189+ break ;
2190+ }
2191+ }
2192+ map_free (& updatemap );
2193+ solv -> blackrules_end = solv -> nrules ;
2194+ }
21042195
21052196/***********************************************************************
21062197 ***
@@ -2114,6 +2205,7 @@ reenableduprule(Solver *solv, Id name)
21142205#define DISABLE_UPDATE 1
21152206#define DISABLE_INFARCH 2
21162207#define DISABLE_DUP 3
2208+ #define DISABLE_BLACK 4
21172209
21182210static void
21192211jobtodisablelist (Solver * solv , Id how , Id what , Queue * q )
@@ -2213,6 +2305,16 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
22132305 }
22142306 }
22152307 }
2308+ if ((set & SOLVER_SETEVR ) != 0 && solv -> blackrules != solv -> blackrules_end )
2309+ {
2310+ if (select == SOLVER_SOLVABLE )
2311+ queue_push2 (q , DISABLE_BLACK , what );
2312+ else
2313+ {
2314+ FOR_JOB_SELECT (p , pp , select , what )
2315+ queue_push2 (q , DISABLE_BLACK , p );
2316+ }
2317+ }
22162318 if (!installed || installed -> end == installed -> start )
22172319 return ;
22182320 /* now the hard part: disable some update rules */
@@ -2386,6 +2488,9 @@ solver_disablepolicyrules(Solver *solv)
23862488 case DISABLE_DUP :
23872489 disableduprule (solv , arg );
23882490 break ;
2491+ case DISABLE_BLACK :
2492+ disableblackrule (solv , arg );
2493+ break ;
23892494 default :
23902495 break ;
23912496 }
@@ -2489,6 +2594,9 @@ solver_reenablepolicyrules(Solver *solv, int jobidx)
24892594 case DISABLE_DUP :
24902595 reenableduprule (solv , arg );
24912596 break ;
2597+ case DISABLE_BLACK :
2598+ reenableblackrule (solv , arg );
2599+ break ;
24922600 }
24932601 }
24942602 queue_free (& q );
@@ -2815,6 +2923,12 @@ solver_ruleinfo(Solver *solv, Id rid, Id *fromp, Id *top, Id *depp)
28152923 * depp = solv -> yumobsrules_info [rid - solv -> yumobsrules ];
28162924 return SOLVER_RULE_YUMOBS ;
28172925 }
2926+ if (rid >= solv -> blackrules && rid < solv -> blackrules_end )
2927+ {
2928+ if (fromp )
2929+ * fromp = - r -> p ;
2930+ return SOLVER_RULE_BLACK ;
2931+ }
28182932 if (rid >= solv -> choicerules && rid < solv -> choicerules_end )
28192933 return SOLVER_RULE_CHOICE ;
28202934 if (rid >= solv -> recommendsrules && rid < solv -> recommendsrules_end )
@@ -2845,10 +2959,14 @@ solver_ruleclass(Solver *solv, Id rid)
28452959 return SOLVER_RULE_BEST ;
28462960 if (rid >= solv -> yumobsrules && rid < solv -> yumobsrules_end )
28472961 return SOLVER_RULE_YUMOBS ;
2962+ if (rid >= solv -> blackrules && rid < solv -> blackrules_end )
2963+ return SOLVER_RULE_BLACK ;
28482964 if (rid >= solv -> choicerules && rid < solv -> choicerules_end )
28492965 return SOLVER_RULE_CHOICE ;
28502966 if (rid >= solv -> recommendsrules && rid < solv -> recommendsrules_end )
28512967 return SOLVER_RULE_RECOMMENDS ;
2968+ if (rid >= solv -> blackrules && rid < solv -> blackrules_end )
2969+ return SOLVER_RULE_BLACK ;
28522970 if (rid >= solv -> learntrules && rid < solv -> nrules )
28532971 return SOLVER_RULE_LEARNT ;
28542972 return SOLVER_RULE_UNKNOWN ;
0 commit comments