Skip to content

Commit aa7dcd9

Browse files
authored
Merge pull request #459 from adriendelsalle/strict-prio
Implement strict repo priority
2 parents e3d8843 + a371cee commit aa7dcd9

6 files changed

Lines changed: 106 additions & 11 deletions

File tree

src/problems.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,10 +1068,10 @@ solver_take_solution(Solver *solv, Id problem, Id solution, Queue *job)
10681068
*/
10691069

10701070
static 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,
11971204
Id
11981205
solver_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));

src/rules.c

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2992,6 +2992,12 @@ solver_ruleinfo(Solver *solv, Id rid, Id *fromp, Id *top, Id *depp)
29922992
*fromp = -r->p;
29932993
return SOLVER_RULE_BLACK;
29942994
}
2995+
if (rid >= solv->strictrepopriorules && rid < solv->strictrepopriorules_end)
2996+
{
2997+
if (fromp)
2998+
*fromp = -r->p;
2999+
return SOLVER_RULE_STRICT_REPO_PRIORITY;
3000+
}
29953001
if (rid >= solv->choicerules && rid < solv->choicerules_end)
29963002
return SOLVER_RULE_CHOICE;
29973003
if (rid >= solv->recommendsrules && rid < solv->recommendsrules_end)
@@ -3028,8 +3034,8 @@ solver_ruleclass(Solver *solv, Id rid)
30283034
return SOLVER_RULE_CHOICE;
30293035
if (rid >= solv->recommendsrules && rid < solv->recommendsrules_end)
30303036
return SOLVER_RULE_RECOMMENDS;
3031-
if (rid >= solv->blackrules && rid < solv->blackrules_end)
3032-
return SOLVER_RULE_BLACK;
3037+
if (rid >= solv->strictrepopriorules && rid < solv->strictrepopriorules_end)
3038+
return SOLVER_RULE_STRICT_REPO_PRIORITY;
30333039
if (rid >= solv->learntrules && rid < solv->nrules)
30343040
return SOLVER_RULE_LEARNT;
30353041
return SOLVER_RULE_UNKNOWN;
@@ -4135,6 +4141,51 @@ solver_addrecommendsrules(Solver *solv)
41354141
solv->recommendsrules_end = solv->nrules;
41364142
}
41374143

4144+
/* add rules to exclude solvables provided by lower
4145+
* precedence repositories */
4146+
void solver_addstrictrepopriorules(struct s_Solver *solv, Map *addedmap)
4147+
{
4148+
Pool *pool = solv->pool;
4149+
Solvable *s;
4150+
Id p, p2, pp2;
4151+
Map priomap;
4152+
int max_prio;
4153+
4154+
map_init_clone(&priomap, addedmap);
4155+
solv->strictrepopriorules = solv->nrules;
4156+
4157+
FOR_POOL_SOLVABLES(p)
4158+
{
4159+
if (!MAPTST(&priomap, p))
4160+
continue;
4161+
4162+
s = pool->solvables + p;
4163+
max_prio = s->repo->priority;
4164+
FOR_PROVIDES(p2, pp2, s->name)
4165+
{
4166+
Solvable *s2 = pool->solvables + p2;
4167+
if (s->name != s2->name)
4168+
continue;
4169+
if (s2->repo->priority > max_prio)
4170+
max_prio = s2->repo->priority;
4171+
}
4172+
4173+
FOR_PROVIDES(p2, pp2, s->name)
4174+
{
4175+
Solvable *s2 = pool->solvables + p2;
4176+
if (s->name != s2->name || !MAPTST(&priomap, p2))
4177+
continue;
4178+
MAPCLR(&priomap, p2);
4179+
if (pool->installed && s2->repo == pool->installed)
4180+
continue;
4181+
if (s2->repo->priority < max_prio)
4182+
solver_addrule(solv, -p2, 0, 0);
4183+
}
4184+
}
4185+
solv->strictrepopriorules_end = solv->nrules;
4186+
map_free(&priomap);
4187+
}
4188+
41384189
void
41394190
solver_breakorphans(Solver *solv)
41404191
{

src/rules.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ typedef enum {
7474
SOLVER_RULE_BEST = 0x900,
7575
SOLVER_RULE_YUMOBS = 0xa00,
7676
SOLVER_RULE_RECOMMENDS = 0xb00,
77-
SOLVER_RULE_BLACK = 0xc00
77+
SOLVER_RULE_BLACK = 0xc00,
78+
SOLVER_RULE_STRICT_REPO_PRIORITY = 0xd00
7879
} SolverRuleinfo;
7980

8081
#define SOLVER_RULE_TYPEMASK 0xff00
@@ -142,6 +143,9 @@ extern void solver_addblackrules(struct s_Solver *solv);
142143
/* recommends rules */
143144
extern void solver_addrecommendsrules(struct s_Solver *solv);
144145

146+
/* channel priority rules */
147+
extern void solver_addstrictrepopriorules(struct s_Solver *solv, Map *addedmap);
148+
145149
/* policy rule disabling/reenabling */
146150
extern void solver_disablepolicyrules(struct s_Solver *solv);
147151
extern void solver_reenablepolicyrules(struct s_Solver *solv, int jobidx);

src/solver.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1475,6 +1475,8 @@ solver_get_flag(Solver *solv, int flag)
14751475
return solv->install_also_updates;
14761476
case SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED:
14771477
return solv->only_namespace_recommended;
1478+
case SOLVER_FLAG_STRICT_REPO_PRIORITY:
1479+
return solv->strict_repo_priority;
14781480
default:
14791481
break;
14801482
}
@@ -1568,6 +1570,9 @@ solver_set_flag(Solver *solv, int flag, int value)
15681570
case SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED:
15691571
solv->only_namespace_recommended = value;
15701572
break;
1573+
case SOLVER_FLAG_STRICT_REPO_PRIORITY:
1574+
solv->strict_repo_priority = value;
1575+
break;
15711576
default:
15721577
break;
15731578
}
@@ -4124,6 +4129,11 @@ solver_solve(Solver *solv, Queue *job)
41244129
else
41254130
solv->recommendsrules = solv->recommendsrules_end = solv->nrules;
41264131

