~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Joe Julian
  • Date: 2010-01-10 02:25:31 UTC
  • mto: (4634.119.7 2.0)
  • mto: This revision was merged to the branch mainline in revision 4959.
  • Revision ID: joe@julianfamily.org-20100110022531-wqk61rsagz8xsiga
Added MANIFEST.in to allow bdist_rpm to have all the required include files and tools. bdist_rpm will still fail to build correctly on some distributions due to a disttools bug http://bugs.python.org/issue644744

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 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,
 
59
    suppress_deprecation_warnings,
62
60
    )
63
61
 
64
62
 
103
101
            registry.Registry.register(self, k_unsquished, cmd,
104
102
                                       override_existing=decorate, info=info)
105
103
        except KeyError:
106
 
            trace.warning('Two plugins defined the same command: %r' % k)
107
 
            trace.warning('Not loading the one in %r' %
108
 
                sys.modules[cmd.__module__])
109
 
            trace.warning('Previously this command was registered from %r' %
110
 
                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__])
111
109
        return previous
112
110
 
113
111
    def register_lazy(self, command_name, aliases, module_name):
185
183
    return plugin_cmds.keys()
186
184
 
187
185
 
 
186
@deprecated_function(deprecated_in((1, 17, 0)))
 
187
def get_all_cmds(plugins_override=False):
 
188
    """Return canonical name and class for most commands.
 
189
    
 
190
    NB: This does not return all commands since the introduction of
 
191
    command hooks, and returning the class is not sufficient to 
 
192
    get correctly setup commands, which is why it is deprecated.
 
193
 
 
194
    Use 'all_command_names' + 'get_cmd_object' instead.
 
195
    """
 
196
    d = _builtin_commands()
 
197
    if plugins_override:
 
198
        d.update(plugin_cmds.iteritems())
 
199
    for k, v in d.iteritems():
 
200
        yield k,v
 
201
 
 
202
 
188
203
def get_cmd_object(cmd_name, plugins_override=True):
189
204
    """Return the command object for a command.
190
205
 
367
382
            warn("No help message set for %r" % self)
368
383
        # List of standard options directly supported
369
384
        self.supported_std_options = []
370
 
        self._operation = cleanup.OperationWithCleanups(self.run)
371
 
    
372
 
    def add_cleanup(self, cleanup_func, *args, **kwargs):
373
 
        """Register a function to call after self.run returns or raises.
374
 
 
375
 
        Functions will be called in LIFO order.
376
 
        """
377
 
        self._operation.add_cleanup(cleanup_func, *args, **kwargs)
378
 
 
379
 
    def cleanup_now(self):
380
 
        """Execute and empty pending cleanup functions immediately.
381
 
 
382
 
        After cleanup_now all registered cleanups are forgotten.  add_cleanup
383
 
        may be called again after cleanup_now; these cleanups will be called
384
 
        after self.run returns or raises (or when cleanup_now is next called).
385
 
 
386
 
        This is useful for releasing expensive or contentious resources (such
387
 
        as write locks) before doing further work that does not require those
388
 
        resources (such as writing results to self.outf).
389
 
        """
390
 
        self._operation.cleanup_now()
391
 
        
392
 
    @deprecated_method(deprecated_in((2, 1, 0)))
 
385
 
393
386
    def _maybe_expand_globs(self, file_list):
394
387
        """Glob expand file_list if the platform does not do that itself.
395
388
 
396
 
        Not used anymore, now that the bzr command-line parser globs on
397
 
        Windows.
398
 
 
399
389
        :return: A possibly empty list of unicode paths.
400
390
 
401
391
        Introduced in bzrlib 0.18.
402
392
        """
403
 
        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)
404
398
 
405
399
    def _usage(self):
406
400
        """Return single-line grammar for this command.
515
509
                        # so don't create a real link
516
510
                        see_also_links.append(item)
517
511
                    else:
