~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: John Arbash Meinel
  • Date: 2010-08-02 22:07:54 UTC
  • mto: This revision was merged to the branch mainline in revision 5393.
  • Revision ID: john@arbash-meinel.com-20100802220754-jvtkt7dtuwon2gdk
id_index size drops to 230kB with StaticTuples.
Even better, though, is that using StaticTuple in the parser gives us
an overall benefit of about 20%. It isn't our biggest data use, but
it is something, at least.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
from bzrlib.lazy_import import lazy_import
22
22
lazy_import(globals(), """
 
23
import codecs
23
24
import cStringIO
24
25
import sys
25
26
import time
32
33
    bzrdir,
33
34
    directory_service,
34
35
    delta,
35
 
    config as _mod_config,
 
36
    config,
36
37
    errors,
37
38
    globbing,
38
39
    hooks,
1477
1478
class cmd_remove(Command):
1478
1479
    __doc__ = """Remove files or directories.
1479
1480
 
1480
 
    This makes Bazaar stop tracking changes to the specified files. Bazaar will
1481
 
    delete them if they can easily be recovered using revert otherwise they
1482
 
    will be backed up (adding an extention of the form .~#~). If no options or
1483
 
    parameters are given Bazaar will scan for files that are being tracked by
1484
 
    Bazaar but missing in your tree and stop tracking them for you.
 
1481
    This makes bzr stop tracking changes to the specified files. bzr will delete
 
1482
    them if they can easily be recovered using revert. If no options or
 
1483
    parameters are given bzr will scan for files that are being tracked by bzr
 
1484
    but missing in your tree and stop tracking them for you.
1485
1485
    """
1486
1486
    takes_args = ['file*']
1487
1487
    takes_options = ['verbose',
1489
1489
        RegistryOption.from_kwargs('file-deletion-strategy',
1490
1490
            'The file deletion mode to be used.',
1491
1491
            title='Deletion Strategy', value_switches=True, enum_switch=False,
1492
 
            safe='Backup changed files (default).',
 
1492
            safe='Only delete files if they can be'
 
1493
                 ' safely recovered (default).',
1493
1494
            keep='Delete from bzr but leave the working copy.',
1494
1495
            force='Delete all the specified files, even if they can not be '
1495
1496
                'recovered and even if they are non-empty directories.')]
1592
1593
 
1593
1594
    _see_also = ['check']
1594
1595
    takes_args = ['branch?']
1595
 
    takes_options = [
1596
 
        Option('canonicalize-chks',
1597
 
               help='Make sure CHKs are in canonical form (repairs '
1598
 
                    'bug 522637).',
1599
 
               hidden=True),
1600
 
        ]
1601
1596
 
1602
 
    def run(self, branch=".", canonicalize_chks=False):
 
1597
    def run(self, branch="."):
1603
1598
        from bzrlib.reconcile import reconcile
1604
1599
        dir = bzrdir.BzrDir.open(branch)
1605
 
        reconcile(dir, canonicalize_chks=canonicalize_chks)
 
1600
        reconcile(dir)
1606
1601
 
1607
1602
 
1608
1603
class cmd_revision_history(Command):
1884
1879
        Same as 'bzr diff' but prefix paths with old/ and new/::
1885
1880
 
1886
1881
            bzr diff --prefix old/:new/
1887
 
            
1888
 
        Show the differences using a custom diff program with options::
1889
 
        
1890
 
            bzr diff --using /usr/bin/diff --diff-options -wu
1891
1882
    """
1892
1883
    _see_also = ['status']
1893
1884
    takes_args = ['file*']
1894
1885
    takes_options = [
1895
1886
        Option('diff-options', type=str,
1896
 
               help='Pass these options to the external diff program.'),
 
1887
               help='Pass these options to the diff program.'),
1897
1888
        Option('prefix', type=str,
1898
1889
               short_name='p',
1899
1890
               help='Set prefixes added to old and new filenames, as '
1940
1931
                '--prefix expects two values separated by a colon'
1941
1932
                ' (eg "old/:new/")')
1942
1933
 
 
1934
        if using is not None and diff_options is not None:
 
1935
            raise errors.BzrCommandError(
 
1936
            '--diff-options and --using are mutually exclusive.')
 
1937
 
1943
1938
        if revision and len(revision) > 2:
1944
1939
            raise errors.BzrCommandError('bzr diff --revision takes exactly'
1945
1940
                                         ' one or two revision specifiers')
2694
2689
                "NAME_PATTERN or --default-rules.")
2695
2690
        name_pattern_list = [globbing.normalize_pattern(p)
2696
2691
                             for p in name_pattern_list]
2697
 
        bad_patterns = ''
2698
 
        for p in name_pattern_list:
2699
 
            if not globbing.Globster.is_pattern_valid(p):
2700
 
                bad_patterns += ('\n  %s' % p)
2701
 
        if bad_patterns:
2702
 
            msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2703
 
            ui.ui_factory.show_error(msg)
2704
 
            raise errors.InvalidPattern('')
2705
2692
        for name_pattern in name_pattern_list:
2706
2693
            if (name_pattern[0] == '/' or
2707
2694
                (len(name_pattern) > 1 and name_pattern[1] == ':')):
3140
3127
        def get_message(commit_obj):
3141
3128
            """Callback to get commit message"""
3142
3129
            if file:
3143
 
                f = open(file)
 
3130
                f = codecs.open(file, 'rt', osutils.get_user_encoding())
3144
3131
                try:
3145
 
                    my_message = f.read().decode(osutils.get_user_encoding())
 
3132
                    my_message = f.read()
3146
3133
                finally:
3147
3134
                    f.close()
3148
3135
            elif message is not None:
3322
3309
                try:
3323
3310
                    c = Branch.open_containing(u'.')[0].get_config()
3324
3311
                except errors.NotBranchError:
3325
 
                    c = _mod_config.GlobalConfig()
 
3312
                    c = config.GlobalConfig()
3326
3313
            else:
3327
3314
                c = Branch.open(directory).get_config()
3328
3315
            if email:
3333
3320
 
3334
3321
        # display a warning if an email address isn't included in the given name.
3335
3322
        try:
3336
 
            _mod_config.extract_email_address(name)
 
3323
            config.extract_email_address(name)
3337
3324
        except errors.NoEmailInUsername, e:
3338
3325
            warning('"%s" does not seem to contain an email address.  '
3339
3326
                    'This is allowed, but not recommended.', name)
3345
3332
            else:
3346
3333
                c = Branch.open(directory).get_config()
3347
3334
        else:
3348
 
            c = _mod_config.GlobalConfig()
 
3335
            c = config.GlobalConfig()
3349
3336
        c.set_user_option('email', name)
3350
3337
 
3351
3338
 
3418
3405
                'bzr alias --remove expects an alias to remove.')
