~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Vincent Ladeuil
  • Date: 2010-10-13 08:01:36 UTC
  • mfrom: (5447.5.1 config-read)
  • mto: This revision was merged to the branch mainline in revision 5499.
  • Revision ID: v.ladeuil+lp@free.fr-20101013080136-7o5qbbwgxhgncsj8
Merge config-read into config-modify

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
from bzrlib.lazy_import import lazy_import
22
22
lazy_import(globals(), """
23
23
import cStringIO
 
24
import itertools
 
25
import re
24
26
import sys
25
27
import time
26
28
 
250
252
    To skip the display of pending merge information altogether, use
251
253
    the no-pending option or specify a file/directory.
252
254
 
253
 
    If a revision argument is given, the status is calculated against
254
 
    that revision, or between two revisions if two are provided.
 
255
    To compare the working directory to a specific revision, pass a
 
256
    single revision to the revision argument.
 
257
 
 
258
    To see which files have changed in a specific revision, or between
 
259
    two revisions, pass a revision range to the revision argument.
 
260
    This will produce the same results as calling 'bzr diff --summarize'.
255
261
    """
256
262
 
257
263
    # TODO: --no-recurse, --recurse options
923
929
                 "branch.  Local pulls are not applied to "
924
930
                 "the master branch."
925
931
            ),
 
932
        Option('show-base',
 
933
            help="Show base revision text in conflicts.")
926
934
        ]
927
935
    takes_args = ['location?']
928
936
    encoding_type = 'replace'
929
937
 
930
938
    def run(self, location=None, remember=False, overwrite=False,
931
939
            revision=None, verbose=False,
932
 
            directory=None, local=False):
 
940
            directory=None, local=False,
 
941
            show_base=False):
933
942
        # FIXME: too much stuff is in the command class
934
943
        revision_id = None
935
944
        mergeable = None
944
953
            branch_to = Branch.open_containing(directory)[0]
945
954
            self.add_cleanup(branch_to.lock_write().unlock)
946
955
 
 
956
        if tree_to is None and show_base:
 
957
            raise errors.BzrCommandError("Need working tree for --show-base.")
 
958
 
947
959
        if local and not branch_to.get_bound_location():
948
960
            raise errors.LocalRequiresBoundBranch()
949
961
 
994
1006
                view_info=view_info)
995
1007
            result = tree_to.pull(
996
1008
                branch_from, overwrite, revision_id, change_reporter,
997
 
                possible_transports=possible_transports, local=local)
 
1009
                possible_transports=possible_transports, local=local,
 
1010
                show_base=show_base)
998
1011
        else:
999
1012
            result = branch_to.pull(
1000
1013
                branch_from, overwrite, revision_id, local=local)
1056
1069
        Option('strict',
1057
1070
               help='Refuse to push if there are uncommitted changes in'
1058
1071
               ' the working tree, --no-strict disables the check.'),
 
1072
        Option('no-tree',
 
1073
               help="Don't populate the working tree, even for protocols"
 
1074
               " that support it."),
1059
1075
        ]
1060
1076
    takes_args = ['location?']
1061
1077
    encoding_type = 'replace'
1063
1079
    def run(self, location=None, remember=False, overwrite=False,
1064
1080
        create_prefix=False, verbose=False, revision=None,
1065
1081
        use_existing_dir=False, directory=None, stacked_on=None,
1066
 
        stacked=False, strict=None):
 
1082
        stacked=False, strict=None, no_tree=False):
1067
1083
        from bzrlib.push import _show_push_branch
1068
1084
 
1069
1085
        if directory is None:
1115
1131
        _show_push_branch(br_from, revision_id, location, self.outf,
1116
1132
            verbose=verbose, overwrite=overwrite, remember=remember,
1117
1133
            stacked_on=stacked_on, create_prefix=create_prefix,
1118
 
            use_existing_dir=use_existing_dir)
 
1134
            use_existing_dir=use_existing_dir, no_tree=no_tree)
