/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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 (
2095.4.1 by Martin Pool
Better progress bars during tests
29
    osutils,
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
30
    progress,
31
    )
32
""")
33
34
from bzrlib.symbol_versioning import (
35
    deprecated_method,
36
    zero_eight,
37
    )
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
38
from bzrlib.ui import CLIUIFactory
39
40
41
class TextUIFactory(CLIUIFactory):
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
42
    """A UI factory for Text user interefaces."""
43
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
44
    def __init__(self,
45
                 bar_type=None,
46
                 stdout=None,
47
                 stderr=None):
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
48
        """Create a TextUIFactory.
49
50
        :param bar_type: The type of progress bar to create. It defaults to 
51
                         letting the bzrlib.progress.ProgressBar factory auto
52
                         select.
53
        """
54
        super(TextUIFactory, self).__init__()
55
        self._bar_type = bar_type
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
56
        if stdout is None:
57
            self.stdout = sys.stdout
58
        else:
59
            self.stdout = stdout
60
        if stderr is None:
61
            self.stderr = sys.stderr
62
        else:
63
            self.stderr = stderr
2095.4.1 by Martin Pool
Better progress bars during tests
64
        self._simple_progress_active = False
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
65
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
66
    def prompt(self, prompt):
67
        """Emit prompt on the CLI."""
68
        self.stdout.write(prompt + "? [y/n]:")
69
        
1594.1.2 by Robert Collins
Update news and deprecated the old progress bar api.
70
    @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.
71
    def progress_bar(self):
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
72
        """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.
73
        # this in turn is abstract, and creates either a tty or dots
74
        # bar depending on what we think of the terminal
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
75
        return progress.ProgressBar()
1185.49.21 by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.
76
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
77
    def get_password(self, prompt='', **kwargs):
78
        """Prompt the user for a password.
79
80
        :param prompt: The prompt to present the user
81
        :param kwargs: Arguments which will be expanded into the prompt.
82
                       This lets front ends display different things if
83
                       they so choose.
84
        :return: The password string, return None if the user 
85
                 canceled the request.
86
        """
87
        prompt = (prompt % kwargs).encode(sys.stdout.encoding, 'replace')
88
        prompt += ': '
1875.1.1 by Martin Pool
Avoid absorbing KeyboardInterrupt in getpass
89
        # There's currently no way to say 'i decline to enter a password'
90
        # as opposed to 'my password is empty' -- does it matter?
91
        return getpass.getpass(prompt)
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
92
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
93
    def nested_progress_bar(self):
94
        """Return a nested progress bar.
95
        
96
        The actual bar type returned depends on the progress module which
97
        may return a tty or dots bar depending on the terminal.
98
        """
99
        if self._progress_bar_stack is None:
1996.3.27 by John Arbash Meinel
lazy import getpass in bzrlib.ui.text
100
            self._progress_bar_stack = progress.ProgressBarStack(
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
101
                klass=self._bar_type)
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
102
        return self._progress_bar_stack.get_nested()
1558.8.1 by Aaron Bentley
Fix overall progress bar's interaction with 'note' and 'warning'
103
104
    def clear_term(self):
105
        """Prepare the terminal for output.
106
107
        This will, clear any progress bars, and leave the cursor at the
108
        leftmost position."""
2095.4.1 by Martin Pool
Better progress bars during tests
109
        if self._simple_progress_active:
110
            self._clear_progress_line()
111
            return
1558.8.1 by Aaron Bentley
Fix overall progress bar's interaction with 'note' and 'warning'
112
        if self._progress_bar_stack is None:
113
            return
114
        overall_pb = self._progress_bar_stack.bottom()
115
        if overall_pb is not None:
116
            overall_pb.clear()
2095.4.1 by Martin Pool
Better progress bars during tests
117
118
    def _clear_progress_line(self):
119
        if False:
120
            # erase it
121
            width = osutils.terminal_width() - 1
122
            self.stderr.write('\r')
123
            self.stderr.write(' ' * width)
124
            self.stderr.write('\r')
125
        else:
126
            # just leave it, and move to new line - more reliable and leaves
127
            # it there for context
128
            self.stderr.write('\n')
129
        self._simple_progress_active = False
130
131
    def show_progress_line(self, msg):
132
        width = osutils.terminal_width() - 1
133
        msg = msg[:width]
134
        msg = msg.ljust(width)
135
        self.stderr.write('\r' + msg)
136
        self.stderr.flush()
137
        self._simple_progress_active = True
138
    
139
    def message(self, msg):
140
        self.clear_term()
141
        self.stderr.write(msg + '\n')