~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
    osutils,
45
45
    registry,
46
46
    repository,
 
47
    revision as _mod_revision,
47
48
    revisionspec,
48
49
    symbol_versioning,
49
50
    transport,
155
156
    --short gives a status flags for each item, similar to the SVN's status
156
157
    command.
157
158
 
158
 
    Column 1: versioning / renames
159
 
      + File versioned
160
 
      - File unversioned
161
 
      R File renamed
162
 
      ? File unknown
163
 
      C File has conflicts
164
 
      P Entry for a pending merge (not a file)
165
 
 
166
 
    Column 2: Contents
167
 
      N File created
168
 
      D File deleted
169
 
      K File kind changed
170
 
      M File modified
171
 
 
172
 
    Column 3: Execute
173
 
      * The execute bit was changed
174
 
 
175
159
    If no arguments are specified, the status of the entire working
176
160
    directory is shown.  Otherwise, only the status of the specified
177
161
    files or directories is reported.  If a directory is given, status
185
169
    
186
170
    takes_args = ['file*']
187
171
    takes_options = ['show-ids', 'revision',
188
 
                     Option('short', help='Give short SVN-style status lines'),
189
 
                     Option('versioned', help='Only show versioned files')]
 
172
                     Option('short', help='Give short SVN-style status lines.'),
 
173
                     Option('versioned', help='Only show versioned files.')]
190
174
    aliases = ['st', 'stat']
191
175
 
192
176
    encoding_type = 'replace'
193
 
    _see_also = ['diff', 'revert']
 
177
    _see_also = ['diff', 'revert', 'status-flags']
194
178
    
195
179
    @display_command
