~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-11-19 16:41:31 UTC
  • mfrom: (4788.2.2 2.1.0b3-gc-nogil)
  • Revision ID: pqm@pqm.ubuntu.com-20091119164131-pg4ky6zrxe6kpzhq
(jam) Release the gil during some of the core groupcompress code
        paths.

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
""")
385
383
            warn("No help message set for %r" % self)
386
384
        # List of standard options directly supported
387
385
        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
 
        
 
386
 
410
387
    @deprecated_method(deprecated_in((2, 1, 0)))
411
388
    def _maybe_expand_globs(self, file_list):
412
389
        """Glob expand file_list if the platform does not do that itself.
533
510
                        # so don't create a real link
534
511
                        see_also_links.append(item)
535
512
                    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)
 
513
                        # Use a reST link for this entry
 
514
                        see_also_links.append("`%s`_" % (item,))
539
515
                see_also = see_also_links
540
516
            result += ':See also: '
541
517
            result += ', '.join(see_also) + '\n'
619
595
 
620
596
    def _setup_outf(self):
621
597
        """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)
 
598
        # Originally I was using self.stdout, but that looks
 
599
        # *way* too much like sys.stdout
 
600
        if self.encoding_type == 'exact':
 
601
            # force sys.stdout to be binary stream on win32
 
602
            if sys.platform == 'win32':
 
603
                fileno = getattr(sys.stdout, 'fileno', None)
 
604
                if fileno:
 
605
                    import msvcrt
 
606
                    msvcrt.setmode(fileno(), os.O_BINARY)
 
607
            self.outf = sys.stdout
 
608
            return
 
609
 
 
610
        output_encoding = osutils.get_terminal_encoding()
 
611
 
 
612
        self.outf = codecs.getwriter(output_encoding)(sys.stdout,
 
613
                        errors=self.encoding_type)
 
614
        # For whatever reason codecs.getwriter() does not advertise its encoding
 
615
        # it just returns the encoding of the wrapped file, which is completely
 
616
        # bogus. So set the attribute, so we can find the correct encoding later.
 
617
        self.outf.encoding = output_encoding
624
618
 
625
619
    def run_argv_aliases(self, argv, alias_argv=None):
626
620
        """Parse the command line and run with extra aliases in alias_argv."""
658
652
 
659
653
        self._setup_outf()
660
654
 
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
        return self.run(**all_cmd_args)
666
656
 
667
657
    def run(self):
668
658
        """Actually run the command.
950
940
 
951
941
    --coverage
952
942
        Generate line coverage report in the specified directory.
953
 
 
954
 
    --concurrency
955
 
        Specify the number of processes that can be run concurrently (selftest).
956
943
    """
957
 
    trace.mutter("bazaar version: " + bzrlib.__version__)
958
944
    argv = list(argv)
959
945
    trace.mutter("bzr arguments: %r", argv)
960
946
 
984
970
            opt_no_aliases = True
985
971
        elif a == '--builtin':
986
972
            opt_builtin = True
987
 
        elif a == '--concurrency':
988
 
            os.environ['BZR_CONCURRENCY'] = argv[i + 1]
989
 
            i += 1
990
973
        elif a == '--coverage':
991
974
            opt_coverage_dir = argv[i + 1]
992
975
            i += 1
1131
1114
            raise errors.BzrError("argv should be list of unicode strings.")
1132
1115
        argv = new_argv
1133
1116
    ret = run_bzr_catch_errors(argv)
1134
 
    bzrlib.ui.ui_factory.log_transport_activity(
1135
 
        display=('bytes' in debug.debug_flags))
1136
1117
    trace.mutter("return code %d", ret)
1137
1118
    osutils.report_extension_load_failures()
1138
1119
    return ret