~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: John Arbash Meinel
  • Date: 2007-07-13 02:23:34 UTC
  • mfrom: (2592 +trunk) (2612 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2614.
  • Revision ID: john@arbash-meinel.com-20070713022334-qb6ewgo6v4251yd9
[merge] bzr.dev 2612

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
2478
 
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
2481
 
 
2482
2479
        if cache_dir is not None:
2483
2480
            tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
2484
2481
        print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
2500
2497
                verbose = False
2501
2498
            benchfile = None
2502
2499
        try:
2503
 
            result = selftest(verbose=verbose, 
 
2500
            result = selftest(verbose=verbose,
2504
2501
                              pattern=pattern,
2505
 
                              stop_on_failure=one, 
 
2502
                              stop_on_failure=one,
2506
2503
                              transport=transport,
2507
2504
                              test_suite_factory=test_suite_factory,
2508
2505
                              lsprof_timed=lsprof_timed,
2509
2506
                              bench_history=benchfile,
2510
2507
                              matching_tests_first=first,
2511
 
                              numbered_dirs=numbered_dirs,
2512
2508
                              list_only=list_only,
2513
2509
                              random_seed=randomize,
2514
2510
                              exclude_pattern=exclude
2609
2605
    --force is given.
2610
2606
    """
2611
2607
 
2612
 
    _see_also = ['update', 'remerge']
 
2608
    _see_also = ['update', 'remerge', 'status-flags']
2613
2609
    takes_args = ['branch?']
2614
 
    takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
 
2610
    takes_options = [
 
2611
        'revision',
 
2612
        Option('force',
 
2613
               help='Merge even if the destination tree has uncommitted changes.'),
 
2614
        'merge-type',
 
2615
        'reprocess',
 
2616
        'remember',
2615
2617
        Option('show-base', help="Show base revision text in "
2616
 
               "conflicts"),
 
2618
               "conflicts."),
2617
2619
        Option('uncommitted', help='Apply uncommitted changes'
2618
 
               ' from a working copy, instead of branch changes'),
 
2620
               ' from a working copy, instead of branch changes.'),
2619
2621
        Option('pull', help='If the destination is already'
2620
2622
                ' completely merged into the source, pull from the'
2621
 
                ' source rather than merging. When this happens,'
 
2623
                ' source rather than merging.  When this happens,'
2622
2624
                ' you do not need to commit the result.'),
2623
2625
        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
 
            ),
 
2626
               help='Branch to merge into, '
 
2627
                    'rather than the one containing the working directory.',
 
2628
               short_name='d',
 
2629
               type=unicode,
 
2630
               ),
2629
2631
    ]
2630
2632
 
2631
2633
    def run(self, branch=None, revision=None, force=False, merge_type=None,
2787
2789
        additional processing to reduce the size of conflict regions.
2788
2790
    """
2789
2791
    takes_args = ['file*']
2790
 
    takes_options = ['merge-type', 'reprocess',
2791
 
                     Option('show-base', help="Show base revision text in "
2792
 
                            "conflicts")]
 
2792
    takes_options = [
 
2793
            'merge-type',
 
2794
            'reprocess',
 
2795
            Option('show-base',
 
2796
                   help="Show base revision text in conflicts."),
 
2797
            ]
2793
2798
 
2794
2799
    def run(self, file_list=None, merge_type=None, show_base=False,
2795
2800
            reprocess=False):
2877
2882
    """
2878
2883
 
2879
2884
    _see_also = ['cat', 'export']
2880
 
    takes_options = ['revision', 'no-backup']
 
2885
    takes_options = [
 
2886
            'revision',
 
2887
            Option('no-backup', "Do not save backups of reverted files."),
 
2888
            ]
2881
2889
    takes_args = ['file*']
2882
2890
 
2883
2891
    def run(self, revision=None, no_backup=False, file_list=None):
2919
2927
    """
2920
2928
 
2921
2929
    _see_also = ['topics']
2922
 
    takes_options = [Option('long', 'show help on all commands')]
 
2930
    takes_options = [
 
2931
            Option('long', 'Show help on all commands.'),
 
2932
            ]
2923
2933
    takes_args = ['topic?']
2924
2934
    aliases = ['?', '--help', '-?', '-h']
2925
2935
    
2968
2978
 
2969
2979
    _see_also = ['merge', 'pull']
2970
2980
    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
 
                     ]
 
2981
    takes_options = [
 
2982
            Option('reverse', 'Reverse the order of revisions.'),
 
2983
            Option('mine-only',
 
2984
                   'Display changes in the local branch only.'),
 
2985
            Option('this' , 'Same as --mine-only.'),
 
2986
            Option('theirs-only',
 
2987
                   'Display changes in the remote branch only.'),
 
2988
            Option('other', 'Same as --theirs-only.'),
 
2989
            'log-format',
 
2990
            'show-ids',
 
2991
            'verbose'
 
2992
            ]
2982
2993
    encoding_type = 'replace'
2983
2994
 
2984
2995
    @display_command
3057
3068
        return status_code
3058
3069
 
3059
3070
 
 
3071
class cmd_pack(Command):
 
3072
    """Compress the data within a repository."""
 
3073
 
 
3074
    _see_also = ['repositories']
 
3075
    takes_args = ['branch_or_repo?']
 
3076
 
 
3077
    def run(self, branch_or_repo='.'):
 
3078
        dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
 
3079
        try:
 
3080
            branch = dir.open_branch()
 
3081
            repository = branch.repository
 
3082
        except errors.NotBranchError:
 
3083
            repository = dir.open_repository()
 
3084
        repository.pack()
 
3085
 
 
3086
 
3060
3087
class cmd_plugins(Command):
3061
3088
    """List plugins"""
3062
3089
    hidden = True
3079
3106
 
3080
3107
class cmd_testament(Command):
3081
3108
    """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')]
 
3109
    takes_options = [
 
3110
            'revision',
 
3111
            Option('long', help='Produce long-format testament.'),
 
3112
            Option('strict',
 
3113
                   help='Produce a strict-format testament.')]
3086
3114
    takes_args = ['branch?']
3087
3115
    @display_command
3088
3116
    def run(self, branch=u'.', revision=None, long=False, strict=False):
3121
3149
    #       with new uncommitted lines marked
3122
3150
    aliases = ['ann', 'blame', 'praise']
3123
3151
    takes_args = ['filename']
3124
 
    takes_options = [Option('all', help='show annotations on all lines'),
3125
 
                     Option('long', help='show date in annotations'),
 
3152
    takes_options = [Option('all', help='Show annotations on all lines.'),
 
3153
                     Option('long', help='Show commit date in annotations.'),
3126
3154
                     'revision',
3127
3155
                     'show-ids',
3128
3156
                     ]
 
3157
    encoding_type = 'exact'
3129
3158
 
3130
3159
    @display_command
3131
3160
    def run(self, filename, all=False, long=False, revision=None,
3142
3171
            else:
3143
3172
                revision_id = revision[0].in_history(branch).rev_id
3144
3173
            file_id = tree.path2id(relpath)
 
3174
            if file_id is None:
 
3175
                raise errors.NotVersionedError(filename)
3145
3176
            tree = branch.repository.revision_tree(revision_id)
3146
3177
            file_version = tree.inventory[file_id].revision
3147
 
            annotate_file(branch, file_version, file_id, long, all, sys.stdout,
 
3178
            annotate_file(branch, file_version, file_id, long, all, self.outf,
3148
3179
                          show_ids=show_ids)
3149
3180
        finally:
3150
3181
            branch.unlock()
3255
3286
    # information in shared branches as well.
3256
3287
    _see_also = ['commit']
3257
3288
    takes_options = ['verbose', 'revision',
3258
 
                    Option('dry-run', help='Don\'t actually make changes'),
 
3289
                    Option('dry-run', help='Don\'t actually make changes.'),
3259
3290
                    Option('force', help='Say yes to all questions.')]
3260
3291
    takes_args = ['location?']
3261
3292
    aliases = []
3365
3396
 
3366
3397
    takes_options = [
3367
3398
        Option('inet',
3368
 
               help='serve on stdin/out for use from inetd or sshd'),
 
3399
               help='Serve on stdin/out for use from inetd or sshd.'),
3369
3400
        Option('port',
3370
 
               help='listen for connections on nominated port of the form '
3371
 
                    '[hostname:]portnumber. Passing 0 as the port number will '
3372
 
                    'result in a dynamically allocated port. Default port is '
 
3401
               help='Listen for connections on nominated port of the form '
 
3402
                    '[hostname:]portnumber.  Passing 0 as the port number will '
 
3403
                    'result in a dynamically allocated port.  The default port is '
3373
3404
                    '4155.',
3374
3405
               type=str),
3375
3406
        Option('directory',
3376
 
               help='serve contents of directory',
 
3407
               help='Serve contents of this directory.',
3377
3408
               type=unicode),
3378
3409
        Option('allow-writes',
3379
 
               help='By default the server is a readonly server. Supplying '
 
3410
               help='By default the server is a readonly server.  Supplying '
3380
3411
                    '--allow-writes enables write access to the contents of '
3381
 
                    'the served directory and below. '
 
3412
                    'the served directory and below.'
3382
3413
                ),
3383
3414
        ]
3384
3415
 
3444
3475
 
3445
3476
    _see_also = ['split']
3446
3477
    takes_args = ['tree']
3447
 
    takes_options = [Option('reference', 'join by reference')]
 
3478
    takes_options = [
 
3479
            Option('reference', help='Join by reference.'),
 
3480
            ]
3448
3481
    hidden = True
3449
3482
 
3450
3483
    def run(self, tree, reference=False):
3525
3558
    takes_options = [
3526
3559
        RegistryOption.from_kwargs('patch-type',
3527
3560
            'The type of patch to include in the directive',
3528
 
            title='Patch type', value_switches=True, enum_switch=False,
3529
 
            bundle='Bazaar revision bundle (default)',
3530
 
            diff='Normal unified diff',
3531
 
            plain='No patch, just directive'),
3532
 
        Option('sign', help='GPG-sign the directive'), 'revision',
 
3561
            title='Patch type',
 
3562
            value_switches=True,
 
3563
            enum_switch=False,
 
3564
            bundle='Bazaar revision bundle (default).',
 
3565
            diff='Normal unified diff.',
 
3566
            plain='No patch, just directive.'),
 
3567
        Option('sign', help='GPG-sign the directive.'), 'revision',
3533
3568
        Option('mail-to', type=str,
3534
 
            help='Instead of printing the directive, email to this address'),
 
3569
            help='Instead of printing the directive, email to this address.'),
3535
3570
        Option('message', type=str, short_name='m',
3536
 
            help='Message to use when committing this merge')
 
3571
            help='Message to use when committing this merge.')
3537
3572
        ]
3538
3573
 
3539
3574
    encoding_type = 'exact'
3616
3651
            type=unicode,
3617
3652
            ),
3618
3653
        Option('force',
3619
 
            help='Replace existing tags',
 
3654
            help='Replace existing tags.',
3620
3655
            ),
3621
3656
        'revision',
3622
3657
        ]
3659
3694
    _see_also = ['tag']
3660
3695
    takes_options = [
3661
3696
        Option('directory',
3662
 
            help='Branch whose tags should be displayed',
 
3697
            help='Branch whose tags should be displayed.',
3663
3698
            short_name='d',
3664
3699
            type=unicode,
3665
3700
            ),
3777
3812
    while True:
3778
3813
        new_transport = cur_transport.clone('..')
3779
3814
        if new_transport.base == cur_transport.base:
3780
 
            raise errors.BzrCommandError("Failed to create path"
3781
 
                                         " prefix for %s."
3782
 
                                         % location)
 
3815
            raise errors.BzrCommandError(
 
3816
                "Failed to create path prefix for %s."
 
3817
                % cur_transport.base)
3783
3818
        try:
3784
3819
            new_transport.mkdir('.')
3785
3820
        except errors.NoSuchFile:
3787
3822
            cur_transport = new_transport
3788
3823
        else:
3789
3824
            break
3790
 
 
3791
3825
    # Now we only need to create child directories
3792
3826
    while needed:
3793
3827
        cur_transport = needed.pop()
3794
3828
        cur_transport.ensure_base()
3795
3829
 
 
3830
 
3796
3831
# Compatibility
3797
3832
merge = _merge_helper
3798
3833