~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ui/__init__.py

  • Committer: Martin
  • Date: 2010-04-14 00:11:32 UTC
  • mto: This revision was merged to the branch mainline in revision 5164.
  • Revision ID: gzlist@googlemail.com-20100414001132-6m1ru11mbfu87x6m
Fix os.utime test failures, three on FAT filesystems and one with readonly files

Show diffs side-by-side

added added

removed removed

Lines of Context:
100
100
    return val
101
101
 
102
102
 
103
 
class ConfirmationUserInterfacePolicy(object):
104
 
    """Wrapper for a UIFactory that allows or denies all confirmed actions."""
105
 
 
106
 
    def __init__(self, wrapped_ui, default_answer, specific_answers):
107
 
        """Generate a proxy UI that does no confirmations.
108
 
 
109
 
        :param wrapped_ui: Underlying UIFactory.
110
 
        :param default_answer: Bool for whether requests for
111
 
            confirmation from the user should be noninteractively accepted or
112
 
            denied.
113
 
        :param specific_answers: Map from confirmation_id to bool answer.
114
 
        """
115
 
        self.wrapped_ui = wrapped_ui
116
 
        self.default_answer = default_answer
117
 
        self.specific_answers = specific_answers
118
 
 
119
 
    def __getattr__(self, name):
120
 
        return getattr(self.wrapped_ui, name)
121
 
 
122
 
    def __repr__(self):
123
 
        return '%s(%r, %r, %r)' % (
124
 
            self.__class__.__name__,
125
 
            self.wrapped_ui,
126
 
            self.default_answer, 
127
 
            self.specific_answers)
128
 
 
129
 
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
130
 
        if confirmation_id in self.specific_answers:
131
 
            return self.specific_answers[confirmation_id]
132
 
        elif self.default_answer is not None:
133
 
            return self.default_answer
134
 
        else:
135
 
            return self.wrapped_ui.confirm_action(
136
 
                prompt, confirmation_id, prompt_kwargs)
137
 
 
138
 
 
139
103
class UIFactory(object):
140
104
    """UI abstraction.
141
105
 
142
106
    This tells the library how to display things to the user.  Through this
143
107
    layer different applications can choose the style of UI.
144
108
 
145
 
    UI Factories are also context managers, for some syntactic sugar some users
146
 
    need.
147
 
 
148
109
    :ivar suppressed_warnings: Identifiers for user warnings that should 
149
110
        no be emitted.
150
111
    """
162
123
        self.suppressed_warnings = set()
163
124
        self._quiet = False
164
125
 
165
 
    def __enter__(self):
166
 
        """Context manager entry support.
167
 
 
168
 
        Override in a concrete factory class if initialisation before use is
169
 
        needed.
170
 
        """
171
 
        return self # This is bound to the 'as' clause in a with statement.
172
 
 
173
 
    def __exit__(self, exc_type, exc_val, exc_tb):
174
 
        """Context manager exit support.
175
 
 
176
 
        Override in a concrete factory class if more cleanup than a simple
177
 
        self.clear_term() is needed when the UIFactory is finished with.
178
 
        """
179
 
        self.clear_term()
180
 
        return False # propogate exceptions.
181
 
 
182
126
    def be_quiet(self, state):
183
127
        """Tell the UI to be more quiet, or not.
184
128
 
187
131
        """
188
132
        self._quiet = state
189
133
 
190
 
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
191
 
        """Seek user confirmation for an action.
192
 
 
193
 
        If the UI is noninteractive, or the user does not want to be asked
194
 
        about this action, True is returned, indicating bzr should just
195
 
        proceed.
196
 
 
197
 
        The confirmation id allows the user to configure certain actions to
198
 
        always be confirmed or always denied, and for UIs to specialize the
199
 
        display of particular confirmations.
200
 
 
201
 
        :param prompt: Suggested text to display to the user.
202
 
        :param prompt_kwargs: A dictionary of arguments that can be
203
 
            string-interpolated into the prompt.
204
 
        :param confirmation_id: Unique string identifier for the confirmation.
205
 
        """
206
 
        return self.get_boolean(prompt % prompt_kwargs)
207
 
 
208
134
    def get_password(self, prompt='', **kwargs):
209
135
        """Prompt the user for a password.
210
136
 
232
158
        version of stdout, but in a GUI it might be appropriate to send it to a 
233
159
        window displaying the text.
234
160
     
235
 
        :param encoding: Unicode encoding for output; if not specified 
236
 
            uses the configured 'output_encoding' if any; otherwise the 
237
 
            terminal encoding. 
 
161
        :param encoding: Unicode encoding for output; default is the 
 
162
            terminal encoding, which may be different from the user encoding.
238
163
            (See get_terminal_encoding.)
239
164
 
240
165
        :param encoding_type: How to handle encoding errors:
242
167
        """
243
168
        # XXX: is the caller supposed to close the resulting object?
244
169
        if encoding is None:
245
 
            from bzrlib import config
246
 
            encoding = config.GlobalConfig().get_user_option(
247
 
                'output_encoding')
248
 
        if encoding is None:
249
 
            encoding = osutils.get_terminal_encoding(trace=True)
 
170
            encoding = osutils.get_terminal_encoding()
250
171
        if encoding_type is None:
251
172
            encoding_type = 'replace'
252
173
        out_stream = self._make_output_stream_explicit(encoding, encoding_type)
431
352
                "without an upgrade path.\n" % (inter.target._format,))
432
353
 
433
354
 
434
 
class NoninteractiveUIFactory(UIFactory):
435
 
    """Base class for UIs with no user."""
436
 
 
437
 
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
438
 
        return True
439
 
 
440
 
    def __repr__(self):
441
 
        return '%s()' % (self.__class__.__name__, )
442
 
 
443
 
 
444
 
class SilentUIFactory(NoninteractiveUIFactory):
 
355
 
 
356
class SilentUIFactory(UIFactory):
445
357
    """A UI Factory which never prints anything.
446
358
 
447
359
    This is the default UI, if another one is never registered by a program
482
394
    def __repr__(self):
483
395
        return "%s(%r)" % (self.__class__.__name__, self.responses)
484
396
 
485
 
    def confirm_action(self, prompt, confirmation_id, args):
486
 
        return self.get_boolean(prompt % args)
487
 
 
488
397
    def get_boolean(self, prompt):
489
398
        return self.responses.pop(0)
490
399