~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ui/__init__.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-12-02 14:58:47 UTC
  • mfrom: (5554.1.3 trunk)
  • Revision ID: pqm@pqm.ubuntu.com-20101202145847-fw822sd3nyhvrwmi
(vila) Merge 2.2 into trunk including fix for bug #583667 and bug
        #681885 (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
41
41
    back to working through the terminal.
42
42
"""
43
43
 
44
 
from __future__ import absolute_import
45
44
 
 
45
import os
 
46
import sys
46
47
import warnings
47
48
 
48
49
from bzrlib.lazy_import import lazy_import
49
50
lazy_import(globals(), """
 
51
import getpass
 
52
 
50
53
from bzrlib import (
51
 
    config,
 
54
    errors,
52
55
    osutils,
53
56
    progress,
54
57
    trace,
55
58
    )
56
59
""")
 
60
from bzrlib.symbol_versioning import (
 
61
    deprecated_function,
 
62
    deprecated_in,
 
63
    deprecated_method,
 
64
    )
57
65
 
58
66
 
59
67
_valid_boolean_strings = dict(yes=True, no=False,
146
154
            "%(from_format)s to %(to_format)s.\n"
147
155
            "This may take some time. Upgrade the repositories to the "
148
156
            "same format for better performance."
149
 
            ),
150
 
        experimental_format_fetch=("Fetching into experimental format "
151
 
            "%(to_format)s.\n"
152
 
            "This format may be unreliable or change in the future "
153
 
            "without an upgrade path.\n"),
154
 
        deprecated_command=(
155
 
            "The command 'bzr %(deprecated_name)s' "
156
 
            "has been deprecated in bzr %(deprecated_in_version)s. "
157
 
            "Please use 'bzr %(recommended_name)s' instead."),
158
 
        deprecated_command_option=(
159
 
            "The option '%(deprecated_name)s' to 'bzr %(command)s' "
160
 
            "has been deprecated in bzr %(deprecated_in_version)s. "
161
 
            "Please use '%(recommended_name)s' instead."),
162
 
        recommend_upgrade=("%(current_format_name)s is deprecated "
163
 
            "and a better format is available.\n"
164
 
            "It is recommended that you upgrade by "
165
 
            "running the command\n"
166
 
            "  bzr upgrade %(basedir)s"),
167
 
        locks_steal_dead=(
168
 
            u"Stole dead lock %(lock_url)s %(other_holder_info)s."),
169
 
        not_checking_ssl_cert=(
170
 
            u"Not checking SSL certificate for %(host)s."),
 
157
            )
171
158
        )
172
159
 
173
160
    def __init__(self):
218
205
        """
219
206
        return self.get_boolean(prompt % prompt_kwargs)
220
207
 
221
 
    def get_password(self, prompt=u'', **kwargs):
 
208
    def get_password(self, prompt='', **kwargs):
222
209
        """Prompt the user for a password.
223
210
 
224
 
        :param prompt: The prompt to present the user (must be unicode)
 
211
        :param prompt: The prompt to present the user
225
212
        :param kwargs: Arguments which will be expanded into the prompt.
226
213
                       This lets front ends display different things if
227
214
                       they so choose.
255
242
        """
256
243
        # XXX: is the caller supposed to close the resulting object?
257
244
        if encoding is None:
258
 
            encoding = config.GlobalStack().get('output_encoding')
 
245
            from bzrlib import config
 
246
            encoding = config.GlobalConfig().get_user_option(
 
247
                'output_encoding')
259
248
        if encoding is None:
260
249
            encoding = osutils.get_terminal_encoding(trace=True)
261
250
        if encoding_type is None:
316
305
        try:
317
306
            template = self._user_warning_templates[warning_id]
318
307
        except KeyError:
319
 
            fail = "bzr warning: %r, %r" % (warning_id, message_args)
320
 
            warnings.warn("no template for warning: " + fail)   # so tests will fail etc
 
308
            fail = "failed to format warning %r, %r" % (warning_id, message_args)
 
309
            warnings.warn(fail)   # so tests will fail etc
321
310
            return fail
322
311
        try:
323
312
            return template % message_args
324
313
        except ValueError, e:
