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 = [],
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to