~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

Upgraded to the latest bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
189
189
    aliases = ['st', 'stat']
190
190
 
191
191
    encoding_type = 'replace'
 
192
    _see_also = ['diff', 'revert']
192
193
    
193
194
    @display_command
194
195
    def run(self, show_ids=False, file_list=None, revision=None, short=False,
218
219
    @display_command
219
220
    def run(self, revision_id=None, revision=None):
220
221
 
 
222
        revision_id = osutils.safe_revision_id(revision_id, warn=False)
221
223
        if revision_id is not None and revision is not None:
222
224
            raise errors.BzrCommandError('You can only supply one of'
223
225
                                         ' revision_id or --revision')
243
245
 
244
246
    Since a lightweight checkout is little more than a working tree
245
247
    this will refuse to run against one.
 
248
 
 
249
    To re-create the working tree, use "bzr checkout".
246
250
    """
 
251
    _see_also = ['checkout']
247
252
 
248
253
    takes_args = ['location?']
249
254
 
273
278
    This is equal to the number of revisions on this branch.
274
279
    """
275
280
 
 
281
    _see_also = ['info']
276
282
    takes_args = ['location?']
277
283
 
278
284
    @display_command
338
344
 
339
345
    --file-ids-from will try to use the file ids from the supplied path.
340
346
    It looks up ids trying to find a matching parent directory with the
341
 
    same filename, and then by pure path.
 
347
    same filename, and then by pure path. This option is rarely needed
 
348
    but can be useful when adding the same logical file into two
 
349
    branches that will be merged later (without showing the two different
 
350
    adds as a conflict). It is also useful when merging another project
 
351
    into a subdirectory of this one.
342
352
    """
343
353
    takes_args = ['file*']
344
354
    takes_options = ['no-recurse', 'dry-run', 'verbose',
345
355
                     Option('file-ids-from', type=unicode,
346
356
                            help='Lookup file ids from here')]
347
357
    encoding_type = 'replace'
 
358
    _see_also = ['remove']
348
359
 
349
360
    def run(self, file_list, no_recurse=False, dry_run=False, verbose=False,
350
361
            file_ids_from=None):
429
440
 
430
441
    It is also possible to restrict the list of files to a specific
431
442
    set. For example: bzr inventory --show-ids this/file
432
 
 
433
 
    See also: bzr ls
434
443
    """
435
444
 
436
445
    hidden = True
437
 
 
 
446
    _see_also = ['ls']
438
447
    takes_options = ['revision', 'show-ids', 'kind']
439
 
 
440
448
    takes_args = ['file*']
441
449
 
442
450
    @display_command
553
561
    location can be accessed.
554
562
    """
555
563
 
 
564
    _see_also = ['push', 'update']
556
565
    takes_options = ['remember', 'overwrite', 'revision', 'verbose',
557
566
        Option('directory',
558
567
            help='branch to pull into, '
569
578
            directory=None):
570
579
        from bzrlib.tag import _merge_tags_if_possible
571
580
        # FIXME: too much stuff is in the command class
 
581
        revision_id = None
 
582
        mergeable = None
572
583
        if directory is None:
573
584
            directory = u'.'
574
585
        try:
581
592
        reader = None
582
593
        if location is not None:
583
594
            try:
584
 
                reader = bundle.read_bundle_from_url(location)
 
595
                mergeable = bundle.read_mergeable_from_url(
 
596
                    location)
585
597
            except errors.NotABundle:
586
598
                pass # Continue on considering this url a Branch
587
599
 
596
608
                self.outf.write("Using saved location: %s\n" % display_url)
597
609
                location = stored_loc
598
610
 
599
 
        if reader is not None:
600
 
            install_bundle(branch_to.repository, reader)
 
611
        if mergeable is not None:
 
612
            if revision is not None:
 
613
                raise errors.BzrCommandError(
 
614
                    'Cannot use -r with merge directives or bundles')
 
615
            revision_id = mergeable.install_revisions(branch_to.repository)
601
616
            branch_from = branch_to
602
617
        else:
603
618
            branch_from = Branch.open(location)
605
620
            if branch_to.get_parent() is None or remember:
606
621
                branch_to.set_parent(branch_from.base)
607
622
 
608
 
        rev_id = None
609
 
        if revision is None:
610
 
            if reader is not None:
611
 
                rev_id = reader.target
612
 
        elif len(revision) == 1:
613
 
            rev_id = revision[0].in_history(branch_from).rev_id
614
 
        else:
615
 
            raise errors.BzrCommandError('bzr pull --revision takes one value.')
 
623
        if revision is not None:
 
624
            if len(revision) == 1:
 
625
                revision_id = revision[0].in_history(branch_from).rev_id
 
626
            else:
 
627
                raise errors.BzrCommandError(
 
628
                    'bzr pull --revision takes one value.')
616
629
 
617
630
        old_rh = branch_to.revision_history()
618
631
        if tree_to is not None:
619
 
            result = tree_to.pull(branch_from, overwrite, rev_id,
 
632
            result = tree_to.pull(branch_from, overwrite, revision_id,
620
633
                delta._ChangeReporter(unversioned_filter=tree_to.is_ignored))
621
634
        else:
622
 
            result = branch_to.pull(branch_from, overwrite, rev_id)
 
635
            result = branch_to.pull(branch_from, overwrite, revision_id)
623
636
 
624
637
        result.report(self.outf)
625
638
        if verbose:
626
639
            from bzrlib.log import show_changed_revisions
627
640
            new_rh = branch_to.revision_history()
628
 
            show_changed_revisions(branch_to, old_rh, new_rh, to_file=self.outf)
 
641
            show_changed_revisions(branch_to, old_rh, new_rh,
 
642
                                   to_file=self.outf)
629
643
 
630
644
 
631
645
class cmd_push(Command):
654
668
    location can be accessed.
655
669
    """
656
670
 
 
671
    _see_also = ['pull', 'update']
657
672
    takes_options = ['remember', 'overwrite', 'verbose',
658
673
        Option('create-prefix',
659
674
               help='Create the path leading up to the branch '
835
850
 
836
851
    To retrieve the branch as of a particular revision, supply the --revision
837
852
    parameter, as in "branch foo/bar -r 5".
 
853
    """
838
854
 
839
 
    --basis is to speed up branching from remote branches.  When specified, it
840
 
    copies all the file-contents, inventory and revision data from the basis
841
 
    branch before copying anything from the remote branch.
842
 
    """
 
855
    _see_also = ['checkout']
843
856
    takes_args = ['from_location', 'to_location?']
844
 
    takes_options = ['revision', 'basis']
 
857
    takes_options = ['revision']
845
858
    aliases = ['get', 'clone']
846
859
 
847
 
    def run(self, from_location, to_location=None, revision=None, basis=None):
 
860
    def run(self, from_location, to_location=None, revision=None):
848
861
        from bzrlib.tag import _merge_tags_if_possible
849
862
        if revision is None:
850
863
            revision = [None]
855
868
        br_from = Branch.open(from_location)
856
869
        br_from.lock_read()
857
870
        try:
858
 
            if basis is not None:
859
 
                basis_dir = bzrdir.BzrDir.open_containing(basis)[0]
860
 
            else:
861
 
                basis_dir = None
862
871
            if len(revision) == 1 and revision[0] is not None:
863
872
                revision_id = revision[0].in_history(br_from)[1]
864
873
            else:
883
892
                                             % to_location)
884
893
            try:
885
894
                # preserve whatever source format we have.
886
 
                dir = br_from.bzrdir.sprout(to_transport.base,
887
 
                        revision_id, basis_dir)
 
895
                dir = br_from.bzrdir.sprout(to_transport.base, revision_id)
888
896
                branch = dir.open_branch()
889
897
            except errors.NoSuchRevision:
890
898
                to_transport.delete_tree('.')
891
899
                msg = "The branch %s has no revision %s." % (from_location, revision[0])
892
900
                raise errors.BzrCommandError(msg)
893
 
            except errors.UnlistableBranch:
894
 
                osutils.rmtree(to_location)
895
 
                msg = "The branch %s cannot be used as a --basis" % (basis,)
896
 
                raise errors.BzrCommandError(msg)
897
901
            if name:
898
902
                branch.control_files.put_utf8('branch-name', name)
899
903
            _merge_tags_if_possible(br_from, branch)
917
921
    parameter, as in "checkout foo/bar -r 5". Note that this will be immediately
918
922
    out of date [so you cannot commit] but it may be useful (i.e. to examine old
919
923
    code.)
 
924
    """
920
925
 
921
 
    See "help checkouts" for more information on checkouts.
922
 
    """
 
926
    _see_also = ['checkouts', 'branch']
923
927
    takes_args = ['branch_location?', 'to_location?']
924
 
    takes_options = ['revision', # , 'basis']
 
928
    takes_options = ['revision',
925
929
                     Option('lightweight',
926
930
                            help="perform a lightweight checkout. Lightweight "
927
931
                                 "checkouts depend on access to the branch for "
932
936
                     ]
933
937
    aliases = ['co']
934
938
 
935
 
    def run(self, branch_location=None, to_location=None, revision=None, basis=None,
 
939
    def run(self, branch_location=None, to_location=None, revision=None,
936
940
            lightweight=False):
937
941
        if revision is None:
938
942
            revision = [None]
979
983
    # TODO: Option to show renames between two historical versions.
980
984
 
981
985
    # TODO: Only show renames under dir, rather than in the whole branch.
 
986
    _see_also = ['status']
982
987
    takes_args = ['dir?']
983
988
 
984
989
    @display_command
1011
1016
    If you want to discard your local changes, you can just do a 
1012
1017
    'bzr revert' instead of 'bzr commit' after the update.
1013
1018
    """
 
1019
 
 
1020
    _see_also = ['pull']
1014
1021
    takes_args = ['dir?']
1015
1022
    aliases = ['up']
1016
1023
 
1054
1061
 
1055
1062
    Branches and working trees will also report any missing revisions.
1056
1063
    """
 
1064
    _see_also = ['revno']
1057
1065
    takes_args = ['location?']
1058
1066
    takes_options = ['verbose']
1059
1067
 
1104
1112
    """
1105
1113
 
1106
1114
    hidden = True
 
1115
    _see_also = ['inventory', 'ls']
1107
1116
    takes_args = ['filename']
1108
1117
 
1109
1118
    @display_command
1156
1165
 
1157
1166
    The branch *MUST* be on a listable system such as local disk or sftp.
1158
1167
    """
 
1168
 
 
1169
    _see_also = ['check']
1159
1170
    takes_args = ['branch?']
1160
1171
 
1161
1172
    def run(self, branch="."):
1166
1177
 
1167
1178
class cmd_revision_history(Command):
1168
1179
    """Display the list of revision ids on a branch."""
 
1180
 
 
1181
    _see_also = ['log']
1169
1182
    takes_args = ['location?']
1170
1183
 
1171
1184
    hidden = True
1180
1193
 
1181
1194
class cmd_ancestry(Command):
1182
1195
    """List all revisions merged into this branch."""
 
1196
 
 
1197
    _see_also = ['log', 'revision-history']
1183
1198
    takes_args = ['location?']
1184
1199
 
1185
1200
    hidden = True
1223
1238
        bzr status
1224
1239
        bzr commit -m 'imported project'
1225
1240
    """
 
1241
 
 
1242
    _see_also = ['init-repo', 'branch', 'checkout']
1226
1243
    takes_args = ['location?']
1227
1244
    takes_options = [
1228
1245
         RegistryOption('format',
1294
1311
        (add files here)
1295
1312
    """
1296
1313
 
 
1314
    _see_also = ['init', 'branch', 'checkout']
1297
1315
    takes_args = ["location"]
1298
1316
    takes_options = [RegistryOption('format',
1299
1317
                            help='Specify a format for this repository. See'
1359
1377
 
1360
1378
    # TODO: This probably handles non-Unix newlines poorly.
1361
1379
 
 
1380
    _see_also = ['status']
1362
1381
    takes_args = ['file*']
1363
1382
    takes_options = ['revision', 'diff-options',
1364
1383
        Option('prefix', type=str,
1444
1463
    # directories with readdir, rather than stating each one.  Same
1445
1464
    # level of effort but possibly much less IO.  (Or possibly not,
1446
1465
    # if the directories are very large...)
 
1466
    _see_also = ['status', 'ls']
1447
1467
    takes_options = ['show-ids']
1448
1468
 
1449
1469
    @display_command
1469
1489
 
1470
1490
class cmd_modified(Command):
1471
1491
    """List files modified in working tree.
1472
 
 
1473
 
    See also: "bzr status".
1474
1492
    """
1475
1493
 
1476
1494
    hidden = True
 
1495
    _see_also = ['status', 'ls']
1477
1496
 
1478
1497
    @display_command
1479
1498
    def run(self):
1485
1504
 
1486
1505
class cmd_added(Command):
1487
1506
    """List files added in working tree.
1488
 
 
1489
 
    See also: "bzr status".
1490
1507
    """
1491
1508
 
1492
1509
    hidden = True
 
1510
    _see_also = ['status', 'ls']
1493
1511
 
1494
1512
    @display_command
1495
1513
    def run(self):
1521
1539
 
1522
1540
    The root is the nearest enclosing directory with a .bzr control
1523
1541
    directory."""
 
1542
 
1524
1543
    takes_args = ['filename?']
1525
1544
    @display_command
1526
1545
    def run(self, filename=None):
1688
1707
    """List files in a tree.
1689
1708
    """
1690
1709
 
 
1710
    _see_also = ['status', 'cat']
1691
1711
    takes_args = ['path?']
1692
1712
    # TODO: Take a revision or remote path and list that tree instead.
1693
1713
    takes_options = ['verbose', 'revision',
1777
1797
 
1778
1798
class cmd_unknowns(Command):
1779
1799
    """List unknown files.
1780
 
 
1781
 
    See also: "bzr ls --unknown".
1782
1800
    """
1783
1801
 
1784
1802
    hidden = True
 
1803
    _see_also = ['ls']
1785
1804
 
1786
1805
    @display_command
1787
1806
    def run(self):
1822
1841
        bzr ignore 'lib/**/*.o'
1823
1842
        bzr ignore 'RE:lib/.*\.o'
1824
1843
    """
 
1844
 
 
1845
    _see_also = ['status', 'ignored']
1825
1846
    takes_args = ['name_pattern*']
1826
1847
    takes_options = [
1827
1848
                     Option('old-default-rules',
1877
1898
 
1878
1899
class cmd_ignored(Command):
1879
1900
    """List ignored files and the patterns that matched them.
 
1901
    """
1880
1902
 
1881
 
    See also: bzr ignore"""
 
1903
    _see_also = ['ignore']
1882
1904
    @display_command
1883
1905
    def run(self):
1884
1906
        tree = WorkingTree.open_containing(u'.')[0]
1922
1944
    given, try to find the format with the extension. If no extension
1923
1945
    is found exports to a directory (equivalent to --format=dir).
1924
1946
 
1925
 
    Root may be the top directory for tar, tgz and tbz2 formats. If none
1926
 
    is given, the top directory will be the root name of the file.
 
1947
    If root is supplied, it will be used as the root directory inside
 
1948
    container formats (tar, zip, etc). If it is not supplied it will default
 
1949
    to the exported filename. The root option has no effect for 'dir' format.
1927
1950
 
1928
1951
    If branch is omitted then the branch containing the current working
1929
1952
    directory will be used.
1930
1953
 
1931
 
    Note: export of tree with non-ascii filenames to zip is not supported.
 
1954
    Note: Export of tree with non-ASCII filenames to zip is not supported.
1932
1955
 
1933
1956
     Supported formats       Autodetected by extension
1934
1957
     -----------------       -------------------------
1972
1995
    binary file. 
1973
1996
    """
1974
1997
 
 
1998
    _see_also = ['ls']
1975
1999
    takes_options = ['revision', 'name-from-revision']
1976
2000
    takes_args = ['filename']
1977
2001
    encoding_type = 'exact'
2036
2060
    within it is committed.
2037
2061
 
2038
2062
    A selected-file commit may fail in some cases where the committed
2039
 
    tree would be invalid, such as trying to commit a file in a
2040
 
    newly-added directory that is not itself committed.
 
2063
    tree would be invalid. Consider::
 
2064
 
 
2065
      bzr init foo
 
2066
      mkdir foo/bar
 
2067
      bzr add foo/bar
 
2068
      bzr commit foo -m "committing foo"
 
2069
      bzr mv foo/bar foo/baz
 
2070
      mkdir foo/bar
 
2071
      bzr add foo/bar
 
2072
      bzr commit foo/bar -m "committing bar but not baz"
 
2073
 
 
2074
    In the example above, the last commit will fail by design. This gives
 
2075
    the user the opportunity to decide whether they want to commit the
 
2076
    rename at the same time, separately first, or not at all. (As a general
 
2077
    rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
 
2078
 
 
2079
    Note: A selected-file commit after a merge is not yet supported.
2041
2080
    """
2042
2081
    # TODO: Run hooks on tree to-be-committed, and after commit.
2043
2082
 
2048
2087
 
2049
2088
    # XXX: verbose currently does nothing
2050
2089
 
 
2090
    _see_also = ['uncommit']
2051
2091
    takes_args = ['selected*']
2052
2092
    takes_options = ['message', 'verbose', 
2053
2093
                     Option('unchanged',
2145
2185
    This command checks various invariants about the branch storage to
2146
2186
    detect data corruption or bzr bugs.
2147
2187
    """
 
2188
 
 
2189
    _see_also = ['reconcile']
2148
2190
    takes_args = ['branch?']
2149
2191
    takes_options = ['verbose']
2150
2192
 
2165
2207
    this command. When the default format has changed you may also be warned
2166
2208
    during other operations to upgrade.
2167
2209
    """
 
2210
 
 
2211
    _see_also = ['check']
2168
2212
    takes_args = ['url?']
2169
2213
    takes_options = [
2170
2214
                    RegistryOption('format',
2233
2277
    If unset, the tree root directory name is used as the nickname
2234
2278
    To print the current nickname, execute with no argument.  
2235
2279
    """
 
2280
 
 
2281
    _see_also = ['info']
2236
2282
    takes_args = ['nickname?']
2237
2283
    def run(self, nickname=None):
2238
2284
        branch = Branch.open_containing(u'.')[0]
2302
2348
    hidden = True
2303
2349
    takes_args = ['testspecs*']
2304
2350
    takes_options = ['verbose',
2305
 
                     Option('one', help='stop when one test fails'),
 
2351
                     Option('one',
 
2352
                             help='stop when one test fails',
 
2353
                             short_name='1',
 
2354
                             ),
2306
2355
                     Option('keep-output',
2307
2356
                            help='keep output directories when tests fail'),
2308
2357
                     Option('transport',
2320
2369
                            help='clean temporary tests directories'
2321
2370
                                 ' without running tests'),
2322
2371
                     Option('first',
2323
 
                            help='run all tests, but run specified tests first'
 
2372
                            help='run all tests, but run specified tests first',
 
2373
                            short_name='f',
2324
2374
                            ),
2325
2375
                     Option('numbered-dirs',
2326
2376
                            help='use numbered dirs for TestCaseInTempDir'),
2461
2511
 
2462
2512
    Examples:
2463
2513
 
2464
 
    To merge the latest revision from bzr.dev
2465
 
    bzr merge ../bzr.dev
 
2514
    To merge the latest revision from bzr.dev:
 
2515
        bzr merge ../bzr.dev
2466
2516
 
2467
 
    To merge changes up to and including revision 82 from bzr.dev
2468
 
    bzr merge -r 82 ../bzr.dev
 
2517
    To merge changes up to and including revision 82 from bzr.dev:
 
2518
        bzr merge -r 82 ../bzr.dev
2469
2519
 
2470
2520
    To merge the changes introduced by 82, without previous changes:
2471
 
    bzr merge -r 81..82 ../bzr.dev
 
2521
        bzr merge -r 81..82 ../bzr.dev
2472
2522
    
2473
2523
    merge refuses to run if there are any uncommitted changes, unless
2474
2524
    --force is given.
2475
2525
    """
 
2526
 
 
2527
    _see_also = ['update', 'remerge']
2476
2528
    takes_args = ['branch?']
2477
2529
    takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
2478
2530
        Option('show-base', help="Show base revision text in "
2497
2549
            directory=None,
2498
2550
            ):
2499
2551
        from bzrlib.tag import _merge_tags_if_possible
 
2552
        other_revision_id = None
2500
2553
        if merge_type is None:
2501
2554
            merge_type = _mod_merge.Merge3Merger
2502
2555
 
2514
2567
 
2515
2568
        if branch is not None:
2516
2569
            try:
2517
 
                reader = bundle.read_bundle_from_url(branch)
 
2570
                mergeable = bundle.read_mergeable_from_url(
 
2571
                    branch)
2518
2572
            except errors.NotABundle:
2519
2573
                pass # Continue on considering this url a Branch
2520
2574
            else:
2521
 
                conflicts = merge_bundle(reader, tree, not force, merge_type,
2522
 
                                         reprocess, show_base, change_reporter)
2523
 
                if conflicts == 0:
2524
 
                    return 0
2525
 
                else:
2526
 
                    return 1
 
2575
                if revision is not None:
 
2576
                    raise errors.BzrCommandError(
 
2577
                        'Cannot use -r with merge directives or bundles')
 
2578
                other_revision_id = mergeable.install_revisions(
 
2579
                    tree.branch.repository)
 
2580
                revision = [RevisionSpec.from_string(
 
2581
                    'revid:' + other_revision_id)]
2527
2582
 
2528
2583
        if revision is None \
2529
2584
                or len(revision) < 1 or revision[0].needs_branch():
2544
2599
            branch = revision[0].get_branch() or branch
2545
2600
            if len(revision) == 1:
2546
2601
                base = [None, None]
2547
 
                other_branch, path = Branch.open_containing(branch)
2548
 
                revno = revision[0].in_history(other_branch).revno
2549
 
                other = [branch, revno]
 
2602
                if other_revision_id is not None:
 
2603
                    other_branch = None
 
2604
                    path = ""
 
2605
                    other = None
 
2606
                else:
 
2607
                    other_branch, path = Branch.open_containing(branch)
 
2608
                    revno = revision[0].in_history(other_branch).revno
 
2609
                    other = [branch, revno]
2550
2610
            else:
2551
2611
                assert len(revision) == 2
2552
2612
                if None in revision:
2562
2622
                base = [branch, revision[0].in_history(base_branch).revno]
2563
2623
                other = [branch1, revision[1].in_history(other_branch).revno]
2564
2624
 
2565
 
        if tree.branch.get_parent() is None or remember:
 
2625
        if ((tree.branch.get_parent() is None or remember) and
 
2626
            other_branch is not None):
2566
2627
            tree.branch.set_parent(other_branch.base)
2567
2628
 
2568
2629
        # pull tags now... it's a bit inconsistent to do it ahead of copying
2569
2630
        # the history but that's done inside the merge code
2570
 
        _merge_tags_if_possible(other_branch, tree.branch)
 
2631
        if other_branch is not None:
 
2632
            _merge_tags_if_possible(other_branch, tree.branch)
2571
2633
 
2572
2634
        if path != "":
2573
2635
            interesting_files = [path]
2577
2639
        try:
2578
2640
            try:
2579
2641
                conflict_count = _merge_helper(
2580
 
                    other, base, check_clean=(not force),
 
2642
                    other, base, other_rev_id=other_revision_id,
 
2643
                    check_clean=(not force),
2581
2644
                    merge_type=merge_type,
2582
2645
                    reprocess=reprocess,
2583
2646
                    show_base=show_base,
2629
2692
    pending merge, and it lets you specify particular files.
2630
2693
 
2631
2694
    Examples:
 
2695
 
2632
2696
    $ bzr remerge --show-base
2633
2697
        Re-do the merge of all conflicted files, and show the base text in
2634
2698
        conflict regions, in addition to the usual THIS and OTHER texts.
2726
2790
    name.  If you name a directory, all the contents of that directory will be
2727
2791
    reverted.
2728
2792
    """
 
2793
 
 
2794
    _see_also = ['cat', 'export']
2729
2795
    takes_options = ['revision', 'no-backup']
2730
2796
    takes_args = ['file*']
2731
2797
 
2765
2831
 
2766
2832
class cmd_help(Command):
2767
2833
    """Show help on a command or other topic.
 
2834
    """
2768
2835
 
2769
 
    For a list of all available commands, say 'bzr help commands'.
2770
 
    """
 
2836
    _see_also = ['topics']
2771
2837
    takes_options = [Option('long', 'show help on all commands')]
2772
2838
    takes_args = ['topic?']
2773
2839
    aliases = ['?', '--help', '-?', '-h']
2814
2880
 
2815
2881
    OTHER_BRANCH may be local or remote.
2816
2882
    """
 
2883
 
 
2884
    _see_also = ['merge', 'pull']
2817
2885
    takes_args = ['other_branch?']
2818
2886
    takes_options = [Option('reverse', 'Reverse the order of revisions'),
2819
2887
                     Option('mine-only', 
2916
2984
 
2917
2985
class cmd_testament(Command):
2918
2986
    """Show testament (signing-form) of a revision."""
2919
 
    takes_options = ['revision', 
 
2987
    takes_options = ['revision',
2920
2988
                     Option('long', help='Produce long-format testament'), 
2921
2989
                     Option('strict', help='Produce a strict-format'
2922
2990
                            ' testament')]
3032
3100
 
3033
3101
    Once converted into a checkout, commits must succeed on the master branch
3034
3102
    before they will be applied to the local branch.
3035
 
 
3036
 
    See "help checkouts" for more information on checkouts.
3037
3103
    """
3038
3104
 
 
3105
    _see_also = ['checkouts', 'unbind']
3039
3106
    takes_args = ['location?']
3040
3107
    takes_options = []
3041
3108
 
3064
3131
 
3065
3132
    After unbinding, the local branch is considered independent and subsequent
3066
3133
    commits will be local only.
3067
 
 
3068
 
    See "help checkouts" for more information on checkouts.
3069
3134
    """
3070
3135
 
 
3136
    _see_also = ['checkouts', 'bind']
3071
3137
    takes_args = []
3072
3138
    takes_options = []
3073
3139
 
3092
3158
    # unreferenced information in 'branch-as-repository' branches.
3093
3159
    # TODO: jam 20060108 Add the ability for uncommit to remove unreferenced
3094
3160
    # information in shared branches as well.
 
3161
    _see_also = ['commit']
3095
3162
    takes_options = ['verbose', 'revision',
3096
3163
                    Option('dry-run', help='Don\'t actually make changes'),
3097
3164
                    Option('force', help='Say yes to all questions.')]
3221
3288
        ]
3222
3289
 
3223
3290
    def run(self, port=None, inet=False, directory=None, allow_writes=False):
3224
 
        from bzrlib.transport import smart
 
3291
        from bzrlib.smart import medium, server
3225
3292
        from bzrlib.transport import get_transport
 
3293
        from bzrlib.transport.chroot import ChrootServer
 
3294
        from bzrlib.transport.remote import BZR_DEFAULT_PORT
3226
3295
        if directory is None:
3227
3296
            directory = os.getcwd()
3228
3297
        url = urlutils.local_path_to_url(directory)
3229
3298
        if not allow_writes:
3230
3299
            url = 'readonly+' + url
3231
 
        t = get_transport(url)
 
3300
        chroot_server = ChrootServer(get_transport(url))
 
3301
        chroot_server.setUp()
 
3302
        t = get_transport(chroot_server.get_url())
3232
3303
        if inet:
3233
 
            server = smart.SmartServerPipeStreamMedium(sys.stdin, sys.stdout, t)
 
3304
            smart_server = medium.SmartServerPipeStreamMedium(
 
3305
                sys.stdin, sys.stdout, t)
3234
3306
        else:
3235
3307
            if port is None:
3236
 
                port = smart.BZR_DEFAULT_PORT
 
3308
                port = BZR_DEFAULT_PORT
3237
3309
                host = '127.0.0.1'
3238
3310
            else:
3239
3311
                if ':' in port:
3241
3313
                else:
3242
3314
                    host = '127.0.0.1'
3243
3315
                port = int(port)
3244
 
            server = smart.SmartTCPServer(t, host=host, port=port)
3245
 
            print 'listening on port: ', server.port
 
3316
            smart_server = server.SmartTCPServer(t, host=host, port=port)
 
3317
            print 'listening on port: ', smart_server.port
3246
3318
            sys.stdout.flush()
3247
 
        server.serve()
 
3319
        # for the duration of this server, no UI output is permitted.
 
3320
        # note that this may cause problems with blackbox tests. This should
 
3321
        # be changed with care though, as we dont want to use bandwidth sending
 
3322
        # progress over stderr to smart server clients!
 
3323
        old_factory = ui.ui_factory
 
3324
        try:
 
3325
            ui.ui_factory = ui.SilentUIFactory()
 
3326
            smart_server.serve()
 
3327
        finally:
 
3328
            ui.ui_factory = old_factory
 
3329
 
3248
3330
 
3249
3331
class cmd_join(Command):
3250
3332
    """Combine a subtree into its containing tree.
3267
3349
    and merge, will recurse into the subtree.
3268
3350
    """
3269
3351
 
 
3352
    _see_also = ['split']
3270
3353
    takes_args = ['tree']
3271
3354
    takes_options = [Option('reference', 'join by reference')]
3272
3355
    hidden = True
3308
3391
    subdirectory will be converted into an independent tree, with its own
3309
3392
    branch.  Commits in the top-level tree will not apply to the new subtree.
3310
3393
    If you want that behavior, do "bzr join --reference TREE".
3311
 
 
3312
 
    To undo this operation, do "bzr join TREE".
3313
3394
    """
3314
3395
 
 
3396
    _see_also = ['join']
3315
3397
    takes_args = ['tree']
3316
3398
 
3317
3399
    hidden = True
3427
3509
    --force, in which case the tag is moved to point to the new revision.
3428
3510
    """
3429
3511
 
 
3512
    _see_also = ['commit', 'tags']
3430
3513
    takes_args = ['tag_name']
3431
3514
    takes_options = [
3432
3515
        Option('delete',
3478
3561
    This tag shows a table of tag names and the revisions they reference.
3479
3562
    """
3480
3563
 
 
3564
    _see_also = ['tag']
3481
3565
    takes_options = [
3482
3566
        Option('directory',
3483
3567
            help='Branch whose tags should be displayed',
3503
3587
                  file_list=None, show_base=False, reprocess=False,
3504
3588
                  pull=False,
3505
3589
                  pb=DummyProgress(),
3506
 
                  change_reporter=None):
 
3590
                  change_reporter=None,
 
3591
                  other_rev_id=None):
3507
3592
    """Merge changes into a tree.
3508
3593
 
3509
3594
    base_revision
3559
3644
        merger.pp = ProgressPhase("Merge phase", 5, pb)
3560
3645
        merger.pp.next_phase()
3561
3646
        merger.check_basis(check_clean)
3562
 
        merger.set_other(other_revision)
 
3647
        if other_rev_id is not None:
 
3648
            merger.set_other_revision(other_rev_id, this_tree.branch)
 
3649
        else:
 
3650
            merger.set_other(other_revision)
3563
3651
        merger.pp.next_phase()
3564
3652
        merger.set_base(base_revision)
3565
3653
        if merger.base_rev_id == merger.other_rev_id: