~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ui/text.py

  • Committer: Martin Pool
  • Date: 2009-06-22 09:16:26 UTC
  • mto: This revision was merged to the branch mainline in revision 4558.
  • Revision ID: mbp@sourcefrog.net-20090622091626-03xi30uj70owv95d
Fuse CLIUIFactory and TextUIFactory and deprecate the old name

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
""")
35
35
 
36
36
from bzrlib.ui import (
37
 
    CLIUIFactory,
 
37
    UIFactory,
38
38
    NullProgressView,
39
39
    )
40
40
 
41
41
 
42
 
class TextUIFactory(CLIUIFactory):
 
42
class TextUIFactory(UIFactory):
43
43
    """A UI factory for Text user interefaces."""
44
44
 
45
45
    def __init__(self,
46
 
                 bar_type=None,
47
46
                 stdin=None,
48
47
                 stdout=None,
49
48
                 stderr=None):
53
52
                         letting the bzrlib.progress.ProgressBar factory auto
54
53
                         select.   Deprecated.
55
54
        """
56
 
        super(TextUIFactory, self).__init__(stdin=stdin,
57
 
                stdout=stdout, stderr=stderr)
58
 
        if bar_type:
59
 
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 11, 0))
60
 
                % "bar_type parameter")
 
55
        super(TextUIFactory, self).__init__()
 
56
        self.stdin = stdin
 
57
        self.stdout = stdout
 
58
        self.stderr = stderr
61
59
        # paints progress, network activity, etc
62
60
        self._progress_view = self.make_progress_view()
63
61
        
72
70
        # to clear it.  We might need to separately check for the case of
73
71
        self._progress_view.clear()
74
72
 
 
73
    def get_boolean(self, prompt):
 
74
        # FIXME: make a regexp and handle case variations as well.
 
75
        while True:
 
76
            self.prompt(prompt + "? [y/n]: ")
 
77
            line = self.stdin.readline()
 
78
            if line in ('y\n', 'yes\n'):
 
79
                return True
 
80
            if line in ('n\n', 'no\n'):
 
81
                return False
 
82
 
 
83
    def get_non_echoed_password(self):
 
84
        isatty = getattr(self.stdin, 'isatty', None)
 
85
        if isatty is not None and isatty():
 
86
            # getpass() ensure the password is not echoed and other
 
87
            # cross-platform niceties
 
88
            password = getpass.getpass('')
 
89
        else:
 
90
            # echo doesn't make sense without a terminal
 
91
            password = self.stdin.readline()
 
92
            if not password:
 
93
                password = None
 
94
            elif password[-1] == '\n':
 
95
                password = password[:-1]
 
96
        return password
 
97
 
 
98
    def get_password(self, prompt='', **kwargs):
 
99
        """Prompt the user for a password.
 
100
 
 
101
        :param prompt: The prompt to present the user
 
102
        :param kwargs: Arguments which will be expanded into the prompt.
 
103
                       This lets front ends display different things if
 
104
                       they so choose.
 
105
        :return: The password string, return None if the user
 
106
                 canceled the request.
 
107
        """
 
108
        prompt += ': '
 
109
        self.prompt(prompt, **kwargs)
 
110
        # There's currently no way to say 'i decline to enter a password'
 
111
        # as opposed to 'my password is empty' -- does it matter?
 
112
        return self.get_non_echoed_password()
 
113
 
 
114
    def get_username(self, prompt, **kwargs):
 
115
        """Prompt the user for a username.
 
116
 
 
117
        :param prompt: The prompt to present the user
 
118
        :param kwargs: Arguments which will be expanded into the prompt.
 
119
                       This lets front ends display different things if
 
120
                       they so choose.
 
121
        :return: The username string, return None if the user
 
122
                 canceled the request.
 
123
        """
 
124
        prompt += ': '
 
125
        self.prompt(prompt, **kwargs)
 
126
        username = self.stdin.readline()
 
127
        if not username:
 
128
            username = None
 
129
        elif username[-1] == '\n':
 
130
            username = username[:-1]
 
131
        return username
 
132
 
75
133
    def make_progress_view(self):
76
134
        """Construct and return a new ProgressView subclass for this UI.
77
135
        """
91
149
        self.clear_term()
92
150
        self.stdout.write(msg + '\n')
93
151
 
 
152
    def prompt(self, prompt, **kwargs):
 
153
        """Emit prompt on the CLI.
 
154
        
 
155
        :param kwargs: Dictionary of arguments to insert into the prompt,
 
156
            to allow UIs to reformat the prompt.
 
157
        """
 
158
        if kwargs:
 
159
            # See <https://launchpad.net/bugs/365891>
 
160
            prompt = prompt % kwargs
 
161
        prompt = prompt.encode(osutils.get_terminal_encoding(), 'replace')
 
162
        self.clear_term()
 
163
        self.stderr.write(prompt)
 
164
 
94
165
    def report_transport_activity(self, transport, byte_count, direction):
95
166
        """Called by transports as they do IO.
96
167
 
265
336
            self._bytes_since_update = 0
266
337
            self._last_transport_msg = msg
267
338
            self._repaint()
268
 
 
269