4132+
if (solv->strict_repo_priority)
4133+
solver_addstrictrepopriorules(solv, &addedmap);
4134+
else
4135+
solv->strictrepopriorules = solv->strictrepopriorules_end = solv->nrules;
4136+
41274137
if (1)
41284138
solver_addchoicerules(solv);
41294139
else
@@ -4139,7 +4149,19 @@ solver_solve(Solver *solv, Queue *job)
41394149
map_free(&installcandidatemap);
41404150
queue_free(&q);
41414151

4142-
POOL_DEBUG(SOLV_DEBUG_STATS, "%d pkg rules, 2 * %d update rules, %d job rules, %d infarch rules, %d dup rules, %d choice rules, %d best rules, %d yumobs rules\n", solv->pkgrules_end - 1, solv->updaterules_end - solv->updaterules, solv->jobrules_end - solv->jobrules, solv->infarchrules_end - solv->infarchrules, solv->duprules_end - solv->duprules, solv->choicerules_end - solv->choicerules, solv->bestrules_end - solv->bestrules, solv->yumobsrules_end - solv->yumobsrules);
4152+
POOL_DEBUG(SOLV_DEBUG_STATS, "%d pkg rules, 2 * %d update rules, %d job rules, %d infarch rules, %d dup rules, %d choice rules, %d best rules, %d yumobs rules\n"
4153+
"%d black rules, %d recommends rules, %d repo priority rules\n",
4154+
solv->pkgrules_end - 1,
4155+
solv->updaterules_end - solv->updaterules,
4156+
solv->jobrules_end - solv->jobrules,
4157+
solv->infarchrules_end - solv->infarchrules,
4158+
solv->duprules_end - solv->duprules,
4159+
solv->choicerules_end - solv->choicerules,
4160+
solv->bestrules_end - solv->bestrules,
4161+
solv->yumobsrules_end - solv->yumobsrules,
4162+
solv->blackrules_end - solv->blackrules,
4163+
solv->recommendsrules_end - solv->recommendsrules,
4164+
solv->strictrepopriorules_end - solv->strictrepopriorules);
41434165
POOL_DEBUG(SOLV_DEBUG_STATS, "overall rule memory used: %d K\n", solv->nrules * (int)sizeof(Rule) / 1024);
41444166

41454167
/* create weak map */

src/solver.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ struct s_Solver {
7979
Id blackrules; /* rules from blacklisted packages */
8080
Id blackrules_end;
8181

82+
Id strictrepopriorules; /* rules from strict priority repositories */
83+
Id strictrepopriorules_end;
84+
8285
Id choicerules; /* choice rules (always weak) */
8386
Id choicerules_end;
8487
Id *choicerules_info; /* the rule we used to generate the choice rule */
@@ -175,6 +178,7 @@ struct s_Solver {
175178
int strongrecommends; /* true: create weak rules for recommends */
176179
int install_also_updates; /* true: do not prune install job rules to installed packages */
177180
int only_namespace_recommended; /* true: only install packages recommended by namespace */
181+
int strict_repo_priority; /* true: only use packages from highest precedence/priority */
178182

179183
int process_orphans; /* true: do special orphan processing */
180184
Map dupmap; /* dup to those packages */
@@ -329,6 +333,7 @@ typedef struct s_Solver Solver;
329333
#define SOLVER_FLAG_STRONG_RECOMMENDS 25
330334
#define SOLVER_FLAG_INSTALL_ALSO_UPDATES 26
331335
#define SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED 27
336+
#define SOLVER_FLAG_STRICT_REPO_PRIORITY 28
332337

333338
#define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead of ids */
334339
#define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */

src/solverdebug.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ solver_printruleclass(Solver *solv, int type, Rule *r)
130130
POOL_DEBUG(type, "YUMOBS ");
131131
else if (p >= solv->blackrules && p < solv->blackrules_end)
132132
POOL_DEBUG(type, "BLACK ");
133+
else if (p >= solv->strictrepopriorules && p < solv->strictrepopriorules_end)
134+
POOL_DEBUG(type, "PRIOS ");
133135
else if (p >= solv->recommendsrules && p < solv->recommendsrules_end)
134136
POOL_DEBUG(type, "RECOMMENDS ");
135137
solver_printrule(solv, type, r);

0 commit comments

Comments
 (0)