~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

Merged bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
    branch,
31
31
    bundle,
32
32
    bzrdir,
 
33
    delta,
33
34
    config,
34
35
    errors,
35
36
    ignores,
37
38
    merge as _mod_merge,
38
39
    osutils,
39
40
    repository,
 
41
    symbol_versioning,
40
42
    transport,
41
43
    tree as _mod_tree,
42
44
    ui,
51
53
""")
52
54
 
53
55
from bzrlib.commands import Command, display_command
54
 
from bzrlib.option import Option
 
56
from bzrlib.option import Option, RegistryOption
55
57
from bzrlib.progress import DummyProgress, ProgressPhase
56
58
from bzrlib.trace import mutter, note, log_error, warning, is_quiet, info
57
59
 
93
95
    return tree, new_list
94
96
 
95
97
 
 
98
@symbol_versioning.deprecated_function(symbol_versioning.zero_fifteen)
96
99
def get_format_type(typestring):
97
100
    """Parse and return a format specifier."""
98
101
    # Have to use BzrDirMetaFormat1 directly, so that
450
453
 
451
454
    If the last argument is a versioned directory, all the other names
452
455
    are moved into it.  Otherwise, there must be exactly two arguments
453
 
    and the file is changed to a new name, which must not already exist.
 
456
    and the file is changed to a new name.
 
457
 
 
458
    If OLDNAME does not exist on the filesystem but is versioned and
 
459
    NEWNAME does exist on the filesystem but is not versioned, mv
 
460
    assumes that the file has been manually moved and only updates
 
461
    its internal inventory to reflect that change.
 
462
    The same is valid when moving many SOURCE files to a DESTINATION.
454
463
 
455
464
    Files cannot be moved between branches.
456
465
    """
457
466
 
458
467
    takes_args = ['names*']
 
468
    takes_options = [Option("after", help="move only the bzr identifier"
 
469
        " of the file (file has already been moved). Use this flag if"
 
470
        " bzr is not able to detect this itself.")]
459
471
    aliases = ['move', 'rename']
460
472
    encoding_type = 'replace'
461
473
 
462
 
    def run(self, names_list):
 
474
    def run(self, names_list, after=False):
463
475
        if names_list is None:
464
476
            names_list = []
465
477
 
469
481
        
470
482
        if os.path.isdir(names_list[-1]):
471
483
            # move into existing directory
472
 
            for pair in tree.move(rel_names[:-1], rel_names[-1]):
 
484
            for pair in tree.move(rel_names[:-1], rel_names[-1], after=after):
473
485
                self.outf.write("%s => %s\n" % pair)
474
486
        else:
475
487
            if len(names_list) != 2:
476
 
                raise errors.BzrCommandError('to mv multiple files the destination '
477
 
                                             'must be a versioned directory')
478
 
            tree.rename_one(rel_names[0], rel_names[1])
 
488
                raise errors.BzrCommandError('to mv multiple files the'
 
489
                                             ' destination must be a versioned'
 
490
                                             ' directory')
 
491
            tree.rename_one(rel_names[0], rel_names[1], after=after)
479
492
            self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1]))
480
493
            
481
494
    
650
663
            dir_to = br_from.bzrdir.clone(location_url,
651
664
                revision_id=br_from.last_revision())
652
665
            br_to = dir_to.open_branch()
653
 
            count = len(br_to.revision_history())
 
666
            count = br_to.last_revision_info()[0]
654
667
            # We successfully created the target, remember it
655
668
            if br_from.get_push_location() is None or remember:
656
669
                br_from.set_push_location(br_to.base)
666
679
                except errors.NotLocalUrl:
667
680
                    warning('This transport does not update the working '
668
681
                            'tree of: %s' % (br_to.base,))
669
 
                    count = br_to.pull(br_from, overwrite)
 
682
                    count = br_from.push(br_to, overwrite)
670
683
                except errors.NoWorkingTree:
671
 
                    count = br_to.pull(br_from, overwrite)
 
684
                    count = br_from.push(br_to, overwrite)
672
685
                else:
673
 
                    count = tree_to.pull(br_from, overwrite)
 
686
                    tree_to.lock_write()
 
687
                    try:
 
688
                        count = br_from.push(tree_to.branch, overwrite)
 
689
                        tree_to.update()
 
690
                    finally:
 
691
                        tree_to.unlock()
674
692
            except errors.DivergedBranches:
675
693
                raise errors.BzrCommandError('These branches have diverged.'
676
694
                                        '  Try using "merge" and then "push".')
