@@ -1068,10 +1068,10 @@ solver_take_solution(Solver *solv, Id problem, Id solution, Queue *job)
10681068 */
10691069
10701070static void
1071- findproblemrule_internal (Solver * solv , Id idx , Id * reqrp , Id * conrp , Id * sysrp , Id * jobrp , Id * blkrp , Map * rseen )
1071+ findproblemrule_internal (Solver * solv , Id idx , Id * reqrp , Id * conrp , Id * sysrp , Id * jobrp , Id * blkrp , Id * scprp , Map * rseen )
10721072{
10731073 Id rid , d ;
1074- Id lreqr , lconr , lsysr , ljobr , lblkr ;
1074+ Id lreqr , lconr , lsysr , ljobr , lblkr , lscpr ;
10751075 Rule * r ;
10761076 Id jobassert = 0 ;
10771077 int i , reqset = 0 ; /* 0: unset, 1: installed, 2: jobassert, 3: assert */
@@ -1093,7 +1093,7 @@ findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp,
10931093
10941094 /* the problem rules are somewhat ordered from "near to the problem" to
10951095 * "near to the job" */
1096- lreqr = lconr = lsysr = ljobr = lblkr = 0 ;
1096+ lreqr = lconr = lsysr = ljobr = lblkr = lscpr = 0 ;
10971097 while ((rid = solv -> learnt_pool .elements [idx ++ ]) != 0 )
10981098 {
10991099 assert (rid > 0 );
@@ -1102,7 +1102,7 @@ findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp,
11021102 if (MAPTST (rseen , rid - solv -> learntrules ))
11031103 continue ;
11041104 MAPSET (rseen , rid - solv -> learntrules );
1105- findproblemrule_internal (solv , solv -> learnt_why .elements [rid - solv -> learntrules ], & lreqr , & lconr , & lsysr , & ljobr , & lblkr , rseen );
1105+ findproblemrule_internal (solv , solv -> learnt_why .elements [rid - solv -> learntrules ], & lreqr , & lconr , & lsysr , & ljobr , & lblkr , & lscpr , rseen );
11061106 }
11071107 else if ((rid >= solv -> jobrules && rid < solv -> jobrules_end ) || (rid >= solv -> infarchrules && rid < solv -> infarchrules_end ) || (rid >= solv -> duprules && rid < solv -> duprules_end ) || (rid >= solv -> bestrules && rid < solv -> bestrules_end ) || (rid >= solv -> yumobsrules && rid < solv -> yumobsrules_end ))
11081108 {
@@ -1119,6 +1119,11 @@ findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp,
11191119 if (!* blkrp )
11201120 * blkrp = rid ;
11211121 }
1122+ else if (rid >= solv -> strictrepopriorules && rid < solv -> strictrepopriorules_end )
1123+ {
1124+ if (!* scprp )
1125+ * scprp = rid ;
1126+ }
11221127 else
11231128 {
11241129 assert (rid < solv -> pkgrules_end );
@@ -1183,6 +1188,8 @@ findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp,
11831188 * sysrp = lsysr ;
11841189 if (!* blkrp && lblkr )
11851190 * blkrp = lblkr ;
1191+ if (!* scprp && lscpr )
1192+ * scprp = lscpr ;
11861193}
11871194
11881195/*
@@ -1197,12 +1204,12 @@ findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp,
11971204Id
11981205solver_findproblemrule (Solver * solv , Id problem )
11991206{
1200- Id reqr , conr , sysr , jobr , blkr ;
1207+ Id reqr , conr , sysr , jobr , blkr , srpr ;
12011208 Id idx = solv -> problems .elements [2 * problem - 2 ];
12021209 Map rseen ;
1203- reqr = conr = sysr = jobr = blkr = 0 ;
1210+ reqr = conr = sysr = jobr = blkr = srpr = 0 ;
12041211 map_init (& rseen , solv -> learntrules ? solv -> nrules - solv -> learntrules : 0 );
1205- findproblemrule_internal (solv , idx , & reqr , & conr , & sysr , & jobr , & blkr , & rseen );
1212+ findproblemrule_internal (solv , idx , & reqr , & conr , & sysr , & jobr , & blkr , & srpr , & rseen );
12061213 map_free (& rseen );
12071214 /* check if the request is about a not-installed package requiring a installed
12081215 * package conflicting with the non-installed package. In that case return the conflict */
@@ -1232,6 +1239,8 @@ solver_findproblemrule(Solver *solv, Id problem)
12321239 return conr ; /* some conflict */
12331240 if (blkr )
12341241 return blkr ; /* a blacklisted package */
1242+ if (srpr )
1243+ return srpr ; /* a strict repo priority */
12351244 if (sysr )
12361245 return sysr ; /* an update rule */
12371246 if (jobr )
@@ -1350,6 +1359,8 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ
13501359 return pool_tmpappend (pool , s , pool_dep2str (pool , dep ), 0 );
13511360 case SOLVER_RULE_BLACK :
13521361 return pool_tmpjoin (pool , "package " , pool_solvid2str (pool , source ), " can only be installed by a direct request" );
1362+ case SOLVER_RULE_STRICT_REPO_PRIORITY :
1363+ return pool_tmpjoin (pool , "package '" , pool_solvid2str (pool , source ), "' is excluded by strict repo priority" );
13531364 case SOLVER_RULE_PKG_CONSTRAINS :
13541365 s = pool_tmpjoin (pool , "package " , pool_solvid2str (pool , source ), 0 );
13551366 s = pool_tmpappend (pool , s , " has constraint " , pool_dep2str (pool , dep ));
0 commit comments