196
180
    def run(self, show_ids=False, file_list=None, revision=None, short=False,
355
339
    into a subdirectory of this one.
356
340
    """
357
341
    takes_args = ['file*']
358
 
    takes_options = ['no-recurse', 'dry-run', 'verbose',
359
 
                     Option('file-ids-from', type=unicode,
360
 
                            help='Lookup file ids from here')]
 
342
    takes_options = [
 
343
        Option('no-recurse',
 
344
               help="Don't recursively add the contents of directories."),
 
345
        Option('dry-run',
 
346
               help="Show what would be done, but don't actually do anything."),
 
347
        'verbose',
 
348
        Option('file-ids-from',
 
349
               type=unicode,
 
350
               help='Lookup file ids from this tree.'),
 
351
        ]
361
352
    encoding_type = 'replace'
362
353
    _see_also = ['remove']
363
354
 
384
375
        if base_tree:
385
376
            base_tree.lock_read()
386
377
        try:
387
 
            added, ignored = bzrlib.add.smart_add(file_list, not no_recurse,
388
 
                action=action, save=not dry_run)
 
378
            file_list = self._maybe_expand_globs(file_list)
 
379
            if file_list:
 
380
                tree = WorkingTree.open_containing(file_list[0])[0]
 
381
            else:
 
382
                tree = WorkingTree.open_containing(u'.')[0]
 
383
            added, ignored = tree.smart_add(file_list, not
 
384
                no_recurse, action=action, save=not dry_run)
389
385
        finally:
390
386
            if base_tree is not None:
391
387
                base_tree.unlock()
448
444
 
449
445
    hidden = True
450
446
    _see_also = ['ls']
451
 
    takes_options = ['revision', 'show-ids', 'kind']
 
447
    takes_options = [
 
448
        'revision',
 
449
        'show-ids',
 
450
        Option('kind',
 
451
               help='List entries of a particular kind: file, directory, symlink.',
 
452
               type=unicode),
 
453
        ]
452
454
    takes_args = ['file*']
453
455
 
454
456
    @display_command
455
457
    def run(self, revision=None, show_ids=False, kind=None, file_list=None):
456
458
        if kind and kind not in ['file', 'directory', 'symlink']:
457
 
            raise errors.BzrCommandError('invalid kind specified')
 
459
            raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
458
460
 
459
461
        work_tree, file_list = tree_files(file_list)
460
462
        work_tree.lock_read()
518
520
    """
519
521
 
520
522
    takes_args = ['names*']
521
 
    takes_options = [Option("after", help="move only the bzr identifier"
522
 
        " of the file (file has already been moved). Use this flag if"
523
 
        " bzr is not able to detect this itself.")]
 
523
    takes_options = [Option("after", help="Move only the bzr identifier"
 
524
        " of the file, because the file has already been moved."),
 
525
        ]
524
526
    aliases = ['move', 'rename']
525
527
    encoding_type = 'replace'
526
528
 
565
567
    location can be accessed.
566
568
    """
567
569
 
568
 
    _see_also = ['push', 'update']
 
570
    _see_also = ['push', 'update', 'status-flags']
569
571
    takes_options = ['remember', 'overwrite', 'revision', 'verbose',
570
572
        Option('directory',
571
 
            help='branch to pull into, '
572
 
                 'rather than the one containing the working directory',
 
573
            help='Branch to pull into, '
 
574
                 'rather than the one containing the working directory.',
573
575
            short_name='d',
574
576
            type=unicode,
575
577
            ),
676
678
    takes_options = ['remember', 'overwrite', 'verbose',
677
679
        Option('create-prefix',
678
680
               help='Create the path leading up to the branch '
679
 
                    'if it does not already exist'),
 
681
                    'if it does not already exist.'),
680
682
        Option('directory',
681
 
            help='branch to push from, '
682
 
                 'rather than the one containing the working directory',
 
683
            help='Branch to push from, '
 
684
                 'rather than the one containing the working directory.',
683
685
            short_name='d',
684
686
            type=unicode,
685
687
            ),
686
688
        Option('use-existing-dir',
687
689
               help='By default push will fail if the target'
688
690
                    ' directory exists, but does not already'
689
 
                    ' have a control directory. This flag will'
 
691
                    ' have a control directory.  This flag will'
690
692
                    ' allow push to proceed.'),
691
693
        ]
692
694
    takes_args = ['location?']
753
755
                        "\nYou may supply --create-prefix to create all"
754
756
                        " leading parent directories."
755
757
                        % location)
756
 
 
757
758
                _create_prefix(to_transport)
758
759
 
759
760
            # Now the target directory exists, but doesn't have a .bzr
919
920
    takes_args = ['branch_location?', 'to_location?']
920
921
    takes_options = ['revision',
921
922
                     Option('lightweight',
922
 
                            help="perform a lightweight checkout. Lightweight "
 
923
                            help="Perform a lightweight checkout.  Lightweight "
923
924
                                 "checkouts depend on access to the branch for "
924
 
                                 "every operation. Normal checkouts can perform "
 
925
                                 "every operation.  Normal checkouts can perform "
925
926
                                 "common operations like diff and status without "
926
927
                                 "such access, and also support local commits."
927
928
                            ),
1022
1023
            tree.lock_tree_write()
1023
1024
        try:
1024
1025
            existing_pending_merges = tree.get_parent_ids()[1:]
1025
 
            last_rev = tree.last_revision()
1026
 
            if last_rev == tree.branch.last_revision():
 
1026
            last_rev = _mod_revision.ensure_null(tree.last_revision())
 
1027
            if last_rev == _mod_revision.ensure_null(
 
1028
                tree.branch.last_revision()):
1027
1029
                # may be up to date, check master too.
1028
1030
                master = tree.branch.get_master_branch()
1029
 
                if master is None or last_rev == master.last_revision():
 
1031
                if master is None or last_rev == _mod_revision.ensure_null(
 
1032
                    master.last_revision()):
1030
1033
                    revno = tree.branch.revision_id_to_revno(last_rev)
1031
1034
                    note("Tree is up to date at revision %d." % (revno,))
1032
1035
                    return 0
1033
 
            conflicts = tree.update()
1034
 
            revno = tree.branch.revision_id_to_revno(tree.last_revision())
 
1036
            conflicts = tree.update(delta._ChangeReporter(
 
1037
                                        unversioned_filter=tree.is_ignored))
 
1038
            revno = tree.branch.revision_id_to_revno(
 
1039
                _mod_revision.ensure_null(tree.last_revision()))
1035
1040
            note('Updated to revision %d.' % (revno,))
1036
1041
            if tree.get_parent_ids()[1:] != existing_pending_merges:
1037
1042
                note('Your local commits will now show as pending merges with '
1077
1082
    """
1078
1083
    takes_args = ['file*']
1079
1084
    takes_options = ['verbose',
1080
 
        Option('new', help='remove newly-added files'),
 
1085
        Option('new', help='Remove newly-added files.'),
1081
1086
        RegistryOption.from_kwargs('file-deletion-strategy',
1082
1087
            'The file deletion mode to be used',
1083
1088
            title='Deletion Strategy', value_switches=True, enum_switch=False,
1251
1256
    takes_options = [
1252
1257
        Option('create-prefix',
1253
1258
               help='Create the path leading up to the branch '
1254
 
                    'if it does not already exist'),
 
1259
                    'if it does not already exist.'),
1255
1260
         RegistryOption('format',
1256
1261
                help='Specify a format for this branch. '
1257
1262
                'See "help formats".',
1336
1341
    takes_args = ["location"]
1337
1342
    takes_options = [RegistryOption('format',
1338
1343
                            help='Specify a format for this repository. See'
1339
 
                                 ' "bzr help formats" for details',
 
1344
                                 ' "bzr help formats" for details.',
1340
1345
                            registry=bzrdir.format_registry,
1341
1346
                            converter=bzrdir.format_registry.make_bzrdir,
1342
1347
                            value_switches=True, title='Repository format'),
1343
1348
                     Option('no-trees',
1344
1349
                             help='Branches in the repository will default to'
1345
 
                                  ' not having a working tree'),
 
1350
                                  ' not having a working tree.'),
1346
1351
                    ]
1347
1352
    aliases = ["init-repo"]
1348
1353
 
1397
1402
 
1398
1403
    _see_also = ['status']
1399
1404
    takes_args = ['file*']
1400
 
    takes_options = ['revision', 'diff-options',
 
1405
    takes_options = [
 
1406
        Option('diff-options', type=str,
 
1407
               help='Pass these options to the external diff program.'),
1401
1408
        Option('prefix', type=str,
1402
1409
               short_name='p',
1403
1410
               help='Set prefixes to added to old and new filenames, as '
1404
 
                    'two values separated by a colon. (eg "old/:new/")'),
 
1411
                    'two values separated by a colon. (eg "old/:new/").'),
 
1412
        'revision',
1405
1413
        ]
1406
1414
    aliases = ['di', 'dif']
1407
1415
    encoding_type = 'exact'
1592
1600
    # TODO: Make --revision support uuid: and hash: [future tag:] notation.
1593
1601
 
1594
1602
    takes_args = ['location?']
1595
 
    takes_options = [Option('forward', 
1596
 
                            help='show from oldest to newest'),
1597
 
                     'timezone', 
1598
 
                     Option('verbose', 
1599
 
                             short_name='v',
1600
 
                             help='show files changed in each revision'),
1601
 
                     'show-ids', 'revision',
1602
 
                     'log-format',
1603
 
                     Option('message',
1604
 
                            short_name='m',
1605
 
                            help='show revisions whose message matches this regexp',
1606
 
                            type=str),
1607
 
                     Option('limit', 
1608
 
                            help='limit the output to the first N revisions',
1609
 
                            type=_parse_limit),
1610
 
                     ]
 
1603
    takes_options = [
 
1604
            Option('forward',
 
1605
                   help='Show from oldest to newest.'),
 
1606
            Option('timezone',
 
1607
                   type=str,
 
1608
                   help='Display timezone as local, original, or utc.'),
 
1609
            Option('verbose',
 
1610
                   short_name='v',
 
1611
                   help='Show files changed in each revision.'),
 
1612
            'show-ids',
 
1613
            'revision',
 
1614
            'log-format',
 
1615
            Option('message',
 
1616
                   short_name='m',
 
1617
                   help='Show revisions whose message matches this '
 
1618
                        'regular expression.',
 
1619
                   type=str),
 
1620
            Option('limit',
 
1621
                   help='Limit the output to the first N revisions.',
 
1622
                   argname='N',
 
1623
                   type=_parse_limit),
 
1624
            ]
1611
1625
    encoding_type = 'replace'
1612
1626
 
1613
1627
    @display_command
1656
1670
                rev1 = None
1657
1671
                rev2 = None
1658
1672
            elif len(revision) == 1:
1659
 
                rev1 = rev2 = revision[0].in_history(b).revno
 
1673
                rev1 = rev2 = revision[0].in_history(b)
1660
1674
            elif len(revision) == 2:
1661
1675
                if revision[1].get_branch() != revision[0].get_branch():
1662
1676
                    # b is taken from revision[0].get_branch(), and
1665
1679
                    raise errors.BzrCommandError(
1666
1680
                        "Log doesn't accept two revisions in different"
1667
1681
                        " branches.")
1668
 
                if revision[0].spec is None:
1669
 
                    # missing begin-range means first revision
1670
 
                    rev1 = 1
1671
 
                else:
1672
 
                    rev1 = revision[0].in_history(b).revno
1673
 
 
1674
 
                if revision[1].spec is None:
1675
 
                    # missing end-range means last known revision
1676
 
                    rev2 = b.revno()
1677
 
                else:
1678
 
                    rev2 = revision[1].in_history(b).revno
 
1682
                rev1 = revision[0].in_history(b)
 
1683
                rev2 = revision[1].in_history(b)
1679
1684
            else:
1680
1685
                raise errors.BzrCommandError(
1681
1686
                    'bzr log --revision takes one or two values.')
1682
1687
 
1683
 
            # By this point, the revision numbers are converted to the +ve
1684
 
            # form if they were supplied in the -ve form, so we can do
1685
 
            # this comparison in relative safety
1686
 
            if rev1 > rev2:
1687
 
                (rev2, rev1) = (rev1, rev2)
1688
 
 
1689
1688
            if log_format is None:
1690
1689
                log_format = log.log_formatter_registry.get_default(b)
1691
1690
 
1741
1740
    _see_also = ['status', 'cat']
1742
1741
    takes_args = ['path?']
1743
1742
    # TODO: Take a revision or remote path and list that tree instead.
1744
 
    takes_options = ['verbose', 'revision',
1745
 
                     Option('non-recursive',
1746
 
                            help='don\'t recurse into sub-directories'),
1747
 
                     Option('from-root',
1748
 
                            help='Print all paths from the root of the branch.'),
1749
 
                     Option('unknown', help='Print unknown files'),
1750
 
                     Option('versioned', help='Print versioned files'),
1751
 
                     Option('ignored', help='Print ignored files'),
1752
 
 
1753
 
                     Option('null', help='Null separate the files'),
1754
 
                     'kind', 'show-ids'
1755
 
                    ]
 
1743
    takes_options = [
 
1744
            'verbose',
 
1745
            'revision',
 
1746
            Option('non-recursive',
 
1747
                   help='Don\'t recurse into subdirectories.'),
 
1748
            Option('from-root',
 
1749
                   help='Print paths relative to the root of the branch.'),
 
1750
            Option('unknown', help='Print unknown files.'),
 
1751
            Option('versioned', help='Print versioned files.'),
 
1752
            Option('ignored', help='Print ignored files.'),
 
1753
            Option('null',
 
1754
                   help='Write an ascii NUL (\\0) separator '
 
1755
                   'between files rather than a newline.'),
 
1756
            Option('kind',
 
1757
                   help='List entries of a particular kind: file, directory, symlink.',
 
1758
                   type=unicode),
 
1759
            'show-ids',
 
1760
            ]
1756
1761
    @display_command
1757
 
    def run(self, revision=None, verbose=False, 
 
1762
    def run(self, revision=None, verbose=False,
1758
1763
            non_recursive=False, from_root=False,
1759
1764
            unknown=False, versioned=False, ignored=False,
1760
1765
            null=False, kind=None, show_ids=False, path=None):
1876
1881
    _see_also = ['status', 'ignored']
1877
1882
    takes_args = ['name_pattern*']
1878
1883
    takes_options = [
1879
 
                     Option('old-default-rules',
1880
 
                            help='Out the ignore rules bzr < 0.9 always used.')
1881
 
                     ]
 
1884
        Option('old-default-rules',
 
1885
               help='Write out the ignore rules bzr < 0.9 always used.')
 
1886
        ]
1882
1887
    
1883
1888
    def run(self, name_pattern_list=None, old_default_rules=None):
1884
1889
        from bzrlib.atomicfile import AtomicFile
1993
1998
         zip                          .zip
1994
1999
    """
1995
2000
    takes_args = ['dest', 'branch?']
1996
 
    takes_options = ['revision', 'format', 'root']
 
2001
    takes_options = [
 
2002
        Option('format',
 
2003
               help="Type of file to export to.",
 
2004
               type=unicode),
 
2005
        'revision',
 
2006
        Option('root',
 
2007
               type=str,
 
2008
               help="Name of the root directory inside the exported file."),
 
2009
        ]
1997
2010
    def run(self, dest, branch=None, revision=None, format=None, root=None):
1998
2011
        from bzrlib.export import export
1999
2012
 
2027
2040
    """
2028
2041
 
2029
2042
    _see_also = ['ls']
2030
 
    takes_options = ['revision', 'name-from-revision']
 
2043
    takes_options = [
 
2044
        Option('name-from-revision', help='The path name in the old tree.'),
 
2045
        'revision',
 
2046
        ]
2031
2047
    takes_args = ['filename']
2032
2048
    encoding_type = 'exact'
2033
2049
 
2120
2136
 
2121
2137
    _see_also = ['bugs', 'uncommit']
2122
2138
    takes_args = ['selected*']
2123
 
    takes_options = ['message', 'verbose', 
2124
 
                     Option('unchanged',
2125
 
                            help='commit even if nothing has changed'),
2126
 
                     Option('file', type=str, 
2127
 
                            short_name='F',
2128
 
                            argname='msgfile',
2129
 
                            help='file containing commit message'),
2130
 
                     Option('strict',
2131
 
                            help="refuse to commit if there are unknown "
2132
 
                            "files in the working tree."),
2133
 
                     ListOption('fixes', type=str,
2134
 
                                help="mark a bug as being fixed by this "
2135
 
                                     "revision."),
2136
 
                     Option('local',
2137
 
                            help="perform a local only commit in a bound "
2138
 
                                 "branch. Such commits are not pushed to "
2139
 
                                 "the master branch until a normal commit "
2140
 
                                 "is performed."
2141
 
                            ),
2142
 
                     ]
 
2139
    takes_options = [
 
2140
            Option('message', type=unicode,
 
2141
                   short_name='m',
 
2142
                   help="Description of the new revision."),
 
2143
            'verbose',
 
2144
             Option('unchanged',
 
2145
                    help='Commit even if nothing has changed.'),
 
2146
             Option('file', type=str,
 
2147
                    short_name='F',
 
2148
                    argname='msgfile',
 
2149
                    help='Take commit message from this file.'),
 
2150
             Option('strict',
 
2151
                    help="Refuse to commit if there are unknown "
 
2152
                    "files in the working tree."),
 
2153
             ListOption('fixes', type=str,
 
2154
                    help="Mark a bug as being fixed by this revision."),
 
2155
             Option('local',
 
2156
                    help="Perform a local commit in a bound "
 
2157
                         "branch.  Local commits are not pushed to "
 
2158
                         "the master branch until a normal commit "
 
2159
                         "is performed."
 
2160
                    ),
 
2161
             ]
2143
2162
    aliases = ['ci', 'checkin']
2144
2163
 
2145
2164
    def _get_bug_fix_properties(self, fixes, branch):
2276
2295
    takes_options = [
2277
2296
                    RegistryOption('format',
2278
2297
                        help='Upgrade to a specific format.  See "bzr help'
2279
 
                             ' formats" for details',
 
2298
                             ' formats" for details.',
2280
2299
                        registry=bzrdir.format_registry,
2281
2300
                        converter=bzrdir.format_registry.make_bzrdir,
2282
2301
                        value_switches=True, title='Branch format'),
2297
2316
        bzr whoami 'Frank Chu <fchu@example.com>'
2298
2317
    """
2299
2318
    takes_options = [ Option('email',
2300
 
                             help='display email address only'),
 
2319
                             help='Display email address only.'),
2301
2320
                      Option('branch',
2302
 
                             help='set identity for the current branch instead of '
2303
 
                                  'globally'),
 
2321
                             help='Set identity for the current branch instead of '
 
2322
                                  'globally.'),
2304
2323
                    ]
2305
2324
    takes_args = ['name?']
2306
2325
    encoding_type = 'replace'
2386
2405
    modified by plugins will not be tested, and tests provided by plugins will
2387
2406
    not be run.
2388
2407
 
 
2408
    Tests that need working space on disk use a common temporary directory, 
 
2409
    typically inside $TMPDIR or /tmp.
 
2410
 
2389
2411
    examples::
2390
2412
        bzr selftest ignore
2391
2413
            run only tests relating to 'ignore'
2392
2414
        bzr --no-plugins selftest -v
2393
2415
            disable plugins and list tests as they're run
2394
 
 
2395
 
    For each test, that needs actual disk access, bzr create their own
2396
 
    subdirectory in the temporary testing directory (testXXXX.tmp).
2397
 
    By default the name of such subdirectory is based on the name of the test.
2398
 
    If option '--numbered-dirs' is given, bzr will use sequent numbers
2399
 
    of running tests to create such subdirectories. This is default behavior
2400
 
    on Windows because of path length limitation.
2401
2416
    """
2402
2417
    # NB: this is used from the class without creating an instance, which is
2403
2418
    # why it does not have a self parameter.
2420
2435
    takes_args = ['testspecs*']
2421
2436
    takes_options = ['verbose',
2422
2437
                     Option('one',
2423
 
                             help='stop when one test fails',
 
2438
                             help='Stop when one test fails.',
2424
2439
                             short_name='1',
2425
2440
                             ),
2426
 
                     Option('keep-output',
2427
 
                            help='keep output directories when tests fail'),
2428
2441
                     Option('transport',
2429
2442
                            help='Use a different transport by default '
2430
2443
                                 'throughout the test suite.',
2431
2444
                            type=get_transport_type),
2432
 
                     Option('benchmark', help='run the bzr benchmarks.'),
 
2445
                     Option('benchmark',
 
2446
                            help='Run the benchmarks rather than selftests.'),
2433
2447
                     Option('lsprof-timed',
2434
 
                            help='generate lsprof output for benchmarked'
 
2448
                            help='Generate lsprof output for benchmarked'
2435
2449
                                 ' sections of code.'),
2436
2450
                     Option('cache-dir', type=str,
2437
 
                            help='a directory to cache intermediate'
2438
 
                                 ' benchmark steps'),
2439
 
                     Option('clean-output',
2440
 
                            help='clean temporary tests directories'
2441
 
                                 ' without running tests'),
 
2451
                            help='Cache intermediate benchmark output in this '
 
2452
                                 'directory.'),
2442
2453
                     Option('first',
2443
 
                            help='run all tests, but run specified tests first',
 
2454
                            help='Run all tests, but run specified tests first.',
2444
2455
                            short_name='f',
2445
2456
                            ),
2446
 
                     Option('numbered-dirs',
2447
 
                            help='use numbered dirs for TestCaseInTempDir'),
2448
2457
                     Option('list-only',
2449
 
                            help='list the tests instead of running them'),
 
2458
                            help='List the tests instead of running them.'),
2450
2459
                     Option('randomize', type=str, argname="SEED",
2451
 
                            help='randomize the order of tests using the given'
2452
 
                                 ' seed or "now" for the current time'),
 
2460
                            help='Randomize the order of tests using the given'
 
2461
                                 ' seed or "now" for the current time.'),
2453
2462
                     Option('exclude', type=str, argname="PATTERN",
2454
2463
                            short_name='x',
2455
 
                            help='exclude tests that match this regular'
2456
 
                                 ' expression'),
 
2464
                            help='Exclude tests that match this regular'
 
2465
                                 ' expression.'),
2457
2466
                     ]
