~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Jelmer Vernooij
  • Date: 2009-10-27 21:54:26 UTC
  • mfrom: (4771 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4833.
  • Revision ID: jelmer@samba.org-20091027215426-72164bkd4mq9dsd4
merge bzr.dev.

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
 
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.
533
509
                        # so don't create a real link
534
510
                        see_also_links.append(item)
535
511
                    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)
 
512
                        # Use a reST link for this entry
 
513
                        see_also_links.append("`%s`_" % (item,))
539
514
                see_also = see_also_links
540
515
            result += ':See also: '
541
516
            result += ', '.join(see_also) + '\n'
619
594
 
620
595
    def _setup_outf(self):
621
596
        """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)
 
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
624
617
 
625
618
    def run_argv_aliases(self, argv, alias_argv=None):
626
619
        """Parse the command line and run with extra aliases in alias_argv."""
658
651
 
659
652
        self._setup_outf()
660
653
 
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)
 
654
        return self.run(**all_cmd_args)
666
655
 
667
656
    def run(self):
668
657
        """Actually run the command.
950
939
 
951
940
    --coverage
952
941
        Generate line coverage report in the specified directory.
953
 
 
954
 
    --concurrency
955
 
        Specify the number of processes that can be run concurrently (selftest).
956
942
    """
957
 
    trace.mutter("bazaar version: " + bzrlib.__version__)
958
943
    argv = list(argv)
959
944
    trace.mutter("bzr arguments: %r", argv)
960
945
 
984
969
            opt_no_aliases = True
985
970
        elif a == '--builtin':
986
971
            opt_builtin = True
987
 
        elif a == '--concurrency':
988
 
            os.environ['BZR_CONCURRENCY'] = argv[i + 1]
989
 
            i += 1
990
972
        elif a == '--coverage':
991
973
            opt_coverage_dir = argv[i + 1]
992
974
            i += 1
1131
1113
            raise errors.BzrError("argv should be list of unicode strings.")
1132
1114
        argv = new_argv
1133
1115
    ret = run_bzr_catch_errors(argv)
1134
 
    bzrlib.ui.ui_factory.log_transport_activity(
1135
 
        display=('bytes' in debug.debug_flags))
1136
1116
    trace.mutter("return code %d", ret)
1137
1117
    osutils.report_extension_load_failures()
1138
1118
    return ret