~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2006-06-20 03:30:14 UTC
  • mfrom: (1793 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1797.
  • Revision ID: mbp@sourcefrog.net-20060620033014-e19ce470e2ce6561
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
import os
33
33
from warnings import warn
34
34
import errno
 
35
import codecs
35
36
 
36
37
import bzrlib
37
38
import bzrlib.errors as errors
189
190
    hidden
190
191
        If true, this command isn't advertised.  This is typically
191
192
        for commands intended for expert users.
 
193
 
 
194
    encoding_type
 
195
        Command objects will get a 'outf' attribute, which has been
 
196
        setup to properly handle encoding of unicode strings.
 
197
        encoding_type determines what will happen when characters cannot
 
198
        be encoded
 
199
            strict - abort if we cannot decode
 
200
            replace - put in a bogus character (typically '?')
 
201
            exact - do not encode sys.stdout
 
202
 
192
203
    """
193
204
    aliases = []
194
205
    takes_args = []
195
206
    takes_options = []
 
207
    encoding_type = 'strict'
196
208
 
197
209
    hidden = False
198
210
    
213
225
            r[o.name] = o
214
226
        return r
215
227
 
 
228
    def _setup_outf(self):
 
229
        """Return a file linked to stdout, which has proper encoding."""
 
230
        assert self.encoding_type in ['strict', 'exact', 'replace']
 
231
 
 
232
        # Originally I was using self.stdout, but that looks
 
233
        # *way* too much like sys.stdout
 
234
        if self.encoding_type == 'exact':
 
235
            self.outf = sys.stdout
 
236
            return
 
237
 
 
238
        output_encoding = getattr(sys.stdout, 'encoding', None)
 
239
        if not output_encoding:
 
240
            input_encoding = getattr(sys.stdin, 'encoding', None)
 
241
            if not input_encoding:
 
242
                output_encoding = bzrlib.user_encoding
 
243
                mutter('encoding stdout as bzrlib.user_encoding %r', output_encoding)
 
244
            else:
 
245
                output_encoding = input_encoding
 
246
                mutter('encoding stdout as sys.stdin encoding %r', output_encoding)
 
247
        else:
 
248
            mutter('encoding stdout as sys.stdout encoding %r', output_encoding)
 
249
 
 
250
        # use 'replace' so that we don't abort if trying to write out
 
251
        # in e.g. the default C locale.
 
252
        self.outf = codecs.getwriter(output_encoding)(sys.stdout, errors=self.encoding_type)
 
253
        # For whatever reason codecs.getwriter() does not advertise its encoding
 
254
        # it just returns the encoding of the wrapped file, which is completely
 
255
        # bogus. So set the attribute, so we can find the correct encoding later.
 
256
        self.outf.encoding = output_encoding
 
257
 
216
258
    @deprecated_method(zero_eight)
217
259
    def run_argv(self, argv):
218
260
        """Parse command line and run.
243
285
        all_cmd_args = cmdargs.copy()
244
286
        all_cmd_args.update(cmdopts)
245
287
 
 
288
        self._setup_outf()
 
289
 
246
290
        return self.run(**all_cmd_args)
247
291
    
248
292
    def run(self):
268
312
    def name(self):
269
313
        return _unsquish_command_name(self.__class__.__name__)
270
314
 
 
315
    def plugin_name(self):
 
316
        """Get the name of the plugin that provides this command.
 
317
 
 
318
        :return: The name of the plugin or None if the command is builtin.
 
319
        """
 
320
        mod_parts = self.__module__.split('.')
 
321
        if len(mod_parts) >= 3 and mod_parts[1] == 'plugins':
 
322
            return mod_parts[2]
 
323
        else:
 
324
            return None
 
325
 
271
326
 
272
327
def parse_spec(spec):
273
328
    """
507
562
    
508
563
    argv
509
564
       The command-line arguments, without the program name from argv[0]
 
565
       These should already be decoded. All library/test code calling
 
566
       run_bzr should be passing valid strings (don't need decoding).
510
567
    
511
568
    Returns a command status or raises an exception.
512
569
 
529
586
    --lsprof
530
587
        Run under the Python lsprof profiler.
531
588
    """
532
 
    argv = [a.decode(bzrlib.user_encoding) for a in argv]
 
589
    argv = list(argv)
533
590
 
534
591
    opt_lsprof = opt_profile = opt_no_plugins = opt_builtin =  \
535
592
                opt_no_aliases = False
633
690
    from bzrlib.ui.text import TextUIFactory
634
691
    ## bzrlib.trace.enable_default_logging()
635
692
    bzrlib.ui.ui_factory = TextUIFactory()
636
 
    ret = run_bzr_catch_errors(argv[1:])
 
693
 
 
694
    argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]]
 
695
    ret = run_bzr_catch_errors(argv)
637
696
    mutter("return code %d", ret)
638
697
    return ret
639
698