~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2009-07-02 03:48:25 UTC
  • mto: This revision was merged to the branch mainline in revision 4502.
  • Revision ID: mbp@sourcefrog.net-20090702034825-2330z69r93a701ws
iter(i) returns i so we don't need a check

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2008, 2009 Canonical Ltd
 
1
# Copyright (C) 2006, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
40
40
 
41
41
import bzrlib
42
42
from bzrlib import (
43
 
    cleanup,
44
43
    debug,
45
44
    errors,
46
45
    option,
47
46
    osutils,
48
47
    trace,
49
 
    ui,
50
48
    win32utils,
51
49
    )
52
50
""")
58
56
from bzrlib.symbol_versioning import (
59
57
    deprecated_function,
60
58
    deprecated_in,
61
 
    deprecated_method,
62
59
    suppress_deprecation_warnings,
63
60
    )
64
61
 
104
101
            registry.Registry.register(self, k_unsquished, cmd,
105
102
                                       override_existing=decorate, info=info)
106
103
        except KeyError:
107
 
            trace.warning('Two plugins defined the same command: %r' % k)
108
 
            trace.warning('Not loading the one in %r' %
109
 
                sys.modules[cmd.__module__])
110
 
            trace.warning('Previously this command was registered from %r' %
111
 
                sys.modules[previous.__module__])
 
104
            trace.log_error('Two plugins defined the same command: %r' % k)
 
105
            trace.log_error('Not loading the one in %r' %
 
106
                            sys.modules[cmd.__module__])
 
107
            trace.log_error('Previously this command was registered from %r' %
 
108
                            sys.modules[previous.__module__])
112
109
        return previous
113
110
 
114
111
    def register_lazy(self, command_name, aliases, module_name):
385
382
            warn("No help message set for %r" % self)
386
383
        # List of standard options directly supported
387
384
        self.supported_std_options = []
388
 
        self._operation = cleanup.OperationWithCleanups(self.run)
389
 
    
390
 
    def add_cleanup(self, cleanup_func, *args, **kwargs):
391
 
        """Register a function to call after self.run returns or raises.
392
 
 
393
 
        Functions will be called in LIFO order.
394
 
        """
395
 
        self._operation.add_cleanup(cleanup_func, *args, **kwargs)
396
 
 
397
 
    def cleanup_now(self):
398
 
        """Execute and empty pending cleanup functions immediately.
399
 
 
400
 
        After cleanup_now all registered cleanups are forgotten.  add_cleanup
401
 
        may be called again after cleanup_now; these cleanups will be called
402
 
        after self.run returns or raises (or when cleanup_now is next called).
403
 
 
404
 
        This is useful for releasing expensive or contentious resources (such
405
 
        as write locks) before doing further work that does not require those
406
 
        resources (such as writing results to self.outf).
407
 
        """
408
 
        self._operation.cleanup_now()
409
 
        
410
 
    @deprecated_method(deprecated_in((2, 1, 0)))
 
385
 
411
386
    def _maybe_expand_globs(self, file_list):
412
387
        """Glob expand file_list if the platform does not do that itself.
413
388
 
414
 
        Not used anymore, now that the bzr command-line parser globs on
415
 
        Windows.
416
 
 
417
389
        :return: A possibly empty list of unicode paths.
418
390
 
419
391
        Introduced in bzrlib 0.18.
420
392
        """
421
 
        return file_list
 
393
        if not file_list:
 
394
            file_list = []
 
395
        if sys.platform == 'win32':
 
396
            file_list = win32utils.glob_expand(file_list)
 
397
        return list(file_list)
422
398
 
423
399
    def _usage(self):
424
400
        """Return single-line grammar for this command.
481
457
        # so we get <https://bugs.launchpad.net/bzr/+bug/249908>.  -- mbp
482
458
        # 20090319
483
459
        options = option.get_optparser(self.options()).format_option_help()
484
 
        # XXX: According to the spec, ReST option lists actually don't support 
485
 
        # options like --1.9 so that causes syntax errors (in Sphinx at least).
486
 
        # As that pattern always appears in the commands that break, we trap
487
 
        # on that and then format that block of 'format' options as a literal
488
 
        # block.
489
 
        if not plain and options.find('  --1.9  ') != -1:
490
 
            options = options.replace(' format:\n', ' format::\n\n', 1)
491
460
        if options.startswith('Options:'):
492
461
            result += ':' + options
493
462
        elif options.startswith('options:'):
533
502
                        # so don't create a real link
534
503
                        see_also_links.append(item)
535
504
                    else:
536
 
                        # Use a Sphinx link for this entry
537
 
                        link_text = ":doc:`%s <%s-help>`" % (item, item)