2458
2467
    encoding_type = 'replace'
2459
2468
 
2460
2469
    def run(self, testspecs_list=None, verbose=None, one=False,
2461
 
            keep_output=False, transport=None, benchmark=None,
2462
 
            lsprof_timed=None, cache_dir=None, clean_output=False,
2463
 
            first=False, numbered_dirs=None, list_only=False,
 
2470
            transport=None, benchmark=None,
 
2471
            lsprof_timed=None, cache_dir=None,
 
2472
            first=False, list_only=False,
2464
2473
            randomize=None, exclude=None):
2465
2474
        import bzrlib.ui
2466
2475
        from bzrlib.tests import selftest
2467
2476
        import bzrlib.benchmarks as benchmarks
2468
2477
        from bzrlib.benchmarks import tree_creator
2469
 
 
2470
 
        if clean_output:
2471
 
            from bzrlib.tests import clean_selftest_output
2472
 
            clean_selftest_output()
2473
 
            return 0
2474
 
        if keep_output:
2475
 
            warning("notice: selftest --keep-output "
2476
 
                    "is no longer supported; "
2477
 
                    "test output is always removed")
2478
 
 
2479
 
        if numbered_dirs is None and sys.platform == 'win32':
2480
 
            numbered_dirs = True
 
2478
        from bzrlib.version import show_version
