From 2fc37bdaa841723b121b658ac0151e6cbb88f404 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sat, 11 Jul 2009 13:02:15 +0000 Subject: [PATCH] Merged from trunk -r13804:13812 | 13805 | Bug #276957 - Fix dropped "in graph" choice for runtime deps | | zmedico | inside dep_zapdeps. | | 13806 | Fix --selective so it works. | | zmedico | | | 13807 | Document the --selective option. | | zmedico | | | 13808 | Add a --debug warning message inside _add_pkg in case a | | zmedico | potentially infinite backtracking loop is detected (it | | | should never happen). | | 13809 | Use a dict for depgraph params, so we can use it to store | | zmedico | key/value pairs and fix the depgraph so it doesn't use | | | emerge options directly. | | 13810 | Make -j argument handling more generic, so it's easy to add | | zmedico | similar arguments (planning to add support for integer | | | -D/--deep arguments). | | 13811 | Tweak arguments for ; we need to recursively check dependencies of pkgspec If we are in --nodeps (no recursion) mode, we obviously only check 1 level of dependencies. """ + if arg_atoms: + depth = 0 + pkg.depth = depth + deep = self._dynamic_config.myparams.get("deep", 0) + empty = "empty" in self._dynamic_config.myparams + recurse = empty or deep is True or depth + 1 <= deep dep_stack = self._dynamic_config._dep_stack if "recurse" not in self._dynamic_config.myparams: return 1 - elif pkg.installed and \ - "deep" not in self._dynamic_config.myparams: + elif pkg.installed and not recurse: dep_stack = self._dynamic_config._ignored_deps self._frozen_config.spinner.update() - if arg_atoms: - depth = 0 - pkg.depth = depth if not previously_added: dep_stack.append(pkg) return 1 @@ -2286,9 +2300,9 @@ class depgraph(object): # accounted for. self._select_atoms = self._select_atoms_from_graph self._select_package = self._select_pkg_from_graph - already_deep = "deep" in self._dynamic_config.myparams + already_deep = self._dynamic_config.myparams.get("deep") is True if not already_deep: - self._dynamic_config.myparams.add("deep") + self._dynamic_config.myparams["deep"] = True for root in self._frozen_config.roots: required_set_names = self._frozen_config._required_set_names.copy() @@ -3374,7 +3388,7 @@ class depgraph(object): if have_uninstall_task and \ not complete and \ not unsolvable_blockers: - self._dynamic_config.myparams.add("complete") + self._dynamic_config.myparams["complete"] = True raise self._serialize_tasks_retry("") if unsolvable_blockers and \ @@ -4513,7 +4527,7 @@ class depgraph(object): self._dynamic_config._scheduler_graph = self._dynamic_config.digraph else: self._select_package = self._select_pkg_from_graph - self._dynamic_config.myparams.add("selective") + self._dynamic_config.myparams["selective"] = True # Always traverse deep dependencies in order to account for # potentially unsatisfied dependencies of installed packages. # This is necessary for correct --keep-going or --resume operation @@ -4526,7 +4540,7 @@ class depgraph(object): # deep depenedencies of a scheduled build, that build needs to # be cancelled. In order for this type of situation to be # recognized, deep traversal of dependencies is required. - self._dynamic_config.myparams.add("deep") + self._dynamic_config.myparams["deep"] = True favorites = resume_data.get("favorites") args_set = self._dynamic_config._sets["args"] diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py index f78c2e0e0..393886698 100644 --- a/pym/_emerge/help.py +++ b/pym/_emerge/help.py @@ -220,8 +220,7 @@ def help(myopts, havecolor=1): print " "+green("--update")+" ("+green("-u")+" short option)" print " Updates packages to the best version available, which may not" print " always be the highest version number due to masking for testing" - print " and development. This will also update direct dependencies which" - print " may not be what you want. Package atoms specified on the command" + print " and development. Package atoms specified on the command" print " line are greedy, meaning that unspecific atoms may match multiple" print " installed versions of slotted packages." print @@ -314,7 +313,8 @@ def help(myopts, havecolor=1): print " --debug is great for finding bash syntax errors as providing" print " very verbose information about the dependency and build process." print - print " "+green("--deep")+" ("+green("-D")+" short option)" + print " "+green("--deep") + " " + turquoise("[DEPTH]") + \ + " (" + green("-D") + " short option)" print " This flag forces emerge to consider the entire dependency tree of" print " packages, instead of checking only the immediate dependencies of" print " the packages. As an example, this catches updates in libraries" @@ -467,6 +467,12 @@ def help(myopts, havecolor=1): for line in wrap(desc, desc_width): print desc_indent + line print + print " " + green("--selective") + desc = "This is similar to the --noreplace option, except that it " + \ + "does not take precedence over options such as --newuse." + for line in wrap(desc, desc_width): + print desc_indent + line + print print " "+green("--skipfirst") desc = "This option is only valid when " + \ "used with --resume. It removes the " + \ diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py index 1a4ee877d..8e0702c7d 100644 --- a/pym/_emerge/main.py +++ b/pym/_emerge/main.py @@ -62,7 +62,7 @@ options=[ "--buildpkg", "--buildpkgonly", "--changelog", "--columns", "--complete-graph", -"--debug", "--deep", +"--debug", "--digest", "--emptytree", "--fetchonly", "--fetch-all-uri", @@ -88,7 +88,7 @@ shortmapping={ "a":"--ask", "b":"--buildpkg", "B":"--buildpkgonly", "c":"--clean", "C":"--unmerge", -"d":"--debug", "D":"--deep", +"d":"--debug", "e":"--emptytree", "f":"--fetchonly", "F":"--fetch-all-uri", "g":"--getbinpkg", "G":"--getbinpkgonly", @@ -383,13 +383,31 @@ def insert_optional_args(args): this feature natively. """ + class valid_integers(object): + def __contains__(self, s): + try: + int(s) + except (ValueError, OverflowError): + return False + return True + + valid_integers = valid_integers() + new_args = [] - jobs_opts = ("-j", "--jobs") + default_arg_opts = { + '--deep' : valid_integers, '--deselect' : ('n',), '--binpkg-respect-use' : ('n', 'y',), + '--jobs' : valid_integers, '--root-deps' : ('rdeps',), } + + short_arg_opts = { + 'D' : valid_integers, + 'j' : valid_integers, + } + arg_stack = args[:] arg_stack.reverse() while arg_stack: @@ -405,42 +423,54 @@ def insert_optional_args(args): new_args.append('True') continue - short_job_opt = bool("j" in arg and arg[:1] == "-" and arg[:2] != "--") - if not (short_job_opt or arg in jobs_opts): + if arg[:1] != "-" or arg[:2] == "--": new_args.append(arg) continue + match = None + for k, arg_choices in short_arg_opts.iteritems(): + if k in arg: + match = k + break + + if match is None: + new_args.append(arg) + continue + + if len(arg) == 2: + new_args.append(arg) + if arg_stack and arg_stack[-1] in arg_choices: + new_args.append(arg_stack.pop()) + else: + # insert default argument + new_args.append('True') + continue + # Insert an empty placeholder in order to # satisfy the requirements of optparse. - new_args.append("--jobs") - job_count = None + new_args.append("-" + match) + opt_arg = None saved_opts = None - if short_job_opt and len(arg) > 2: - if arg[:2] == "-j": - try: - job_count = int(arg[2:]) - except ValueError: - saved_opts = arg[2:] - else: - job_count = "True" - saved_opts = arg[1:].replace("j", "") - if job_count is None and arg_stack: - try: - job_count = int(arg_stack[-1]) - except ValueError: - pass + if arg[1:2] == match: + if arg[2:] in arg_choices: + opt_arg = arg[2:] else: - # Discard the job count from the stack - # since we're consuming it here. - arg_stack.pop() + saved_opts = arg[2:] + opt_arg = "True" + else: + saved_opts = arg[1:].replace(match, "") + opt_arg = "True" - if job_count is None: - # unlimited number of jobs + if opt_arg is None and arg_stack and \ + arg_stack[-1] in arg_choices: + opt_arg = arg_stack.pop() + + if opt_arg is None: new_args.append("True") else: - new_args.append(str(job_count)) + new_args.append(opt_arg) if saved_opts is not None: new_args.append("-" + saved_opts) @@ -473,6 +503,18 @@ def parse_opts(tmpcmdline, silent=False): "choices":("y", "n") }, + "--deep": { + + "shortopt" : "-D", + + "help" : "Specifies how deep to recurse into dependencies " + \ + "of packages given as arguments. If no argument is given, " + \ + "depth is unlimited. Default behavior is to skip " + \ + "dependencies of installed packages.", + + "action" : "store" + }, + "--deselect": { "help" : "remove atoms from the world file", "type" : "choice", @@ -481,6 +523,8 @@ def parse_opts(tmpcmdline, silent=False): "--jobs": { + "shortopt" : "-j", + "help" : "Specifies the number of packages to build " + \ "simultaneously.", @@ -545,8 +589,12 @@ def parse_opts(tmpcmdline, silent=False): dest=myopt.lstrip("--").replace("-", "_"), default=False) for myopt, kwargs in argument_options.iteritems(): - parser.add_option(myopt, - dest=myopt.lstrip("--").replace("-", "_"), **kwargs) + shortopt = kwargs.pop("shortopt", None) + args = [myopt] + if shortopt is not None: + args.append(shortopt) + parser.add_option(dest=myopt.lstrip("--").replace("-", "_"), + *args, **kwargs) tmpcmdline = insert_optional_args(tmpcmdline) @@ -563,6 +611,24 @@ def parse_opts(tmpcmdline, silent=False): if myoptions.root_deps == "True": myoptions.root_deps = True + if myoptions.deep is not None: + deep = None + if myoptions.deep == "True": + deep = True + else: + try: + deep = int(myoptions.deep) + except (OverflowError, ValueError): + deep = -1 + + if deep is not True and deep < 0: + deep = None + if not silent: + writemsg("!!! Invalid --deep parameter: '%s'\n" % \ + (myoptions.deep,), noiselevel=-1) + + myoptions.deep = deep + if myoptions.jobs: jobs = None if myoptions.jobs == "True": diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 85c5312e0..1c0a706f1 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -7229,6 +7229,8 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None): preferred_in_graph.append(this_choice) else: other.append(this_choice) + else: + preferred_in_graph.append(this_choice) else: preferred_non_installed.append(this_choice) else: -- 2.26.2