~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: John Arbash Meinel
  • Date: 2010-02-17 17:11:16 UTC
  • mfrom: (4797.2.17 2.1)
  • mto: (4797.2.18 2.1)
  • mto: This revision was merged to the branch mainline in revision 5055.
  • Revision ID: john@arbash-meinel.com-20100217171116-h7t9223ystbnx5h8
merge bzr.2.1 in preparation for NEWS entry.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2008 Canonical Ltd
 
1
# Copyright (C) 2005-2010 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,
43
44
    debug,
44
45
    errors,
45
46
    option,
46
47
    osutils,
47
48
    trace,
 
49
    ui,
48
50
    win32utils,
49
51
    )
50
52
""")
56
58
from bzrlib.symbol_versioning import (
57
59
    deprecated_function,
58
60
    deprecated_in,
 
61
    deprecated_method,
59
62
    suppress_deprecation_warnings,
60
63
    )
61
64
 
382
385
            warn("No help message set for %r" % self)
383
386
        # List of standard options directly supported
384
387
        self.supported_std_options = []
385
 
 
 
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)))
386
411
    def _maybe_expand_globs(self, file_list):
387
412
        """Glob expand file_list if the platform does not do that itself.
388
413
 
 
414
        Not used anymore, now that the bzr command-line parser globs on
 
415
        Windows.
 
416
 
389
417
        :return: A possibly empty list of unicode paths.
390
418
 
391
419
        Introduced in bzrlib 0.18.
392
420
        """
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)
 
421
        return file_list
398
422
 
399
423
    def _usage(self):
400
424
        """Return single-line grammar for this command.
509
533
                        # so don't create a real link
510
534
                        see_also_links.append(item)
511
535
                    else:
512
 
                        # Use a reST link for this entry
513
 
                        see_also_links.append("`%s`_" % (item,))
 
536
                        # Use a Sphinx link for this entry
 
537
                        link_text = ":doc:`%s <%s-help>`" % (item, item)
 
538
                        see_also_links.append(link_text)
514
539
                see_also = see_also_links
515
540
            result += ':See also: '
516
541
            result += ', '.join(see_also) + '\n'
594
619
 
595
620
    def _setup_outf(self):
596
621
        """Return a file linked to stdout, which has proper encoding."""
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
 
622
        self.outf = ui.ui_factory.make_output_stream(
 
623
            encoding_type=self.encoding_type)
617
624
 
618
625
    def run_argv_aliases(self, argv, alias_argv=None):
619
626
        """Parse the command line and run with extra aliases in alias_argv."""
651
658
 
652
659
        self._setup_outf()
653
660
 
654
 
        return self.run(**all_cmd_args)
 
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)
655
666
 
656
667
    def run(self):
657
668
        """Actually run the command.
939
950
 
940
951
    --coverage
941
952
        Generate line coverage report in the specified directory.
 
953
 
 
954
    --concurrency
 
955
        Specify the number of processes that can be run concurrently (selftest).
942
956
    """
 
957
    trace.mutter("bazaar version: " + bzrlib.__version__)
943
958
    argv = list(argv)
944
959
    trace.mutter("bzr arguments: %r", argv)
945
960
 
969
984
            opt_no_aliases = True
970
985
        elif a == '--builtin':
971
986
            opt_builtin = True
 
987
        elif a == '--concurrency':
 
988
            os.environ['BZR_CONCURRENCY'] = argv[i + 1]
 
989
            i += 1
972
990
        elif a == '--coverage':
973
991
            opt_coverage_dir = argv[i + 1]
974
992
            i += 1
1113
1131
            raise errors.BzrError("argv should be list of unicode strings.")
1114
1132
        argv = new_argv
1115
1133
    ret = run_bzr_catch_errors(argv)
 
1134
    bzrlib.ui.ui_factory.log_transport_activity(
 
1135
        display=('bytes' in debug.debug_flags))
1116
1136
    trace.mutter("return code %d", ret)
1117
1137
    osutils.report_extension_load_failures()
1118
1138
    return ret