538
 
                        see_also_links.append(link_text)
 
505
                        # Use a reST link for this entry
 
506
                        see_also_links.append("`%s`_" % (item,))
539
507
                see_also = see_also_links
540
508
            result += ':See also: '
541
509
            result += ', '.join(see_also) + '\n'
619
587
 
620
588
    def _setup_outf(self):
621
589
        """Return a file linked to stdout, which has proper encoding."""
622
 
        self.outf = ui.ui_factory.make_output_stream(
623
 
            encoding_type=self.encoding_type)
 
590
        # Originally I was using self.stdout, but that looks
 
591
        # *way* too much like sys.stdout
 
592
        if self.encoding_type == 'exact':
 
593
            # force sys.stdout to be binary stream on win32
 
594
            if sys.platform == 'win32':
 
595
                fileno = getattr(sys.stdout, 'fileno', None)
 
596
                if fileno:
 
597
                    import msvcrt
 
598
                    msvcrt.setmode(fileno(), os.O_BINARY)
 
599
            self.outf = sys.stdout
 
600
            return
 
601
 
 
602
        output_encoding = osutils.get_terminal_encoding()
 
603
 
 
604
        self.outf = codecs.getwriter(output_encoding)(sys.stdout,
 
605
                        errors=self.encoding_type)
 
606
        # For whatever reason codecs.getwriter() does not advertise its encoding
 
607
        # it just returns the encoding of the wrapped file, which is completely
 
608
        # bogus. So set the attribute, so we can find the correct encoding later.
 
609
        self.outf.encoding = output_encoding
624
610
 
625
611
    def run_argv_aliases(self, argv, alias_argv=None):
626
612
        """Parse the command line and run with extra aliases in alias_argv."""
658
644
 
659
645
        self._setup_outf()
660
646
 
661
 
        return self.run_direct(**all_cmd_args)
662
 
 
663
 
    def run_direct(self, *args, **kwargs):
664
 
        """Call run directly with objects (without parsing an argv list)."""
665
 
        return self._operation.run_simple(*args, **kwargs)
 
647
        return self.run(**all_cmd_args)
666
648
 
667
649
    def run(self):
668
650
        """Actually run the command.
950
932
 
951
933
    --coverage
952
934
        Generate line coverage report in the specified directory.
953
 
 
954
 
    --concurrency
955
 
        Specify the number of processes that can be run concurrently (selftest).
956
935
    """
957
 
    trace.mutter("bazaar version: " + bzrlib.__version__)
958
936
    argv = list(argv)
959
937
    trace.mutter("bzr arguments: %r", argv)
960
938
 
984
962
            opt_no_aliases = True
985
963
        elif a == '--builtin':
986
964
            opt_builtin = True
987
 
        elif a == '--concurrency':
988
 
            os.environ['BZR_CONCURRENCY'] = argv[i + 1]
989
 
            i += 1
990
965
        elif a == '--coverage':
991
966
            opt_coverage_dir = argv[i + 1]
992
967
            i += 1
1053
1028
            ret = apply_coveraged(opt_coverage_dir, run, *run_argv)
1054
1029
        else:
1055
1030
            ret = run(*run_argv)
 
1031
        if 'memory' in debug.debug_flags:
 
1032
            trace.debug_memory('Process status after command:', short=False)
1056
1033
        return ret or 0
1057
1034
    finally:
1058
1035
        # reset, in case we may do other commands later within the same
1059
1036
        # process. Commands that want to execute sub-commands must propagate
1060
1037
        # --verbose in their own way.
1061
 
        if 'memory' in debug.debug_flags:
1062
 
            trace.debug_memory('Process status after command:', short=False)
1063
1038
        option._verbosity_level = saved_verbosity_level
1064
1039
 
1065
1040
 
1115
1090
 
1116
1091
    # Is this a final release version? If so, we should suppress warnings
1117
1092
    if bzrlib.version_info[3] == 'final':
1118
 
        suppress_deprecation_warnings(override=True)
 
1093
        suppress_deprecation_warnings(override=False)
1119
1094
    if argv is None:
1120
1095
        argv = osutils.get_unicode_argv()
1121
1096
    else:
1131
1106
            raise errors.BzrError("argv should be list of unicode strings.")
1132
1107
        argv = new_argv
1133
1108
    ret = run_bzr_catch_errors(argv)
1134
 
    bzrlib.ui.ui_factory.log_transport_activity(
1135
 
        display=('bytes' in debug.debug_flags))
1136
1109
    trace.mutter("return code %d", ret)
1137
 
    osutils.report_extension_load_failures()
1138
1110
    return ret
1139
1111
 
1140
1112