266 # raw_input() to emit an extra trailing carriage return |
266 # raw_input() to emit an extra trailing carriage return |
267 if os.linesep == '\r\n' and line and line[-1] == '\r': |
267 if os.linesep == '\r\n' and line and line[-1] == '\r': |
268 line = line[:-1] |
268 line = line[:-1] |
269 return line |
269 return line |
270 |
270 |
271 def prompt(self, msg, pat=None, default="y"): |
271 def prompt(self, msg, choices=None, default="y"): |
272 """Prompt user with msg, read response, and ensure it matches pat |
272 """Prompt user with msg, read response, and ensure it matches |
273 |
273 one of the provided choices. choices is a sequence of acceptable |
274 If not interactive -- the default is returned |
274 responses with the format: ('&None', 'E&xec', 'Sym&link') |
|
275 No sequence implies no response checking. Responses are case |
|
276 insensitive. If ui is not interactive, the default is returned. |
275 """ |
277 """ |
276 if not self.interactive(): |
278 if not self.interactive(): |
277 self.note(msg, ' ', default, "\n") |
279 self.note(msg, ' ', default, "\n") |
278 return default |
280 return default |
279 while True: |
281 while True: |
280 try: |
282 try: |
281 r = self._readline(msg + ' ') |
283 r = self._readline(msg + ' ') |
282 if not r: |
284 if not r: |
283 return default |
285 return default |
284 if not pat or re.match(pat, r): |
286 if not choices: |
285 return r |
287 return r |
|
288 resps = [s[s.index('&')+1].lower() for s in choices] |
|
289 if r.lower() in resps: |
|
290 return r.lower() |
286 else: |
291 else: |
287 self.write(_("unrecognized response\n")) |
292 self.write(_("unrecognized response\n")) |
288 except EOFError: |
293 except EOFError: |
289 raise util.Abort(_('response expected')) |
294 raise util.Abort(_('response expected')) |
290 |
295 |