~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ui/__init__.py

merge trunk and resolve conflicts to cleanup submission

Show diffs side-by-side

added added

removed removed

Lines of Context:
226
226
 
227
227
 
228
228
 
229
 
class CLIUIFactory(UIFactory):
230
 
    """Deprecated in favor of TextUIFactory."""
231
 
 
232
 
    @deprecated_method(deprecated_in((1, 18, 0)))
233
 
    def __init__(self, stdin=None, stdout=None, stderr=None):
234
 
        UIFactory.__init__(self)
235
 
        self.stdin = stdin or sys.stdin
236
 
        self.stdout = stdout or sys.stdout
237
 
        self.stderr = stderr or sys.stderr
238
 
 
239
 
    _accepted_boolean_strings = dict(y=True, n=False, yes=True, no=False)
240
 
 
241
 
    def get_boolean(self, prompt):
242
 
        while True:
243
 
            self.prompt(prompt + "? [y/n]: ")
244
 
            line = self.stdin.readline()
245
 
            line = line.rstrip('\n')
246
 
            val = bool_from_string(line, self._accepted_boolean_strings)
247
 
            if val is not None:
248
 
                return val
249
 
 
250
 
    def get_non_echoed_password(self):
251
 
        isatty = getattr(self.stdin, 'isatty', None)
252
 
        if isatty is not None and isatty():
253
 
            # getpass() ensure the password is not echoed and other
254
 
            # cross-platform niceties
255
 
            password = getpass.getpass('')
256
 
        else:
257
 
            # echo doesn't make sense without a terminal
258
 
            password = self.stdin.readline()
259
 
            if not password:
260
 
                password = None
261
 
            elif password[-1] == '\n':
262
 
                password = password[:-1]
263
 
        return password
264
 
 
265
 
    def get_password(self, prompt='', **kwargs):
266
 
        """Prompt the user for a password.
267
 
 
268
 
        :param prompt: The prompt to present the user
269
 
        :param kwargs: Arguments which will be expanded into the prompt.
270
 
                       This lets front ends display different things if
271
 
                       they so choose.
272
 
        :return: The password string, return None if the user
273
 
                 canceled the request.
274
 
        """
275
 
        prompt += ': '
276
 
        self.prompt(prompt, **kwargs)
277
 
        # There's currently no way to say 'i decline to enter a password'
278
 
        # as opposed to 'my password is empty' -- does it matter?
279
 
        return self.get_non_echoed_password()
280
 
 
281
 
    def get_username(self, prompt, **kwargs):
282
 
        """Prompt the user for a username.
283
 
 
284
 
        :param prompt: The prompt to present the user
285
 
        :param kwargs: Arguments which will be expanded into the prompt.
286
 
                       This lets front ends display different things if
287
 
                       they so choose.
288
 
        :return: The username string, return None if the user
289
 
                 canceled the request.
290
 
        """
291
 
        prompt += ': '
292
 
        self.prompt(prompt, **kwargs)
293
 
        username = self.stdin.readline()
294
 
        if not username:
295
 
            username = None
296
 
        elif username[-1] == '\n':
297
 
            username = username[:-1]
298
 
        return username
299
 
 
300
 
    def prompt(self, prompt, **kwargs):
301
 
        """Emit prompt on the CLI.
302
 
        
303
 
        :param kwargs: Dictionary of arguments to insert into the prompt,
304
 
            to allow UIs to reformat the prompt.
305
 
        """
306
 
        if kwargs:
307
 
            # See <https://launchpad.net/bugs/365891>
308
 
            prompt = prompt % kwargs
309
 
        prompt = prompt.encode(osutils.get_terminal_encoding(), 'replace')
310
 
        self.clear_term()
311
 
        self.stderr.write(prompt)
312
 
 
313
 
    def note(self, msg):
314
 
        """Write an already-formatted message."""
315
 
        self.stdout.write(msg + '\n')
316
 
 
317
 
 
318
229
class SilentUIFactory(UIFactory):
319
230
    """A UI Factory which never prints anything.
320
231
 
368
279
                % (self,))
369
280
 
370
281
 
371
 
@deprecated_function(deprecated_in((1, 18, 0)))
372
 
def clear_decorator(func, *args, **kwargs):
373
 
    """Decorator that clears the term"""
374
 
    ui_factory.clear_term()
375
 
    func(*args, **kwargs)
376
 
 
377
 
 
378
282
ui_factory = SilentUIFactory()
379
283
# IMPORTANT: never import this symbol directly. ONLY ever access it as
380
284
# ui.ui_factory, so that you refer to the current value.