Hi Zac, alternatively could --exclude be extended to support sets? So users could --exclude @world or @profile.
Cheers, Manuel On 22.03.2018 00:03, Zac Medico wrote: > Ignore the @world package set and its dependencies. This may be useful > if there is a desire to perform an action even though it might break > the dependencies of some installed packages (it might also remove > installed packages in order to solve blockers). This also alters the > behavior of --complete-graph options so that only deep dependencies > of packages given as arguments are included in the dependency graph. > This option may be useful as an alternative to --nodeps in cases where > it is desirable to account for dependencies of packages given as > arguments. > > Bug: https://bugs.gentoo.org/608564 > --- > man/emerge.1 | 17 +++++++++++++++++ > pym/_emerge/create_depgraph_params.py | 4 ++++ > pym/_emerge/depgraph.py | 8 ++++++-- > pym/_emerge/main.py | 9 +++++++++ > pym/portage/tests/resolver/test_complete_graph.py | 18 ++++++++++++++++++ > 5 files changed, 54 insertions(+), 2 deletions(-) > > diff --git a/man/emerge.1 b/man/emerge.1 > index a17b65ed2..01ce62e51 100644 > --- a/man/emerge.1 > +++ b/man/emerge.1 > @@ -630,6 +630,23 @@ Therefore, \fB\-\-usepkgonly\fR (or > \fB\-\-getbinpkgonly\fR) must be > used in order to enable soname depedency resolution when installing > packages. > .TP > +.BR "\-\-ignore\-world [ y | n ]" > +Ignore the @world package set and its dependencies. This may be useful > +if there is a desire to perform an action even though it might break > +the dependencies of some installed packages (it might also remove > +installed packages in order to solve blockers). This also alters the > +behavior of \fB\-\-complete\-graph\fR options so that only deep > +dependencies of packages given as arguments are included in the > +dependency graph. This option may be useful as an alternative to > +\fB\-\-nodeps\fR in cases where it is desirable to account for > +dependencies of packages given as arguments. > + > +\fBWARNING:\fR > +This option is intended to be used only with great caution, since it is > +possible for it to make nonsensical changes which may lead to system > +breakage. Therefore, it is advisable to use \fB\-\-ask\fR together with > +this option. > +.TP > .BR \-j\ [JOBS] ", " \-\-jobs[=JOBS] > Specifies the number of packages to build simultaneously. If this option is > given without an argument, emerge will not limit the number of jobs that can > diff --git a/pym/_emerge/create_depgraph_params.py > b/pym/_emerge/create_depgraph_params.py > index fc7fa60d7..0405011fd 100644 > --- a/pym/_emerge/create_depgraph_params.py > +++ b/pym/_emerge/create_depgraph_params.py > @@ -26,6 +26,7 @@ def create_depgraph_params(myopts, myaction): > # ignore_soname_deps: ignore the soname dependencies of built > # packages, so that they do not trigger dependency resolution > # failures, or cause packages to be rebuilt or replaced. > + # ignore_world: ignore the @world package set and its dependencies > # with_test_deps: pull in test deps for packages matched by arguments > # changed_deps: rebuild installed packages with outdated deps > # changed_deps_report: report installed packages with outdated deps > @@ -56,6 +57,9 @@ def create_depgraph_params(myopts, myaction): > myparams["selective"] = True > return myparams > > + if myopts.get('--ignore-world') is True: > + myparams['ignore_world'] = True > + > rebuild_if_new_slot = myopts.get('--rebuild-if-new-slot') > if rebuild_if_new_slot is not None: > myparams['rebuild_if_new_slot'] = rebuild_if_new_slot > diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py > index 6c728684f..f7ea27c37 100644 > --- a/pym/_emerge/depgraph.py > +++ b/pym/_emerge/depgraph.py > @@ -163,7 +163,10 @@ class _frozen_depgraph_config(object): > self.trees[myroot]["bintree"] = DummyTree( > > DbapiProvidesIndex(trees[myroot]["bintree"].dbapi)) > > - self._required_set_names = set(["world"]) > + if params.get("ignore_world", False): > + self._required_set_names = set() > + else: > + self._required_set_names = set(["world"]) > > atoms = ' '.join(myopts.get("--exclude", [])).split() > self.excluded_pkgs = _wildcard_set(atoms) > @@ -7554,6 +7557,7 @@ class depgraph(object): > ignored_uninstall_tasks = set() > have_uninstall_task = False > complete = "complete" in self._dynamic_config.myparams > + ignore_world = > self._dynamic_config.myparams.get("ignore_world", False) > asap_nodes = [] > > def get_nodes(**kwargs): > @@ -7971,7 +7975,7 @@ class depgraph(object): > # detected as early as possible, which > makes it possible > # to avoid calling > self._complete_graph() when it is > # unnecessary due to blockers > triggering an abortion. > - if not complete: > + if not (complete or ignore_world): > # For packages in the world > set, go ahead an uninstall > # when necessary, as long as > the atom will be satisfied > # in the final state. > diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py > index fbc2ce01c..5b48d32a4 100644 > --- a/pym/_emerge/main.py > +++ b/pym/_emerge/main.py > @@ -146,6 +146,7 @@ def insert_optional_args(args): > '--fuzzy-search' : y_or_n, > '--getbinpkg' : y_or_n, > '--getbinpkgonly' : y_or_n, > + '--ignore-world' : y_or_n, > '--jobs' : valid_integers, > '--keep-going' : y_or_n, > '--load-average' : valid_floats, > @@ -503,6 +504,11 @@ def parse_opts(tmpcmdline, silent=False): > "choices": y_or_n > }, > > + "--ignore-world": { > + "help" : "ignore the @world package set and its > dependencies", > + "choices" : true_y_or_n > + }, > + > "--jobs": { > > "shortopt" : "-j", > @@ -919,6 +925,9 @@ def parse_opts(tmpcmdline, silent=False): > else: > myoptions.getbinpkgonly = None > > + if myoptions.ignore_world in true_y: > + myoptions.ignore_world = True > + > if myoptions.keep_going in true_y: > myoptions.keep_going = True > else: > diff --git a/pym/portage/tests/resolver/test_complete_graph.py > b/pym/portage/tests/resolver/test_complete_graph.py > index 95b1f8809..d02e57582 100644 > --- a/pym/portage/tests/resolver/test_complete_graph.py > +++ b/pym/portage/tests/resolver/test_complete_graph.py > @@ -59,6 +59,12 @@ class CompleteGraphTestCase(TestCase): > success = True, > ), > > + ResolverPlaygroundTestCase( > + ["dev-libs/libxml2"], > + options = {"--ignore-world" : True}, > + mergelist = ["dev-libs/libxml2-2.8.0"], > + success = True, > + ), > ) > > playground = ResolverPlayground(ebuilds=ebuilds, > @@ -99,6 +105,12 @@ class CompleteGraphTestCase(TestCase): > ), > ResolverPlaygroundTestCase( > [">=sys-libs/x-2"], > + options = {"--ignore-world" : True}, > + mergelist = ["sys-libs/x-2"], > + success = True, > + ), > + ResolverPlaygroundTestCase( > + [">=sys-libs/x-2"], > options = {"--complete-graph-if-new-ver" : "y"}, > mergelist = ["sys-libs/x-2"], > slot_collision_solutions = [], > @@ -112,6 +124,12 @@ class CompleteGraphTestCase(TestCase): > ), > ResolverPlaygroundTestCase( > ["<sys-libs/x-1"], > + options = {"--ignore-world" : True}, > + mergelist = ["sys-libs/x-0.1"], > + success = True, > + ), > + ResolverPlaygroundTestCase( > + ["<sys-libs/x-1"], > options = {"--complete-graph-if-new-ver" : "y"}, > mergelist = ["sys-libs/x-0.1"], > slot_collision_solutions = [], >
signature.asc
Description: OpenPGP digital signature