1119
1135
 
1120
1136
 
1121
1137
class cmd_branch(Command):
1363
1379
 
1364
1380
    _see_also = ['pull', 'working-trees', 'status-flags']
1365
1381
    takes_args = ['dir?']
1366
 
    takes_options = ['revision']
 
1382
    takes_options = ['revision',
 
1383
                     Option('show-base',
 
1384
                            help="Show base revision text in conflicts."),
 
1385
                     ]
1367
1386
    aliases = ['up']
1368
1387
 
1369
 
    def run(self, dir='.', revision=None):
 
1388
    def run(self, dir='.', revision=None, show_base=None):
1370
1389
        if revision is not None and len(revision) != 1:
1371
1390
            raise errors.BzrCommandError(
1372
1391
                        "bzr update --revision takes exactly one revision")
1412
1431
                change_reporter,
1413
1432
                possible_transports=possible_transports,
1414
1433
                revision=revision_id,
1415
 
                old_tip=old_tip)
 
1434
                old_tip=old_tip,
 
1435
                show_base=show_base)
1416
1436
        except errors.NoSuchRevision, e:
1417
1437
            raise errors.BzrCommandError(
1418
1438
                                  "branch has no revision %s\n"
1494
1514
            title='Deletion Strategy', value_switches=True, enum_switch=False,
1495
1515
            safe='Backup changed files (default).',
1496
1516
            keep='Delete from bzr but leave the working copy.',
 
1517
            no_backup='Don\'t backup changed files.',
1497
1518
            force='Delete all the specified files, even if they can not be '
1498
 
                'recovered and even if they are non-empty directories.')]
 
1519
                'recovered and even if they are non-empty directories. '
 
1520
                '(deprecated, use no-backup)')]
1499
1521
    aliases = ['rm', 'del']
1500
1522
    encoding_type = 'replace'
1501
1523
 
1502
1524
    def run(self, file_list, verbose=False, new=False,
1503
1525
        file_deletion_strategy='safe'):
 
1526
        if file_deletion_strategy == 'force':
 
1527
            note("(The --force option is deprecated, rather use --no-backup "
 
1528
                "in future.)")
 
1529
            file_deletion_strategy = 'no-backup'
 
1530
 
1504
1531
        tree, file_list = WorkingTree.open_containing_paths(file_list)
1505
1532
 
1506
1533
        if file_list is not None:
1527
1554
            file_deletion_strategy = 'keep'
1528
1555
        tree.remove(file_list, verbose=verbose, to_file=self.outf,
1529
1556
            keep_files=file_deletion_strategy=='keep',
1530
 
            force=file_deletion_strategy=='force')
 
1557
            force=(file_deletion_strategy=='no-backup'))
1531
1558
 
1532
1559
 
1533
1560
class cmd_file_id(Command):
1688
1715
                ),
1689
1716
         Option('append-revisions-only',
1690
1717
                help='Never change revnos or the existing log.'
1691
 
                '  Append revisions to it only.')
 
1718
                '  Append revisions to it only.'),
 
1719
         Option('no-tree',
 
1720
                'Create a branch without a working tree.')
1692
1721
         ]
1693
1722
    def run(self, location=None, format=None, append_revisions_only=False,
1694
 
            create_prefix=False):
 
1723
            create_prefix=False, no_tree=False):
1695
1724
        if format is None:
1696
1725
            format = bzrdir.format_registry.make_bzrdir('default')
1697
1726
        if location is None:
1720
1749
        except errors.NotBranchError:
1721
1750
            # really a NotBzrDir error...
1722
1751
            create_branch = bzrdir.BzrDir.create_branch_convenience
 
1752
            if no_tree:
 
1753
                force_new_tree = False
 
1754
            else:
 
1755
                force_new_tree = None
1723
1756
            branch = create_branch(to_transport.base, format=format,
1724
 
                                   possible_transports=[to_transport])
 
1757
                                   possible_transports=[to_transport],
 