518
 
                        # Use a Sphinx link for this entry
519
 
                        link_text = ":doc:`%s <%s-help>`" % (item, item)
520
 
                        see_also_links.append(link_text)
 
512
                        # Use a reST link for this entry
 
513
                        see_also_links.append("`%s`_" % (item,))
521
514
                see_also = see_also_links
522
515
            result += ':See also: '
523
516
            result += ', '.join(see_also) + '\n'
601
594
 
602
595
    def _setup_outf(self):
603
596
        """Return a file linked to stdout, which has proper encoding."""
604
 
        self.outf = ui.ui_factory.make_output_stream(
605
 
            encoding_type=self.encoding_type)
 
597
        # Originally I was using self.stdout, but that looks
 
598
        # *way* too much like sys.stdout
 
599
        if self.encoding_type == 'exact':
 
600
            # force sys.stdout to be binary stream on win32
 
601
            if sys.platform == 'win32':
 
602
                fileno = getattr(sys.stdout, 'fileno', None)
 
603
                if fileno:
 
604
                    import msvcrt
 
605
                    msvcrt.setmode(fileno(), os.O_BINARY)
 
606
            self.outf = sys.stdout
 
607
            return
 
608
 
 
609
        output_encoding = osutils.get_terminal_encoding()
 
610
 
 
611
        self.outf = codecs.getwriter(output_encoding)(sys.stdout,
 
612
                        errors=self.encoding_type)
 
613
        # For whatever reason codecs.getwriter() does not advertise its encoding
 
614
        # it just returns the encoding of the wrapped file, which is completely
 
615
        # bogus. So set the attribute, so we can find the correct encoding later.
 
616
        self.outf.encoding = output_encoding
606
617
 
607
618
    def run_argv_aliases(self, argv, alias_argv=None):
608
619
        """Parse the command line and run with extra aliases in alias_argv."""
 
620
        if argv is None:
 
621
            warn("Passing None for [] is deprecated from bzrlib 0.10",
 
622
                 DeprecationWarning, stacklevel=2)
 
623
            argv = []
609
624
        args, opts = parse_args(self, argv, alias_argv)
610
625
 
611
626
        # Process the standard options
636
651
 
637
652
        self._setup_outf()
638
653
 
639
 
        return self.run_direct(**all_cmd_args)
640
 
 
641
 
    def run_direct(self, *args, **kwargs):
642
 
        """Call run directly with objects (without parsing an argv list)."""
643
 
        return self._operation.run_simple(*args, **kwargs)
 
654
        return self.run(**all_cmd_args)
644
655
 
645
656
    def run(self):
646
657
        """Actually run the command.
928
939
 
929
940
    --coverage
930
941
        Generate line coverage report in the specified directory.
931
 
 
932
 
    --concurrency
933
 
        Specify the number of processes that can be run concurrently (selftest).
934
942
    """
935
 
    trace.mutter("bazaar version: " + bzrlib.__version__)
936
943
    argv = list(argv)
937
944
    trace.mutter("bzr arguments: %r", argv)
938
945
 
962
969
            opt_no_aliases = True
963
970
        elif a == '--builtin':
964
971
            opt_builtin = True
965
 
        elif a == '--concurrency':
966
 
            os.environ['BZR_CONCURRENCY'] = argv[i + 1]
967
 
            i += 1
968
972
        elif a == '--coverage':
969
973
            opt_coverage_dir = argv[i + 1]
970
974
            i += 1
1031
1035
            ret = apply_coveraged(opt_coverage_dir, run, *run_argv)
1032
1036
        else:
1033
1037
            ret = run(*run_argv)
 
1038
        if 'memory' in debug.debug_flags:
 
1039
            trace.debug_memory('Process status after command:', short=False)
1034
1040
        return ret or 0
1035
1041
    finally:
1036
1042
        # reset, in case we may do other commands later within the same
