~bzr-pqm/bzr/bzr.dev

1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
1
# Copyright (C) 2005 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
18
19
"""Text UI, write output to the console.
20
"""
21
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
22
import sys
23
24
from bzrlib.lazy_import import lazy_import
25
lazy_import(globals(), """
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
26
import getpass
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
27
28
from bzrlib import (
29
    progress,
30
    )
31
""")
32
33
from bzrlib.symbol_versioning import (
34
    deprecated_method,
35
    zero_eight,
36
    )
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
37
from bzrlib.ui import CLIUIFactory
38
39
40
class TextUIFactory(CLIUIFactory):
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
41
    """A UI factory for Text user interefaces."""
42
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
43
    def __init__(self,
44
                 bar_type=None,
45
                 stdout=None,
46
                 stderr=None):
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
47
        """Create a TextUIFactory.
48
49
        :param bar_type: The type of progress bar to create. It defaults to 
50
                         letting the bzrlib.progress.ProgressBar factory auto
51
                         select.
52
        """
53
        super(TextUIFactory, self).__init__()
54
        self._bar_type = bar_type
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
55
        if stdout is None:
56
            self.stdout = sys.stdout
57
        else:
58
            self.stdout = stdout
59
        if stderr is None:
60
            self.stderr = sys.stderr
61
        else:
62
            self.stderr = stderr
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
63
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
64
    def prompt(self, prompt):
65
        """Emit prompt on the CLI."""
66
        self.stdout.write(prompt + "? [y/n]:")
67
        
1594.1.2 by Robert Collins
Update news and deprecated the old progress bar api.
68
    @deprecated_method(zero_eight)
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
69
    def progress_bar(self):
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
70
        """See UIFactory.nested_progress_bar()."""
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
71
        # this in turn is abstract, and creates either a tty or dots
72
        # bar depending on what we think of the terminal
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
73
        return progress.ProgressBar()
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
74
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
75
    def get_password(self, prompt='', **kwargs):
76
        """Prompt the user for a password.
77
78
        :param prompt: The prompt to present the user
79
        :param kwargs: Arguments which will be expanded into the prompt.
80
                       This lets front ends display different things if
81
                       they so choose.
82
        :return: The password string, return None if the user 
83
                 canceled the request.
84
        """
85
        prompt = (prompt % kwargs).encode(sys.stdout.encoding, 'replace')
86
        prompt += ': '
1875.1.1 by Martin Pool
Avoid absorbing KeyboardInterrupt in getpass
87
        # There's currently no way to say 'i decline to enter a password'
88
        # as opposed to 'my password is empty' -- does it matter?
89
        return getpass.getpass(prompt)
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
90
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
91
    def nested_progress_bar(self):
92
        """Return a nested progress bar.
93
        
94
        The actual bar type returned depends on the progress module which
95
        may return a tty or dots bar depending on the terminal.
96
        """
97
        if self._progress_bar_stack is None:
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
98
            self._progress_bar_stack = progress.ProgressBarStack(
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
99
                klass=self._bar_type)
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
100
        return self._progress_bar_stack.get_nested()
1558.8.1 by Aaron Bentley
Fix overall progress bar's interaction with 'note' and 'warning'
101
102
    def clear_term(self):
103
        """Prepare the terminal for output.
104
105
        This will, clear any progress bars, and leave the cursor at the
106
        leftmost position."""
107
        if self._progress_bar_stack is None:
108
            return
109
        overall_pb = self._progress_bar_stack.bottom()
110
        if overall_pb is not None:
111
            overall_pb.clear()