2481
2479
 
2482
2480
        if cache_dir is not None:
2483
2481
            tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
2484
 
        print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
2485
 
        print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
 
2482
        if not list_only:
 
2483
            show_version(show_config=False, show_copyright=False)
2486
2484
        print
2487
2485
        if testspecs_list is not None:
2488
2486
            pattern = '|'.join(testspecs_list)
2500
2498
                verbose = False
2501
2499
            benchfile = None
2502
2500
        try:
2503
 
            result = selftest(verbose=verbose, 
 
2501
            result = selftest(verbose=verbose,
2504
2502
                              pattern=pattern,
2505
 
                              stop_on_failure=one, 
 
2503
                              stop_on_failure=one,
2506
2504
                              transport=transport,
2507
2505
                              test_suite_factory=test_suite_factory,
2508
2506
                              lsprof_timed=lsprof_timed,
2509
2507
                              bench_history=benchfile,
2510
2508
                              matching_tests_first=first,
2511
 
                              numbered_dirs=numbered_dirs,
2512
2509
                              list_only=list_only,
2513
2510
                              random_seed=randomize,
2514
2511
                              exclude_pattern=exclude
2609
2606
    --force is given.
2610
2607
    """
2611
2608
 
2612
 
    _see_also = ['update', 'remerge']
 
2609
    _see_also = ['update', 'remerge', 'status-flags']
2613
2610
    takes_args = ['branch?']
2614
 
    takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
 
2611
    takes_options = [
 
2612
        'revision',
 
2613
        Option('force',
 
2614
               help='Merge even if the destination tree has uncommitted changes.'),
 
2615
        'merge-type',
 
2616
        'reprocess',
 
2617
        'remember',
2615
2618
        Option('show-base', help="Show base revision text in "
2616
 
               "conflicts"),
 
2619
               "conflicts."),
2617
2620
        Option('uncommitted', help='Apply uncommitted changes'
2618
 
               ' from a working copy, instead of branch changes'),
 
2621
               ' from a working copy, instead of branch changes.'),
2619
2622
        Option('pull', help='If the destination is already'
2620
2623
                ' completely merged into the source, pull from the'
2621
 
                ' source rather than merging. When this happens,'
 
2624
                ' source rather than merging.  When this happens,'
2622
2625
                ' you do not need to commit the result.'),
2623
2626
        Option('directory',
2624
 
            help='Branch to merge into, '
2625
 
                 'rather than the one containing the working directory',
2626
 
            short_name='d',
2627
 
            type=unicode,
2628
 
            ),
 
2627
               help='Branch to merge into, '
 
2628
                    'rather than the one containing the working directory.',
 
2629
               short_name='d',
 
2630
               type=unicode,
 
2631
               ),
2629
2632
    ]
2630
2633
 
2631
2634
    def run(self, branch=None, revision=None, force=False, merge_type=None,
2787
2790
        additional processing to reduce the size of conflict regions.
2788
2791
    """
2789
2792
    takes_args = ['file*']
2790
 
    takes_options = ['merge-type', 'reprocess',
2791
 
                     Option('show-base', help="Show base revision text in "
2792
 
                            "conflicts")]
 
2793
    takes_options = [
 
2794
            'merge-type',
 
2795
            'reprocess',
 
2796
            Option('show-base',
 
2797
                   help="Show base revision text in conflicts."),
 
2798
            ]
2793
2799
 
2794
2800
    def run(self, file_list=None, merge_type=None, show_base=False,
2795
2801
            reprocess=False):
2877
2883
    """
2878
2884
 
2879
2885
    _see_also = ['cat', 'export']
2880
 
    takes_options = ['revision', 'no-backup']
 
2886
    takes_options = [
 
2887
            'revision',
 
2888
            Option('no-backup', "Do not save backups of reverted files."),
 
2889
            ]
2881
2890
    takes_args = ['file*']
2882
2891
 
2883
2892
    def run(self, revision=None, no_backup=False, file_list=None):
2919
2928
    """
2920
2929
 
2921
2930
    _see_also = ['topics']
2922
 
    takes_options = [Option('long', 'show help on all commands')]
 
2931
    takes_options = [
 
2932
            Option('long', 'Show help on all commands.'),
 
2933
            ]
2923
2934
    takes_args = ['topic?']
2924
2935
    aliases = ['?', '--help', '-?', '-h']
2925
2936
    
2968
2979
 
2969
2980
    _see_also = ['merge', 'pull']
2970
2981
    takes_args = ['other_branch?']
2971
 
    takes_options = [Option('reverse', 'Reverse the order of revisions'),
2972
 
                     Option('mine-only', 
2973
 
                            'Display changes in the local branch only'),
2974
 
                     Option('this' , 'same as --mine-only'),
2975
 
                     Option('theirs-only', 
2976
 
                            'Display changes in the remote branch only'),
2977
 
                     Option('other', 'same as --theirs-only'),
2978
 
                     'log-format',
2979
 
                     'show-ids',
2980
 
                     'verbose'
2981
 
                     ]
 
2982
    takes_options = [
 
2983
            Option('reverse', 'Reverse the order of revisions.'),
 
2984
            Option('mine-only',
 
2985
                   'Display changes in the local branch only.'),
 
2986
            Option('this' , 'Same as --mine-only.'),
 
2987
            Option('theirs-only',
 
2988
                   'Display changes in the remote branch only.'),
 
2989
            Option('other', 'Same as --theirs-only.'),
 
2990
            'log-format',
 
2991
            'show-ids',
 
2992
            'verbose'
 
2993
            ]
2982
2994
    encoding_type = 'replace'
2983
2995
 
2984
2996
    @display_command
3057
3069
        return status_code
3058
3070
 
3059
3071
 
 
3072
class cmd_pack(Command):
 
3073
    """Compress the data within a repository."""
 
3074
 
 
3075
    _see_also = ['repositories']
 
3076
    takes_args = ['branch_or_repo?']
 
3077
 
 
3078
    def run(self, branch_or_repo='.'):
 
3079
        dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
 
3080
        try:
 
3081
            branch = dir.open_branch()
 
3082
            repository = branch.repository
 
3083
        except errors.NotBranchError:
 
3084
            repository = dir.open_repository()
 
3085
        repository.pack()
 
3086
 
 
3087
 
3060
3088
class cmd_plugins(Command):
3061
3089
    """List plugins"""
3062
3090
    hidden = True
3079
3107
 
3080
3108
class cmd_testament(Command):
3081
3109
    """Show testament (signing-form) of a revision."""
3082
 
    takes_options = ['revision',
3083
 
                     Option('long', help='Produce long-format testament'), 
3084
 
                     Option('strict', help='Produce a strict-format'
3085
 
                            ' testament')]
 
3110
    takes_options = [
 
3111
            'revision',
 
3112
            Option('long', help='Produce long-format testament.'),
 
3113
            Option('strict',
 
3114
                   help='Produce a strict-format testament.')]
3086
3115
    takes_args = ['branch?']
3087
3116
    @display_command
3088
3117
    def run(self, branch=u'.', revision=None, long=False, strict=False):
3121
3150
    #       with new uncommitted lines marked
3122
3151
    aliases = ['ann', 'blame', 'praise']
3123
3152
    takes_args = ['filename']
3124
 
    takes_options = [Option('all', help='show annotations on all lines'),
3125
 
                     Option('long', help='show date in annotations'),
 
3153
    takes_options = [Option('all', help='Show annotations on all lines.'),
 
3154
                     Option('long', help='Show commit date in annotations.'),
3126
3155
                     'revision',
3127
3156
                     'show-ids',
3128
3157
                     ]
 
3158
    encoding_type = 'exact'
3129
3159
 
3130
3160
    @display_command
3131
3161
    def run(self, filename, all=False, long=False, revision=None,
3146
3176
                raise errors.NotVersionedError(filename)
3147
3177
            tree = branch.repository.revision_tree(revision_id)
3148
3178
            file_version = tree.inventory[file_id].revision
3149
 
            annotate_file(branch, file_version, file_id, long, all, sys.stdout,
 
3179
            annotate_file(branch, file_version, file_id, long, all, self.outf,
3150
3180
                          show_ids=show_ids)
3151
3181
        finally:
3152
3182
            branch.unlock()
3257
3287
    # information in shared branches as well.
3258
3288
    _see_also = ['commit']
3259
3289
    takes_options = ['verbose', 'revision',
3260
 
                    Option('dry-run', help='Don\'t actually make changes'),
 
3290
                    Option('dry-run', help='Don\'t actually make changes.'),
3261
3291
                    Option('force', help='Say yes to all questions.')]
3262
3292
    takes_args = ['location?']
3263
3293
    aliases = []
3367
3397
 
3368
3398
    takes_options = [
3369
3399
        Option('inet',
3370
 
               help='serve on stdin/out for use from inetd or sshd'),
 
3400
               help='Serve on stdin/out for use from inetd or sshd.'),
3371
3401
        Option('port',
3372
 
               help='listen for connections on nominated port of the form '
3373
 
                    '[hostname:]portnumber. Passing 0 as the port number will '
3374
 
                    'result in a dynamically allocated port. Default port is '
 
3402
               help='Listen for connections on nominated port of the form '
 
3403
                    '[hostname:]portnumber.  Passing 0 as the port number will '
 
3404
                    'result in a dynamically allocated port.  The default port is '
3375
3405
                    '4155.',
3376
3406
               type=str),
3377
3407
        Option('directory',
3378
 
               help='serve contents of directory',
 
3408
               help='Serve contents of this directory.',
3379
3409
               type=unicode),
3380
3410
        Option('allow-writes',
3381
 
               help='By default the server is a readonly server. Supplying '
 
3411
               help='By default the server is a readonly server.  Supplying '
3382
3412
                    '--allow-writes enables write access to the contents of '
3383
 
                    'the served directory and below. '
 
3413
                    'the served directory and below.'
3384
3414
                ),
3385
3415
        ]
3386
3416
 
3446
3476
 
3447
3477
    _see_also = ['split']
3448
3478
    takes_args = ['tree']
3449
 
    takes_options = [Option('reference', 'join by reference')]
 
3479
    takes_options = [
 
3480
            Option('reference', help='Join by reference.'),
 
3481
            ]
3450
3482
    hidden = True
3451
3483
 
3452
3484
    def run(self, tree, reference=False):
3527
3559
    takes_options = [
3528
3560
        RegistryOption.from_kwargs('patch-type',
3529
3561
            'The type of patch to include in the directive',
3530
 
            title='Patch type', value_switches=True, enum_switch=False,
3531
 
            bundle='Bazaar revision bundle (default)',
3532
 
            diff='Normal unified diff',
3533
 
            plain='No patch, just directive'),
3534
 
        Option('sign', help='GPG-sign the directive'), 'revision',
 
3562
            title='Patch type',
 
3563
            value_switches=True,
 
3564
            enum_switch=False,
 
3565
            bundle='Bazaar revision bundle (default).',
 
3566
            diff='Normal unified diff.',
 
3567
            plain='No patch, just directive.'),
 
3568
        Option('sign', help='GPG-sign the directive.'), 'revision',
3535
3569
        Option('mail-to', type=str,
3536
 
            help='Instead of printing the directive, email to this address'),
 
3570
            help='Instead of printing the directive, email to this address.'),
3537
3571
        Option('message', type=str, short_name='m',
3538
 
            help='Message to use when committing this merge')
 
3572
            help='Message to use when committing this merge.')
3539
3573
        ]
3540
3574
 
3541
3575
    encoding_type = 'exact'
3618
3652
            type=unicode,
3619
3653
            ),
