From cccca42d0470d9a2a972e8130418d82e97aa89b9 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sat, 24 Oct 2009 06:55:34 +0000 Subject: Bug #134466 - Add a --ask-enter-invalid option. When used together with the --ask option, interpret a single "Enter" key press as invalid input. This helps prevent accidental acceptance of the first choice. svn path=/main/trunk/; revision=14710 --- pym/_emerge/actions.py | 16 +++++++++++----- pym/_emerge/help.py | 33 +++++++++++++++++++++++---------- pym/_emerge/main.py | 1 + pym/_emerge/unmerge.py | 4 +++- pym/_emerge/userquery.py | 17 ++++++++++------- 5 files changed, 48 insertions(+), 23 deletions(-) (limited to 'pym/_emerge') diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 916d6a8ba..bd668985f 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -134,6 +134,7 @@ def action_build(settings, trees, mtimedb, pretend = "--pretend" in myopts fetchonly = "--fetchonly" in myopts or "--fetch-all-uri" in myopts ask = "--ask" in myopts + enter_invalid = '--ask-enter-invalid' in myopts nodeps = "--nodeps" in myopts oneshot = "--oneshot" in myopts or "--onlydeps" in myopts tree = "--tree" in myopts @@ -340,7 +341,7 @@ def action_build(settings, trees, mtimedb, else: prompt="Would you like to merge these packages?" print() - if "--ask" in myopts and userquery(prompt) == "No": + if "--ask" in myopts and userquery(prompt, enter_invalid) == "No": print() print("Quitting.") print() @@ -441,6 +442,7 @@ def action_build(settings, trees, mtimedb, return retval def action_config(settings, trees, myopts, myfiles): + enter_invalid = '--ask-enter-invalid' in myopts if len(myfiles) != 1: print(red("!!! config can only take a single package atom at this time\n")) sys.exit(1) @@ -470,7 +472,7 @@ def action_config(settings, trees, myopts, myfiles): print(options[-1]+") "+pkg) print("X) Cancel") options.append("X") - idx = userquery("Selection?", options) + idx = userquery("Selection?", enter_invalid, responses=options) if idx == "X": sys.exit(0) pkg = pkgs[int(idx)-1] @@ -485,7 +487,7 @@ def action_config(settings, trees, myopts, myfiles): print() if "--ask" in myopts: - if userquery("Ready to configure "+pkg+"?") == "No": + if userquery("Ready to configure %s?" % pkg, enter_invalid) == "No": sys.exit(0) else: print("Configuring pkg...") @@ -1142,6 +1144,7 @@ def calc_depclean(settings, trees, ldpath_mtimes, return 0, [], False, required_pkgs_total def action_deselect(settings, trees, opts, atoms): + enter_invalid = '--ask-enter-invalid' in opts root_config = trees[settings['ROOT']]['root_config'] world_set = root_config.sets['selected'] if not hasattr(world_set, 'update'): @@ -1184,7 +1187,7 @@ def action_deselect(settings, trees, opts, atoms): if '--ask' in opts: prompt = "Would you like to remove these " + \ "packages from your world favorites?" - if userquery(prompt) == 'No': + if userquery(prompt, enter_invalid) == 'No': return os.EX_OK remaining = set(world_set) @@ -1679,6 +1682,7 @@ def action_search(root_config, myopts, myfiles, spinner): searchinstance.output() def action_sync(settings, trees, mtimedb, myopts, myaction): + enter_invalid = '--ask-enter-invalid' in myopts xterm_titles = "notitles" not in settings.features emergelog(xterm_titles, " === sync") portdb = trees[settings["ROOT"]]["porttree"].dbapi @@ -1924,7 +1928,9 @@ def action_sync(settings, trees, mtimedb, myopts, myaction): if (retries==0): if "--ask" in myopts: - if userquery("Do you want to sync your Portage tree with the mirror at\n" + blue(dosyncuri) + bold("?"))=="No": + if userquery("Do you want to sync your Portage tree " + \ + "with the mirror at\n" + blue(dosyncuri) + bold("?"), + enter_invalid) == "No": print() print("Quitting.") print() diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py index 0a5e94084..9d036f05f 100644 --- a/pym/_emerge/help.py +++ b/pym/_emerge/help.py @@ -255,16 +255,29 @@ def help(myopts, havecolor=1): print(" be displayed as USE=\"-bar dar -foo\"") print() print(" "+green("--ask")+" ("+green("-a")+" short option)") - print(" before performing the merge, display what ebuilds and tbz2s will") - print(" be installed, in the same format as when using --pretend; then") - print(" ask whether to continue with the merge or abort. Using --ask is") - print(" more efficient than using --pretend and then executing the same") - print(" command without --pretend, as dependencies will only need to be") - print(" calculated once. WARNING: If the \"Enter\" key is pressed at the") - print(" prompt (with no other input), it is interpreted as acceptance of") - print(" the first choice. Note that the input buffer is not cleared prior") - print(" to the prompt, so an accidental press of the \"Enter\" key at any") - print(" time prior to the prompt will be interpreted as a choice!") + desc = "Before performing the action, display what will take place (server info for " + \ + "--sync, --pretend output for merge, and so forth), then ask " + \ + "whether to proceed with the action or abort. Using --ask is more " + \ + "efficient than using --pretend and then executing the same command " + \ + "without --pretend, as dependencies will only need to be calculated once. " + \ + "WARNING: If the \"Enter\" key is pressed at the prompt (with no other input), " + \ + "it is interpreted as acceptance of the first choice. Note that the input " + \ + "buffer is not cleared prior to the prompt, so an accidental press of the " + \ + "\"Enter\" key at any time prior to the prompt will be interpreted as a choice! " + \ + "Use the --ask-enter-invalid option if you want a single \"Enter\" key " + \ + "press to be interpreted as invalid input." + for line in wrap(desc, desc_width): + print(desc_indent + line) + print() + print(" " + green("--ask-enter-invalid")) + desc = "When used together with the --ask option, " + \ + "interpret a single \"Enter\" key press as " + \ + "invalid input. This helps prevent accidental " + \ + "acceptance of the first choice. This option is " + \ + "intended to be set in the make.conf(5) " + \ + "EMERGE_DEFAULT_OPTS variable." + for line in wrap(desc, desc_width): + print(desc_indent + line) print() print(" " + green("--binpkg-respect-use") + \ " < " + turquoise("y") + " | " + turquoise("n") + " >") diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py index b00c8fb17..a20a5e7b7 100644 --- a/pym/_emerge/main.py +++ b/pym/_emerge/main.py @@ -49,6 +49,7 @@ if sys.hexversion >= 0x3000000: options=[ "--ask", "--alphabetical", +"--ask-enter-invalid", "--buildpkg", "--buildpkgonly", "--changed-use", "--changelog", "--columns", diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py index 967d72478..aefc94b36 100644 --- a/pym/_emerge/unmerge.py +++ b/pym/_emerge/unmerge.py @@ -27,6 +27,7 @@ def unmerge(root_config, myopts, unmerge_action, if clean_world: clean_world = myopts.get('--deselect') != 'n' quiet = "--quiet" in myopts + enter_invalid = '--ask-enter-invalid' in myopts settings = root_config.settings sets = root_config.sets vartree = root_config.trees["vartree"] @@ -483,7 +484,8 @@ def unmerge(root_config, myopts, unmerge_action, #we're done... return return 0 if "--ask" in myopts: - if userquery("Would you like to unmerge these packages?")=="No": + if userquery("Would you like to unmerge these packages?", + enter_invalid) == "No": # enter pretend mode for correct formatting of results myopts["--pretend"] = True print() diff --git a/pym/_emerge/userquery.py b/pym/_emerge/userquery.py index 5da236007..f177c9e87 100644 --- a/pym/_emerge/userquery.py +++ b/pym/_emerge/userquery.py @@ -8,11 +8,12 @@ import sys from portage.output import bold, create_color_func -def userquery(prompt, responses=None, colours=None): +def userquery(prompt, enter_invalid, responses=None, colours=None): """Displays a prompt and a set of responses, then waits for a response which is checked against the responses and the first to match is - returned. An empty response will match the first value in responses. The - input buffer is *not* cleared prior to the prompt! + returned. An empty response will match the first value in responses, + unless enter_invalid is True. The input buffer is *not* cleared prior + to the prompt! prompt: a String. responses: a List of Strings. @@ -42,10 +43,12 @@ def userquery(prompt, responses=None, colours=None): response=input("["+"/".join([colours[i](responses[i]) for i in range(len(responses))])+"] ") else: response=raw_input("["+"/".join([colours[i](responses[i]) for i in range(len(responses))])+"] ") - for key in responses: - # An empty response will match the first value in responses. - if response.upper()==key[:len(response)].upper(): - return key + if response or not enter_invalid: + for key in responses: + # An empty response will match the + # first value in responses. + if response.upper()==key[:len(response)].upper(): + return key print("Sorry, response '%s' not understood." % response, end=' ') except (EOFError, KeyboardInterrupt): print("Interrupted.") -- cgit v1.2.3-1-g7c22