~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: 2009-01-13 05:14:24 UTC
  • mfrom: (3936.1.3 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20090113051424-nrk3zkfe09h46i9y
(mbp) merge 1.11 and advance to 1.12

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 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
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
 
18
 
 
19
17
"""UI abstraction.
20
18
 
21
19
This tells the library how to display things to the user.  Through this
32
30
 
33
31
from bzrlib.lazy_import import lazy_import
34
32
lazy_import(globals(), """
 
33
import getpass
 
34
 
35
35
from bzrlib import (
 
36
    errors,
 
37
    osutils,
36
38
    progress,
 
39
    trace,
37
40
    )
38
41
""")
39
42
 
40
 
from bzrlib.symbol_versioning import (deprecated_method, zero_eight)
41
 
 
42
43
 
43
44
class UIFactory(object):
44
45
    """UI abstraction.
51
52
        super(UIFactory, self).__init__()
52
53
        self._progress_bar_stack = None
53
54
 
54
 
    @deprecated_method(zero_eight)
55
 
    def progress_bar(self):
56
 
        """See UIFactory.nested_progress_bar()."""
57
 
        raise NotImplementedError(self.progress_bar)
58
 
 
59
55
    def get_password(self, prompt='', **kwargs):
60
56
        """Prompt the user for a password.
61
57
 
63
59
        :param kwargs: Arguments which will be expanded into the prompt.
64
60
                       This lets front ends display different things if
65
61
                       they so choose.
66
 
        :return: The password string, return None if the user 
67
 
                 canceled the request.
 
62
 
 
63
        :return: The password string, return None if the user canceled the
 
64
                 request. Note that we do not touch the encoding, users may
 
65
                 have whatever they see fit and the password should be
 
66
                 transported as is.
68
67
        """
69
68
        raise NotImplementedError(self.get_password)
70
 
        
 
69
 
71
70
    def nested_progress_bar(self):
72
71
        """Return a nested progress bar.
73
72
 
92
91
        """
93
92
        raise NotImplementedError(self.get_boolean)
94
93
 
 
94
    def recommend_upgrade(self,
 
95
        current_format_name,
 
96
        basedir):
 
97
        # this should perhaps be in the TextUIFactory and the default can do
 
98
        # nothing
 
99
        trace.warning("%s is deprecated "
 
100
            "and a better format is available.\n"
 
101
            "It is recommended that you upgrade by "
 
102
            "running the command\n"
 
103
            "  bzr upgrade %s",
 
104
            current_format_name,
 
105
            basedir)
 
106
 
95
107
 
96
108
class CLIUIFactory(UIFactory):
97
109
    """Common behaviour for command line UI factories."""
104
116
        self.clear_term()
105
117
        # FIXME: make a regexp and handle case variations as well.
106
118
        while True:
107
 
            self.prompt(prompt)
 
119
            self.prompt(prompt + "? [y/n]: ")
108
120
            line = self.stdin.readline()
109
121
            if line in ('y\n', 'yes\n'):
110
122
                return True
111
123
            if line in ('n\n', 'no\n'):
112
124
                return False
113
125
 
 
126
    def get_non_echoed_password(self, prompt):
 
127
        if not sys.stdin.isatty():
 
128
            raise errors.NotATerminal()
 
129
        encoding = osutils.get_terminal_encoding()
 
130
        return getpass.getpass(prompt.encode(encoding, 'replace'))
 
131
 
 
132
    def get_password(self, prompt='', **kwargs):
 
133
        """Prompt the user for a password.
 
134
 
 
135
        :param prompt: The prompt to present the user
 
136
        :param kwargs: Arguments which will be expanded into the prompt.
 
137
                       This lets front ends display different things if
 
138
                       they so choose.
 
139
        :return: The password string, return None if the user 
 
140
                 canceled the request.
 
141
        """
 
142
        prompt += ': '
 
143
        prompt = (prompt % kwargs)
 
144
        # There's currently no way to say 'i decline to enter a password'
 
145
        # as opposed to 'my password is empty' -- does it matter?
 
146
        return self.get_non_echoed_password(prompt)
 
147
 
114
148
    def prompt(self, prompt):
115
149
        """Emit prompt on the CLI."""
116
150
 
121
155
    This is the default UI, if another one is never registered.
122
156
    """
123
157
 
124
 
    @deprecated_method(zero_eight)
125
 
    def progress_bar(self):
126
 
        """See UIFactory.nested_progress_bar()."""
127
 
        return progress.DummyProgress()
128
 
 
129
158
    def get_password(self, prompt='', **kwargs):
130
159
        return None
131
160
 
138
167
    def clear_term(self):
139
168
        pass
140
169
 
 
170
    def recommend_upgrade(self, *args):
 
171
        pass
 
172
 
141
173
 
142
174
def clear_decorator(func, *args, **kwargs):
143
175
    """Decorator that clears the term"""