3419
3406
        # If alias is not found, print something like:
3420
3407
        # unalias: foo: not found
3421
 
        c = _mod_config.GlobalConfig()
 
3408
        c = config.GlobalConfig()
3422
3409
        c.unset_alias(alias_name)
3423
3410
 
3424
3411
    @display_command
3425
3412
    def print_aliases(self):
3426
3413
        """Print out the defined aliases in a similar format to bash."""
3427
 
        aliases = _mod_config.GlobalConfig().get_aliases()
 
3414
        aliases = config.GlobalConfig().get_aliases()
3428
3415
        for key, value in sorted(aliases.iteritems()):
3429
3416
            self.outf.write('bzr alias %s="%s"\n' % (key, value))
3430
3417
 
3440
3427
 
3441
3428
    def set_alias(self, alias_name, alias_command):
3442
3429
        """Save the alias in the global config."""
3443
 
        c = _mod_config.GlobalConfig()
 
3430
        c = config.GlobalConfig()
3444
3431
        c.set_alias(alias_name, alias_command)
3445
3432
 
3446
3433
 
3519
3506
                                 'throughout the test suite.',
3520
3507
                            type=get_transport_type),
3521
3508
                     Option('benchmark',
3522
 
                            help='Run the benchmarks rather than selftests.',
3523
 
                            hidden=True),
 
3509
                            help='Run the benchmarks rather than selftests.'),
3524
3510
                     Option('lsprof-timed',
3525
3511
                            help='Generate lsprof output for benchmarked'
3526
3512
                                 ' sections of code.'),
3527
3513
                     Option('lsprof-tests',
3528
3514
                            help='Generate lsprof output for each test.'),
 
3515
                     Option('cache-dir', type=str,
 
3516
                            help='Cache intermediate benchmark output in this '
 
3517
                                 'directory.'),