1758
                                   force_new_tree=force_new_tree)
1725
1759
            a_bzrdir = branch.bzrdir
1726
1760
        else:
1727
1761
            from bzrlib.transport.local import LocalTransport
1731
1765
                        raise errors.BranchExistsWithoutWorkingTree(location)
1732
1766
                raise errors.AlreadyBranchError(location)
1733
1767
            branch = a_bzrdir.create_branch()
1734
 
            a_bzrdir.create_workingtree()
 
1768
            if not no_tree:
 
1769
                a_bzrdir.create_workingtree()
1735
1770
        if append_revisions_only:
1736
1771
            try:
1737
1772
                branch.set_append_revisions_only(True)
4841
4876
    takes_options = [
4842
4877
        Option('config',
4843
4878
               help='LOCATION is the directory where the config lock is.'),
 
4879
        Option('force',
 
4880
            help='Do not ask for confirmation before breaking the lock.'),
4844
4881
        ]
4845
4882
 
4846
 
    def run(self, location=None, config=False):
 
4883
    def run(self, location=None, config=False, force=False):
4847
4884
        if location is None:
4848
4885
            location = u'.'
 
4886
        if force:
 
4887
            ui.ui_factory = ui.ConfirmationUserInterfacePolicy(ui.ui_factory,
 
4888
                None,
 
4889
                {'bzrlib.lockdir.break': True})
4849
4890
        if config:
4850
4891
            conf = _mod_config.LockableConfig(file_name=location)
4851
4892
            conf.break_lock()
5347
5388
            if tag_name is None:
5348
5389
                raise errors.BzrCommandError("No tag specified to delete.")
5349
5390
            branch.tags.delete_tag(tag_name)
5350
 
            self.outf.write('Deleted tag %s.\n' % tag_name)
 
5391
            note('Deleted tag %s.' % tag_name)
5351
5392
        else:
5352
5393
            if revision:
5353
5394
                if len(revision) != 1:
5365
5406
            if (not force) and branch.tags.has_tag(tag_name):
5366
5407
                raise errors.TagAlreadyExists(tag_name)
5367
5408
            branch.tags.set_tag(tag_name, revision_id)
5368
 
            self.outf.write('Created tag %s.\n' % tag_name)
 
5409
            note('Created tag %s.' % tag_name)
5369
5410
 
5370
5411
 
5371
5412
class cmd_tags(Command):
5380
5421
            help='Branch whose tags should be displayed.'),
5381
5422
        RegistryOption.from_kwargs('sort',
5382
5423
            'Sort tags by different criteria.', title='Sorting',
5383
 
            alpha='Sort tags lexicographically (default).',
 
5424
            natural='Sort numeric substrings as numbers:'
 
5425
                    ' suitable for version numbers. (default)',
 
5426
            alpha='Sort tags lexicographically.',
5384
5427
            time='Sort tags chronologically.',
5385
5428
            ),
5386
5429
        'show-ids',
5390
5433
    @display_command
5391
5434
    def run(self,
5392
5435
            directory='.',
5393
 
            sort='alpha',
 
5436
            sort='natural',
5394
5437
            show_ids=False,
5395
5438
            revision=None,
5396
5439
            ):
5408
5451
            # only show revisions between revid1 and revid2 (inclusive)
5409
5452
            tags = [(tag, revid) for tag, revid in tags if
5410
5453
                graph.is_between(revid, revid1, revid2)]
5411
 
        if sort == 'alpha':
 
5454
        if sort == 'natural':
 
5455
            def natural_sort_key(tag):
 
5456
                return [f(s) for f,s in 
 
5457
                        zip(itertools.cycle((unicode.lower,int)),
 
5458
                                            re.split('([0-9]+)', tag[0]))]
 
5459
            tags.sort(key=natural_sort_key)
 
5460
        elif sort == 'alpha':
5412
5461
            tags.sort()
5413
5462
        elif sort == 'time':
5414
5463
            timestamps = {}