Skip to content

Commit 02344d1

Browse files
authored
Merge pull request #454 from j-mracek/weak-excludes
Add mechanisms to ignore pkgs for weak dependencies
2 parents 3d88b0c + 5cf206a commit 02344d1

7 files changed

Lines changed: 130 additions & 0 deletions

File tree

bindings/solv.i

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,7 @@ typedef struct {
12831283
static const Id SOLVER_ALLOWUNINSTALL = SOLVER_ALLOWUNINSTALL;
12841284
static const Id SOLVER_FAVOR = SOLVER_FAVOR;
12851285
static const Id SOLVER_DISFAVOR = SOLVER_DISFAVOR;
1286+
static const Id SOLVER_EXCLUDEFROMWEAK = SOLVER_EXCLUDEFROMWEAK;
12861287
static const Id SOLVER_JOBMASK = SOLVER_JOBMASK;
12871288
static const Id SOLVER_WEAK = SOLVER_WEAK;
12881289
static const Id SOLVER_ESSENTIAL = SOLVER_ESSENTIAL;

doc/libsolv-bindings.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,10 @@ Avoid the specified packages if the solver encounters an alternative. This
20762076
can also be used to block recommended or supplemented packages from being
20772077
installed.
20782078

2079+
*SOLVER_EXCLUDEFROMWEAK*::
2080+
Avoid the specified packages to satisfy recommended or supplemented dependencies.
2081+
Unlike SOLVER_DISFAVOR, it does not interfere with other rules.
2082+
20792083
*SOLVER_JOBMASK*::
20802084
A mask containing all the above action bits.
20812085

ext/testcase.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ static struct job2str {
6060
{ SOLVER_FAVOR, "favor" },
6161
{ SOLVER_DISFAVOR, "disfavor" },
6262
{ SOLVER_BLACKLIST, "blacklist" },
63+
{ SOLVER_EXCLUDEFROMWEAK, "excludefromweak" },
6364
{ 0, 0 }
6465
};
6566

src/solver.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
22052221
static int
22062222
resolve_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+
33223375
static void
33233376
setup_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

src/solver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ struct s_Solver {
208208
Map allowuninstallmap; /* ok to uninstall those */
209209
int allowuninstall_all;
210210

211+
Map excludefromweakmap; /* remove them from candidates for supplements and recommends */
212+
211213
Id *favormap; /* favor job index, > 0: favored, < 0: disfavored */
212214
int havedisfavored; /* do we have disfavored packages? */
213215

@@ -248,6 +250,7 @@ typedef struct s_Solver Solver;
248250
#define SOLVER_FAVOR 0x0c00
249251
#define SOLVER_DISFAVOR 0x0d00
250252
#define SOLVER_BLACKLIST 0x0e00
253+
#define SOLVER_EXCLUDEFROMWEAK 0x1000
251254

252255
#define SOLVER_JOBMASK 0xff00
253256

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
repo @System 0 testtags <inline>
2+
#>=Pkg: pkg-A 1.0 1 noarch
3+
#>=Prv: pkg-A = 1.0-1
4+
#>=Rec: pkg-C
5+
#>=Pkg: pkg-B 1.0 1 noarch
6+
#>=Prv: pkg-B = 1.0-1
7+
8+
repo available -99.-1000 testtags <inline>
9+
#>=Pkg: pkg-A 1.0 3 noarch
10+
#>=Prv: pkg-A = 1.0-3
11+
#>=Rec: pkg-B
12+
#>=Pkg: pkg-B 1.0 2 noarch
13+
#>=Prv: pkg-B = 1.0-2
14+
#>=Pkg: pkg-C 1.0 1 noarch
15+
#>=Prv: pkg-C = 1.0-1
16+
#>=Obs: pkg-B
17+
18+
system x86_64 rpm @System
19+
poolflags implicitobsoleteusescolors
20+
solverflags allowvendorchange keepexplicitobsoletes bestobeypolicy keeporphans yumobsoletes
21+
22+
job update all packages [forcebest]
23+
job excludefromweak name pkg-C
24+
result transaction,problems <inline>
25+
#>erase pkg-B-1.0-1.noarch@@System pkg-C-1.0-1.noarch@available
26+
#>install pkg-C-1.0-1.noarch@available
27+
#>upgrade pkg-A-1.0-1.noarch@@System pkg-A-1.0-3.noarch@available
28+
29+
nextjob
30+
job update oneof pkg-A-1.0-1.noarch@@System pkg-B-1.0-1.noarch@@System pkg-A-1.0-3.noarch@available pkg-B-1.0-2.noarch@available pkg-C-1.0-1.noarch@available [forcebest,targeted,setevr,setarch]
31+
job excludefromweak name pkg-C
32+
result transaction,problems <inline>
33+
#>erase pkg-B-1.0-1.noarch@@System pkg-C-1.0-1.noarch@available
34+
#>install pkg-C-1.0-1.noarch@available
35+
#>upgrade pkg-A-1.0-1.noarch@@System pkg-A-1.0-3.noarch@available
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
repo @System 0 testtags <inline>
2+
3+
repo available -99.-1000 testtags <inline>
4+
#>=Pkg: pkg-A 1 1 noarch
5+
#>=Prv: pkg-A = 1-1
6+
#>=Rec: pkg-B
7+
#>=Pkg: pkg-B 1 1 noarch
8+
#>=Prv: pkg-B = 1-1
9+
10+
system x86_64 rpm @System
11+
poolflags implicitobsoleteusescolors
12+
solverflags allowvendorchange keepexplicitobsoletes bestobeypolicy keeporphans yumobsoletes
13+
14+
job install oneof pkg-A-1-1.noarch@available [forcebest,targeted,setevr,setarch]
15+
job excludefromweak name pkg-B
16+
result transaction,problems <inline>
17+
#>install pkg-A-1-1.noarch@available
18+
19+
nextjob
20+
job install oneof pkg-A-1-1.noarch@available [forcebest,targeted,setevr,setarch]
21+
job excludefromweak name pkg-A
22+
job excludefromweak name pkg-B
23+
result transaction,problems <inline>
24+
#>install pkg-A-1-1.noarch@available

0 commit comments

Comments
 (0)