3529
3518
                     Option('first',
3530
3519
                            help='Run all tests, but run specified tests first.',
3531
3520
                            short_name='f',
3565
3554
 
3566
3555
    def run(self, testspecs_list=None, verbose=False, one=False,
3567
3556
            transport=None, benchmark=None,
3568
 
            lsprof_timed=None,
 
3557
            lsprof_timed=None, cache_dir=None,
3569
3558
            first=False, list_only=False,
3570
3559
            randomize=None, exclude=None, strict=False,
3571
3560
            load_list=None, debugflag=None, starting_with=None, subunit=False,
3572
3561
            parallel=None, lsprof_tests=False):
3573
 
        from bzrlib import tests
3574
 
 
 
3562
        from bzrlib.tests import selftest
 
3563
        import bzrlib.benchmarks as benchmarks
 
3564
        from bzrlib.benchmarks import tree_creator
 
3565
 
 
3566
        # Make deprecation warnings visible, unless -Werror is set
 
3567
        symbol_versioning.activate_deprecation_warnings(override=False)
 
3568
 
 
3569
        if cache_dir is not None:
 
3570
            tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3575
3571
        if testspecs_list is not None:
3576
3572
            pattern = '|'.join(testspecs_list)
3577
3573
        else:
3596
3592
            self.additional_selftest_args.setdefault(
3597
3593
                'suite_decorators', []).append(parallel)
3598
3594
        if benchmark:
3599
 
            raise errors.BzrCommandError(
3600
 
                "--benchmark is no longer supported from bzr 2.2; "
3601
 
                "use bzr-usertest instead")
3602
 
        test_suite_factory = None
 
3595
            test_suite_factory = benchmarks.test_suite
 
3596
            # Unless user explicitly asks for quiet, be verbose in benchmarks
 
3597
            verbose = not is_quiet()
 
3598
            # TODO: should possibly lock the history file...
 
3599
            benchfile = open(".perf_history", "at", buffering=1)
 
3600
            self.add_cleanup(benchfile.close)
 
3601
        else:
 
3602
            test_suite_factory = None
 
3603
            benchfile = None
3603
3604
        selftest_kwargs = {"verbose": verbose,
3604
3605
                          "pattern": pattern,
3605
3606
                          "stop_on_failure": one,
3607
3608
                          "test_suite_factory": test_suite_factory,
3608
3609
                          "lsprof_timed": lsprof_timed,
3609
3610
                          "lsprof_tests": lsprof_tests,
 
3611
                          "bench_history": benchfile,
3610
3612
                          "matching_tests_first": first,
3611
3613
                          "list_only": list_only,
3612
3614
                          "random_seed": randomize,
3617
3619
                          "starting_with": starting_with
3618
3620
                          }
3619
3621
        selftest_kwargs.update(self.additional_selftest_args)
3620
 
 
3621
 
        # Make deprecation warnings visible, unless -Werror is set
3622
 
        cleanup = symbol_versioning.activate_deprecation_warnings(
3623
 
            override=False)
3624
 
        try:
3625
 
            result = tests.selftest(**selftest_kwargs)
3626
 
        finally:
3627
 
            cleanup()
 
3622
        result = selftest(**selftest_kwargs)
3628
3623
        return int(not result)
3629
3624
 
3630
3625
 
4811
4806
 
4812
4807
 
4813
4808
class cmd_break_lock(Command):
4814
 
    __doc__ = """Break a dead lock.
4815
 
 
4816
 
    This command breaks a lock on a repository, branch, working directory or
4817
 
    config file.
 
4809
    __doc__ = """Break a dead lock on a repository, branch or working directory.
4818
4810
 
4819
4811
    CAUTION: Locks should only be broken when you are sure that the process
4820
4812
    holding the lock has been stopped.
4825
4817
    :Examples:
4826
4818
        bzr break-lock
4827
4819
        bzr break-lock bzr+ssh://example.com/bzr/foo
4828
 
        bzr break-lock --conf ~/.bazaar
4829
4820
    """
4830
 
 
4831
4821
    takes_args = ['location?']
4832
 
    takes_options = [
4833
 
        Option('config',
4834
 
               help='LOCATION is the directory where the config lock is.'),
4835
 
        ]
4836
4822
 
4837
 
    def run(self, location=None, config=False):
 
4823
    def run(self, location=None, show=False):
4838
4824
        if location is None:
4839
4825
            location = u'.'
4840
 
        if config:
4841
 
            conf = _mod_config.LockableConfig(file_name=location)
4842
 
            conf.break_lock()
4843
 
        else:
4844
 
            control, relpath = bzrdir.BzrDir.open_containing(location)
4845
 
            try:
4846
 
                control.break_lock()
4847
 
            except NotImplementedError:
4848
 
                pass
 
4826
        control, relpath = bzrdir.BzrDir.open_containing(location)
 
4827
        try:
 
4828
            control.break_lock()
 
4829
        except NotImplementedError:
 
4830
            pass
4849
4831
 
4850
4832
 
4851
4833
class cmd_wait_until_signalled(Command):