1037
1043
        # process. Commands that want to execute sub-commands must propagate
1038
1044
        # --verbose in their own way.
1039
 
        if 'memory' in debug.debug_flags:
1040
 
            trace.debug_memory('Process status after command:', short=False)
1041
1045
        option._verbosity_level = saved_verbosity_level
1042
1046
 
1043
1047
 
1077
1081
        "bzr plugin-provider-db check")
1078
1082
 
1079
1083
 
1080
 
 
1081
 
def _specified_or_unicode_argv(argv):
1082
 
    # For internal or testing use, argv can be passed.  Otherwise, get it from
1083
 
    # the process arguments in a unicode-safe way.
 
1084
def main(argv=None):
 
1085
    """Main entry point of command-line interface.
 
1086
 
 
1087
    :param argv: list of unicode command-line arguments similar to sys.argv.
 
1088
        argv[0] is script name usually, it will be ignored.
 
1089
        Don't pass here sys.argv because this list contains plain strings
 
1090
        and not unicode; pass None instead.
 
1091
 
 
1092
    :return: exit code of bzr command.
 
1093
    """
 
1094
    import bzrlib.ui
 
1095
    bzrlib.ui.ui_factory = bzrlib.ui.make_ui_for_terminal(
 
1096
        sys.stdin, sys.stdout, sys.stderr)
 
1097
 
 
1098
    # Is this a final release version? If so, we should suppress warnings
 
1099
    if bzrlib.version_info[3] == 'final':
 
1100
        suppress_deprecation_warnings(override=True)
1084
1101
    if argv is None:
1085
 
        return osutils.get_unicode_argv()
 
1102
        argv = osutils.get_unicode_argv()
1086
1103
    else:
1087
1104
        new_argv = []
1088
1105
        try:
1094
1111
                    new_argv.append(a.decode('ascii'))
1095
1112
        except UnicodeDecodeError:
1096
1113
            raise errors.BzrError("argv should be list of unicode strings.")
1097
 
        return new_argv
1098
 
 
1099
 
 
1100
 
def main(argv=None):
1101
 
    """Main entry point of command-line interface.
1102
 
 
1103
 
    Typically `bzrlib.initialize` should be called first.
1104
 
 
1105
 
    :param argv: list of unicode command-line arguments similar to sys.argv.
1106
 
        argv[0] is script name usually, it will be ignored.
1107
 
        Don't pass here sys.argv because this list contains plain strings
1108
 
        and not unicode; pass None instead.
1109
 
 
1110
 
    :return: exit code of bzr command.
1111
 
    """
1112
 
    argv = _specified_or_unicode_argv(argv)
 
1114
        argv = new_argv
1113
1115
    ret = run_bzr_catch_errors(argv)
1114
 
    bzrlib.ui.ui_factory.log_transport_activity(
1115
 
        display=('bytes' in debug.debug_flags))
1116
1116
    trace.mutter("return code %d", ret)
1117
1117
    return ret
1118
1118
 
1123
1123
    This function assumed that that UI layer is setup, that symbol deprecations
1124
1124
    are already applied, and that unicode decoding has already been performed on argv.
1125
1125
    """
1126
 
    # done here so that they're covered for every test run
1127
1126
    install_bzr_command_hooks()
1128
1127
    return exception_to_return_code(run_bzr, argv)
1129
1128
 
1134
1133
    This is used for the test suite, and might be useful for other programs
1135
1134
    that want to wrap the commandline interface.
1136
1135
    """
1137
 
    # done here so that they're covered for every test run
1138
1136
    install_bzr_command_hooks()
1139
1137
    try:
1140
1138
        return run_bzr(argv)
1190
1188
            yield provider
1191
1189
 
1192
1190
command_providers_registry = ProvidersRegistry()
 
1191
 
 
1192
 
 
1193
if __name__ == '__main__':
 
1194
    sys.exit(main(sys.argv))