834
852
                                             % to_location)
835
853
            else:
836
854
                raise
837
 
        old_format = bzrdir.BzrDirFormat.get_default_format()
838
 
        bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
839
 
        try:
840
 
            source.create_checkout(to_location, revision_id, lightweight)
841
 
        finally:
842
 
            bzrdir.BzrDirFormat.set_default_format(old_format)
 
855
        source.create_checkout(to_location, revision_id, lightweight)
843
856
 
844
857
 
845
858
class cmd_renames(Command):
1084
1097
    """
1085
1098
    takes_args = ['location?']
1086
1099
    takes_options = [
1087
 
                     Option('format', 
 
1100
                     RegistryOption('format',
1088
1101
                            help='Specify a format for this branch. Current'
1089
1102
                                 ' formats are: default, knit, metaweave and'
1090
1103
                                 ' weave. Default is knit; metaweave and'
1091
1104
                                 ' weave are deprecated',
1092
 
                            type=get_format_type),
 
1105
                            converter=bzrdir.format_registry.make_bzrdir,
 
1106
                            registry=bzrdir.format_registry,
 
1107
                            value_switches=True),
1093
1108
                     ]
1094
1109
    def run(self, location=None, format=None):
1095
1110
        if format is None:
1096
 
            format = get_format_type('default')
 
1111
            format = bzrdir.format_registry.make_bzrdir('default')
1097
1112
        if location is None:
1098
1113
            location = u'.'
1099
1114
 
1142
1157
        (add files here)
1143
1158
    """
1144
1159
    takes_args = ["location"] 
1145
 
    takes_options = [Option('format', 
 
1160
    takes_options = [RegistryOption('format',
1146
1161
                            help='Specify a format for this repository.'
1147
1162
                                 ' Current formats are: default, knit,'
1148
1163
                                 ' metaweave and weave. Default is knit;'
1149
1164
                                 ' metaweave and weave are deprecated',
1150
 
                            type=get_format_type),
 
1165
                            registry=bzrdir.format_registry,
 
1166
                            converter=bzrdir.format_registry.make_bzrdir,
 
1167
                            value_switches=True),
1151
1168
                     Option('trees',
1152
1169
                             help='Allows branches in repository to have'
1153
1170
                             ' a working tree')]
1154
1171
    aliases = ["init-repo"]
1155
1172
    def run(self, location, format=None, trees=False):
1156
1173
        if format is None:
1157
 
            format = get_format_type('default')
 
1174
            format = bzrdir.format_registry.make_bzrdir('default')
1158
1175
 
1159
1176
        if location is None:
1160
1177
            location = '.'
1550
1567
                                             ' and PATH')
1551
1568
            fs_path = path
1552
1569
            prefix = path
1553
 
        tree, relpath = WorkingTree.open_containing(fs_path)
 
1570
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
 
1571
            fs_path)
1554
1572
        if from_root:
1555
1573
            relpath = u''
1556
1574
        elif relpath:
1557
1575
            relpath += '/'
1558
1576
        if revision is not None:
1559
 
            tree = tree.branch.repository.revision_tree(
1560
 
                revision[0].in_history(tree.branch).rev_id)
 
1577
            tree = branch.repository.revision_tree(
 
1578
                revision[0].in_history(branch).rev_id)
 
1579
        elif tree is None:
 
1580
            tree = branch.basis_tree()
1561
1581
 
1562
1582
        for fp, fc, fkind, fid, entry in tree.list_files(include_root=False):
1563
1583
            if fp.startswith(relpath):
1969
1989
    """
1970
1990
    takes_args = ['url?']
1971
1991
    takes_options = [
1972
 
                     Option('format', 
1973
 
                            help='Upgrade to a specific format. Current formats'
1974
 
                                 ' are: default, knit, metaweave and weave.'
1975
 
                                 ' Default is knit; metaweave and weave are'
1976
 
                                 ' deprecated',
1977
 
                            type=get_format_type),
 
1992
                    RegistryOption('format',
 
1993
                        help='Upgrade to a specific format. Current formats'
 
1994
                             ' are: default, knit, metaweave and weave.'
 
1995
                             ' Default is knit; metaweave and weave are'
 
1996
                             ' deprecated',
 
1997
                        registry=bzrdir.format_registry,
 
1998
                        converter=bzrdir.format_registry.make_bzrdir,
 
1999
                        value_switches=True),
1978
2000
                    ]
1979
2001
 
1980
2002
 
1981
2003
    def run(self, url='.', format=None):
1982
2004
        from bzrlib.upgrade import upgrade
1983
2005
        if format is None:
1984
 
            format = get_format_type('default')
 
2006
            format = bzrdir.format_registry.make_bzrdir('default')
1985
2007
        upgrade(url, format)
1986
2008
 
1987
2009
 
2052
2074
class cmd_selftest(Command):
2053
2075
    """Run internal test suite.
