| # Copyright 1999-2012 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| from __future__ import print_function |
| |
| import signal |
| import sys |
| |
| from portage.output import bold, create_color_func |
| |
| 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, |
| unless enter_invalid is True. The input buffer is *not* cleared prior |
| to the prompt! |
| |
| prompt: a String. |
| responses: a List of Strings. |
| colours: a List of Functions taking and returning a String, used to |
| process the responses for display. Typically these will be functions |
| like red() but could be e.g. lambda x: "DisplayString". |
| If responses is omitted, defaults to ["Yes", "No"], [green, red]. |
| If only colours is omitted, defaults to [bold, ...]. |
| |
| Returns a member of the List responses. (If called without optional |
| arguments, returns "Yes" or "No".) |
| KeyboardInterrupt is converted to SystemExit to avoid tracebacks being |
| printed.""" |
| if responses is None: |
| responses = ["Yes", "No"] |
| colours = [ |
| create_color_func("PROMPT_CHOICE_DEFAULT"), |
| create_color_func("PROMPT_CHOICE_OTHER") |
| ] |
| elif colours is None: |
| colours=[bold] |
| colours=(colours*len(responses))[:len(responses)] |
| print(bold(prompt), end=' ') |
| try: |
| while True: |
| if sys.hexversion >= 0x3000000: |
| 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))])+"] ") |
| 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.") |
| sys.exit(128 + signal.SIGINT) |