map_free(&solv->droporphanedmap);
map_free(&solv->cleandepsmap);
map_free(&solv->allowuninstallmap);
+ map_free(&solv->excludefromweakmap);
+
solv_free(solv->favormap);
solv_free(solv->decisionmap);
queue_truncate(plist, j);
}
+static void
+prune_exclude_from_weak(Solver *solv, Queue *plist)
+{
+ int i, j;
+ for (i = j = 0; i < plist->count; i++)
+ {
+ Id p = plist->elements[i];
+ if (!MAPTST(&solv->excludefromweakmap, p))
+ plist->elements[j++] = p;
+ }
+ if (i != j)
+ queue_truncate(plist, j);
+}
+
static int
resolve_weak(Solver *solv, int level, int disablerules, Queue *dq, Queue *dqs, int *rerunp)
{
continue;
if (solv->havedisfavored && solv->favormap[i] < 0)
continue; /* disfavored supplements, do not install */
+ if (solv->excludefromweakmap.size && MAPTST(&solv->excludefromweakmap, i))
+ continue; /* excluded for weak deps, do not install */
queue_push(dqs, i);
}
}
if (dq->count && solv->havedisfavored)
prune_disfavored(solv, dq);
+ /* filter out weak_excluded recommended packages */
+ if (solv->excludefromweakmap.size)
+ prune_exclude_from_weak(solv, dq);
+
/* filter out all packages obsoleted by installed packages */
/* this is no longer needed if we have (and trust) reverse obsoletes */
if ((dqs->count || dq->count) && solv->installed)
}
#endif
+static void
+solver_add_exclude_from_weak(Solver *solv)
+{
+ Queue *job = &solv->job;
+ Pool *pool = solv->pool;
+ int i;
+ Id p, pp, how, what, select;
+for (i = 0; i < job->count; i += 2)
+ {
+ how = job->elements[i];
+ if ((how & SOLVER_JOBMASK) != SOLVER_EXCLUDEFROMWEAK)
+ continue;
+ if (!solv->excludefromweakmap.size)
+ map_grow(&solv->excludefromweakmap, pool->nsolvables);
+ what = job->elements[i + 1];
+ select = how & SOLVER_SELECTMASK;
+ if (select == SOLVER_SOLVABLE_REPO)
+ {
+ Repo *repo = pool_id2repo(pool, what);
+ if (repo)
+ {
+ Solvable *s;
+ FOR_REPO_SOLVABLES(repo, p, s)
+ MAPSET(&solv->excludefromweakmap, p);
+ }
+ }
+ FOR_JOB_SELECT(p, pp, select, what)
+ MAPSET(&solv->excludefromweakmap, p);
+ }
+}
+
static void
setup_favormap(Solver *solv)
{
int hasfavorjob = 0;
int haslockjob = 0;
int hasblacklistjob = 0;
+ int hasexcludefromweakjob = 0;
solve_start = solv_timems(0);
map_zerosize(&solv->droporphanedmap);
solv->allowuninstall_all = 0;
map_zerosize(&solv->allowuninstallmap);
+ map_zerosize(&solv->excludefromweakmap);
map_zerosize(&solv->cleandepsmap);
map_zerosize(&solv->weakrulemap);
solv->favormap = solv_free(solv->favormap);
POOL_DEBUG(SOLV_DEBUG_JOB, "job: blacklist %s\n", solver_select2str(pool, select, what));
hasblacklistjob = 1;
break;
+ case SOLVER_EXCLUDEFROMWEAK:
+ POOL_DEBUG(SOLV_DEBUG_JOB, "job: excludefromweak %s\n", solver_select2str(pool, select, what));
+ hasexcludefromweakjob = 1;
+ break;
default:
POOL_DEBUG(SOLV_DEBUG_JOB, "job: unknown job\n");
break;
else
solv->blackrules = solv->blackrules_end = solv->nrules;
+ if (hasexcludefromweakjob)
+ solver_add_exclude_from_weak(solv);
+
if (solv->havedisfavored && solv->strongrecommends && solv->recommendsruleq)
solver_addrecommendsrules(solv);
else
--- /dev/null
+repo @System 0 testtags <inline>
+#>=Pkg: pkg-A 1.0 1 noarch
+#>=Prv: pkg-A = 1.0-1
+#>=Rec: pkg-C
+#>=Pkg: pkg-B 1.0 1 noarch
+#>=Prv: pkg-B = 1.0-1
+
+repo available -99.-1000 testtags <inline>
+#>=Pkg: pkg-A 1.0 3 noarch
+#>=Prv: pkg-A = 1.0-3
+#>=Rec: pkg-B
+#>=Pkg: pkg-B 1.0 2 noarch
+#>=Prv: pkg-B = 1.0-2
+#>=Pkg: pkg-C 1.0 1 noarch
+#>=Prv: pkg-C = 1.0-1
+#>=Obs: pkg-B
+
+system x86_64 rpm @System
+poolflags implicitobsoleteusescolors
+solverflags allowvendorchange keepexplicitobsoletes bestobeypolicy keeporphans yumobsoletes
+
+job update all packages [forcebest]
+job excludefromweak name pkg-C
+result transaction,problems <inline>
+#>erase pkg-B-1.0-1.noarch@@System pkg-C-1.0-1.noarch@available
+#>install pkg-C-1.0-1.noarch@available
+#>upgrade pkg-A-1.0-1.noarch@@System pkg-A-1.0-3.noarch@available
+
+nextjob
+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]
+job excludefromweak name pkg-C
+result transaction,problems <inline>
+#>erase pkg-B-1.0-1.noarch@@System pkg-C-1.0-1.noarch@available
+#>install pkg-C-1.0-1.noarch@available
+#>upgrade pkg-A-1.0-1.noarch@@System pkg-A-1.0-3.noarch@available
--- /dev/null
+repo @System 0 testtags <inline>
+
+repo available -99.-1000 testtags <inline>
+#>=Pkg: pkg-A 1 1 noarch
+#>=Prv: pkg-A = 1-1
+#>=Rec: pkg-B
+#>=Pkg: pkg-B 1 1 noarch
+#>=Prv: pkg-B = 1-1
+
+system x86_64 rpm @System
+poolflags implicitobsoleteusescolors
+solverflags allowvendorchange keepexplicitobsoletes bestobeypolicy keeporphans yumobsoletes
+
+job install oneof pkg-A-1-1.noarch@available [forcebest,targeted,setevr,setarch]
+job excludefromweak name pkg-B
+result transaction,problems <inline>
+#>install pkg-A-1-1.noarch@available
+
+nextjob
+job install oneof pkg-A-1-1.noarch@available [forcebest,targeted,setevr,setarch]
+job excludefromweak name pkg-A
+job excludefromweak name pkg-B
+result transaction,problems <inline>
+#>install pkg-A-1-1.noarch@available