325
 
            fail = "bzr unprintable warning: %r, %r, %s" % (
 
314
            fail = "failed to format warning %r, %r: %s" % (
326
315
                warning_id, message_args, e)
327
316
            warnings.warn(fail)   # so tests will fail etc
328
317
            return fail
329
318
 
330
 
    def choose(self, msg, choices, default=None):
331
 
        """Prompt the user for a list of alternatives.
332
 
 
333
 
        :param msg: message to be shown as part of the prompt.
334
 
 
335
 
        :param choices: list of choices, with the individual choices separated
336
 
            by '\n', e.g.: choose("Save changes?", "&Yes\n&No\n&Cancel"). The
337
 
            letter after the '&' is the shortcut key for that choice. Thus you
338
 
            can type 'c' to select "Cancel".  Shorcuts are case insensitive.
339
 
            The shortcut does not need to be the first letter. If a shorcut key
340
 
            is not provided, the first letter for the choice will be used.
341
 
 
342
 
        :param default: default choice (index), returned for example when enter
343
 
            is pressed for the console version.
344
 
 
345
 
        :return: the index fo the user choice (so '0', '1' or '2' for
346
 
            respectively yes/no/cancel in the previous example).
347
 
        """
348
 
        raise NotImplementedError(self.choose)
349
 
 
350
319
    def get_boolean(self, prompt):
351
320
        """Get a boolean question answered from the user.
352
321
 
353
322
        :param prompt: a message to prompt the user with. Should be a single
354
 
            line without terminating \\n.
 
323
        line without terminating \n.
355
324
        :return: True or False for y/yes or n/no.
356
325
        """
357
 
        choice = self.choose(prompt + '?', '&yes\n&no', default=None)
358
 
        return 0 == choice
 
326
        raise NotImplementedError(self.get_boolean)
359
327
 
360
328
    def get_integer(self, prompt):
361
329
        """Get an integer from the user.
362
330
 
363
331
        :param prompt: a message to prompt the user with. Could be a multi-line
364
 
            prompt but without a terminating \\n.
 
332
            prompt but without a terminating \n.
365
333
 
366
334
        :return: A signed integer.
367
335
        """
375
343
        """
376
344
        return NullProgressView()
377
345
 
378
 
    def recommend_upgrade(self, current_format_name, basedir):
379
 
        """Recommend the user upgrade a control directory.
380
 
 
381
 
        :param current_format_name: Description of the current format
382
 
        :param basedir: Location of the control dir
383
 
        """
384
 
        self.show_user_warning('recommend_upgrade',
385
 
            current_format_name=current_format_name, basedir=basedir)
 
346
    def recommend_upgrade(self,
 
347
        current_format_name,
 
348
        basedir):
 
349
        # XXX: this should perhaps be in the TextUIFactory and the default can do
 
350
        # nothing
 
351
        #
 
352
        # XXX: Change to show_user_warning - that will accomplish the previous
 
353
        # xxx. -- mbp 2010-02-25
 
354
        trace.warning("%s is deprecated "
 
355
            "and a better format is available.\n"
 
356
            "It is recommended that you upgrade by "
 
357
            "running the command\n"
 
358
            "  bzr upgrade %s",
 
359
            current_format_name,
 
360
            basedir)
386
361
 
387
362
    def report_transport_activity(self, transport, byte_count, direction):
388
363
        """Called by transports as they do IO.
439
414
        """Show a warning to the user."""
440
415
        raise NotImplementedError(self.show_warning)
441
416
 
 
417
    def warn_cross_format_fetch(self, from_format, to_format):
 
418
        """Warn about a potentially slow cross-format transfer.
 
419
        
 
420
        This is deprecated in favor of show_user_warning, but retained for api
 
421
        compatibility in 2.0 and 2.1.
 
422
        """
 
423
        self.show_user_warning('cross_format_fetch', from_format=from_format,
 
424
            to_format=to_format)
 
425
 
 
426
    def warn_experimental_format_fetch(self, inter):
 
427
        """Warn about fetching into experimental repository formats."""
 
428
        if inter.target._format.experimental:
 
429
            trace.warning("Fetching into experimental format %s.\n"
 
430
                "This format may be unreliable or change in the future "
 
431
                "without an upgrade path.\n" % (inter.target._format,))
 
432
 
442
433
 
443
434
class NoninteractiveUIFactory(UIFactory):
444
435
    """Base class for UIs with no user."""
500
491
    def get_integer(self, prompt):
501
492
        return self.responses.pop(0)
502
493
 
503
 
    def get_password(self, prompt=u'', **kwargs):
 
494
    def get_password(self, prompt='', **kwargs):
504
495
        return self.responses.pop(0)
505
496
 
506
497
    def get_username(self, prompt, **kwargs):