Bug #134466 - Add a --ask-enter-invalid option. When used together with the
authorZac Medico <zmedico@gentoo.org>
Sat, 24 Oct 2009 07:06:38 +0000 (07:06 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 24 Oct 2009 07:06:38 +0000 (07:06 -0000)
--ask option, interpret a single "Enter" key press as invalid input. This
helps prevent accidental acceptance of the first choice. (trunk r14710)

svn path=/main/branches/2.1.7/; revision=14719

man/emerge.1
pym/_emerge/actions.py
pym/_emerge/help.py
pym/_emerge/main.py
pym/_emerge/unmerge.py
pym/_emerge/userquery.py

index 3cc511bade64b810ef812b297ef923c3d02ade5c..966745be652ff6f49797c82a2ac7267200b972b2 100644 (file)
@@ -257,7 +257,17 @@ without \fB\-\-pretend\fR, as dependencies will only need to be calculated once.
 \fBWARNING: 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!\fR
+"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.\fR
+.TP
+.BR "\-\-ask\-enter\-invalid"
+When used together with the \fB\-\-ask\fR 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 \fBmake.conf\fR(5)
+\fBEMERGE_DEFAULT_OPTS\fR variable.
 .TP
 .BR "\-\-binpkg\-respect\-use < y | n >"
 Tells emerge to ignore binary packages if their use flags
index ee37bec6dec28f43e536084a2b3c7db89eba4129..5b6e0c44c63b91e894297ced10c0446cefeb5bab 100644 (file)
@@ -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()
@@ -440,6 +441,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)
@@ -469,7 +471,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]
@@ -484,7 +486,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...")
@@ -966,6 +968,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'):
@@ -1008,7 +1011,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)
@@ -1503,6 +1506,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
@@ -1748,7 +1752,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()
index ed5c14874e86b94c9225bca7817a16f7a6d4248d..4631d6dffe47c9b3d61caba887e4177bbb24f3a9 100644 (file)
@@ -252,16 +252,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") + " >")
index 9ddbe3df957e87e679ddab8149153705281307fb..643070a7bd9a680fab2f74676707f567786fa225 100644 (file)
@@ -49,6 +49,7 @@ if sys.hexversion >= 0x3000000:
 
 options=[
 "--ask",          "--alphabetical",
+"--ask-enter-invalid",
 "--buildpkg",     "--buildpkgonly",
 "--changed-use",
 "--changelog",    "--columns",
index ef8b92cc59f8db6a80a3f189fcd5c00673308e92..292a71ceccbfff45f3e24b4c043c4a4ab810b160 100644 (file)
@@ -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"]
@@ -396,7 +397,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()
index 5da2360070bf8d8f9ddb8581a03c08b44d69b250..f177c9e8794cc604e933ba5c56dc100e7c3c2847 100644 (file)
@@ -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.")