2054
2076
    
2055
 
    This creates temporary test directories in the working directory,
2056
 
    but not existing data is affected.  These directories are deleted
2057
 
    if the tests pass, or left behind to help in debugging if they
2058
 
    fail and --keep-output is specified.
 
2077
    This creates temporary test directories in the working directory, but not
 
2078
    existing data is affected.  These directories are deleted if the tests
 
2079
    pass, or left behind to help in debugging if they fail and --keep-output
 
2080
    is specified.
2059
2081
    
2060
 
    If arguments are given, they are regular expressions that say
2061
 
    which tests should run.
 
2082
    If arguments are given, they are regular expressions that say which tests
 
2083
    should run.  Tests matching any expression are run, and other tests are
 
2084
    not run.
 
2085
 
 
2086
    Alternatively if --first is given, matching tests are run first and then
 
2087
    all other tests are run.  This is useful if you have been working in a
 
2088
    particular area, but want to make sure nothing else was broken.
2062
2089
 
2063
2090
    If the global option '--no-plugins' is given, plugins are not loaded
2064
2091
    before running the selftests.  This has two effects: features provided or
2065
2092
    modified by plugins will not be tested, and tests provided by plugins will
2066
2093
    not be run.
2067
2094
 
2068
 
    examples:
 
2095
    examples::
2069
2096
        bzr selftest ignore
 
2097
            run only tests relating to 'ignore'
2070
2098
        bzr --no-plugins selftest -v
 
2099
            disable plugins and list tests as they're run
2071
2100
    """
2072
2101
    # TODO: --list should give a list of all available tests
2073
2102
 
2108
2137
                     Option('clean-output',
2109
2138
                            help='clean temporary tests directories'
2110
2139
                                 ' without running tests'),
 
2140
                     Option('first',
 
2141
                            help='run all tests, but run specified tests first',
 
2142
                            )
2111
2143
                     ]
2112
2144
    encoding_type = 'replace'
2113
2145
 
2114
2146
    def run(self, testspecs_list=None, verbose=None, one=False,
2115
2147
            keep_output=False, transport=None, benchmark=None,
2116
 
            lsprof_timed=None, cache_dir=None, clean_output=False):
 
2148
            lsprof_timed=None, cache_dir=None, clean_output=False,
 
2149
            first=False):
2117
2150
        import bzrlib.ui
2118
2151
        from bzrlib.tests import selftest
2119
2152
        import bzrlib.benchmarks as benchmarks
2152
2185
                              transport=transport,
2153
2186
                              test_suite_factory=test_suite_factory,
2154
2187
                              lsprof_timed=lsprof_timed,
2155
 
                              bench_history=benchfile)
 
2188
                              bench_history=benchfile,
 
2189
                              matching_tests_first=first,
 
2190
                              )
2156
2191
        finally:
2157
2192
            if benchfile is not None:
2158
2193
                benchfile.close()
2196
2231
        branch1 = Branch.open_containing(branch)[0]
2197
2232
        branch2 = Branch.open_containing(other)[0]
2198
2233
 
2199
 
        history_1 = branch1.revision_history()
2200
 
        history_2 = branch2.revision_history()
2201
 
 
2202
2234
        last1 = branch1.last_revision()
2203
2235
        last2 = branch2.last_revision()
2204
2236
 
2511
2543
        try:
2512
2544
            tree.revert(file_list, 
2513
2545
                        tree.branch.repository.revision_tree(rev_id),
2514
 
                        not no_backup, pb)
 
2546
                        not no_backup, pb, report_changes=True)
2515
2547
        finally:
2516
2548
            pb.finished()
2517
2549
 
2604
2636
            other_branch = parent
2605
2637
            if other_branch is None:
2606
2638
                raise errors.BzrCommandError("No peer location known or specified.")
2607
 
            print "Using last location: " + local_branch.get_parent()
 
2639
            display_url = urlutils.unescape_for_display(parent,
 
2640
                                                        self.outf.encoding)
 
2641
            print "Using last location: " + display_url
 
2642
 
2608
2643
        remote_branch = Branch.open(other_branch)
2609
2644
        if remote_branch.base == local_branch.base:
2610
2645
            remote_branch = local_branch