~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Jelmer Vernooij
  • Date: 2006-06-13 13:24:40 UTC
  • mfrom: (1767 +trunk)
  • mto: (1769.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1770.
  • Revision ID: jelmer@samba.org-20060613132440-24e222a86f948f60
[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
from bzrlib.errors import (BzrError,
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):
512
556
    
513
557
    argv
514
558
       The command-line arguments, without the program name from argv[0]
 
559
       These should already be decoded. All library/test code calling
 
560
       run_bzr should be passing valid strings (don't need decoding).
515
561
    
516
562
    Returns a command status or raises an exception.
517
563
 
534
580
    --lsprof
535
581
        Run under the Python lsprof profiler.
536
582
    """
537
 
    argv = [a.decode(bzrlib.user_encoding) for a in argv]
 
583
    argv = list(argv)
538
584
 
539
585
    opt_lsprof = opt_profile = opt_no_plugins = opt_builtin =  \
540
586
                opt_no_aliases = False
639
685
    ## bzrlib.trace.enable_default_logging()
640
686
    bzrlib.trace.log_startup(argv)
641
687
    bzrlib.ui.ui_factory = TextUIFactory()
642
 
    ret = run_bzr_catch_errors(argv[1:])
 
688
 
 
689
    argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]]
 
690
    ret = run_bzr_catch_errors(argv)
643
691
    mutter("return code %d", ret)
644
692
    return ret
645
693