3620
3654
        Option('force',
3621
 
            help='Replace existing tags',
 
3655
            help='Replace existing tags.',
3622
3656
            ),
3623
3657
        'revision',
3624
3658
        ]
3661
3695
    _see_also = ['tag']
3662
3696
    takes_options = [
3663
3697
        Option('directory',
3664
 
            help='Branch whose tags should be displayed',
 
3698
            help='Branch whose tags should be displayed.',
3665
3699
            short_name='d',
3666
3700
            type=unicode,
3667
3701
            ),
3779
3813
    while True:
3780
3814
        new_transport = cur_transport.clone('..')
3781
3815
        if new_transport.base == cur_transport.base:
3782
 
            raise errors.BzrCommandError("Failed to create path"
3783
 
                                         " prefix for %s."
3784
 
                                         % location)
 
3816
            raise errors.BzrCommandError(
 
3817
                "Failed to create path prefix for %s."
 
3818
                % cur_transport.base)
3785
3819
        try:
3786
3820
            new_transport.mkdir('.')
3787
3821
        except errors.NoSuchFile:
3789
3823
            cur_transport = new_transport
3790
3824
        else:
3791
3825
            break
3792
 
 
3793
3826
    # Now we only need to create child directories
3794
3827
    while needed:
3795
3828
        cur_transport = needed.pop()
3796
3829
        cur_transport.ensure_base()
3797
3830
 
 
3831
 
3798
3832
# Compatibility
3799
3833
merge = _merge_helper
3800
3834