~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Vincent Ladeuil
  • Date: 2011-05-17 20:58:43 UTC
  • mfrom: (5609.39.5 2.3)
  • mto: This revision was merged to the branch mainline in revision 5885.
  • Revision ID: v.ladeuil+lp@free.fr-20110517205843-uo1tntrz6kqfn1hb
Merge 2.3 into trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
250
250
    To skip the display of pending merge information altogether, use
251
251
    the no-pending option or specify a file/directory.
252
252
 
253
 
    If a revision argument is given, the status is calculated against
254
 
    that revision, or between two revisions if two are provided.
 
253
    To compare the working directory to a specific revision, pass a
 
254
    single revision to the revision argument.
 
255
 
 
256
    To see which files have changed in a specific revision, or between
 
257
    two revisions, pass a revision range to the revision argument.
 
258
    This will produce the same results as calling 'bzr diff --summarize'.
255
259
    """
256
260
 
257
261
    # TODO: --no-recurse, --recurse options
324
328
        if revision_id is None and revision is None:
325
329
            raise errors.BzrCommandError('You must supply either'
326
330
                                         ' --revision or a revision_id')
327
 
        b = WorkingTree.open_containing(directory)[0].branch
 
331
 
 
332
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
328
333
 
329
334
        revisions = b.repository.revisions
330
335
        if revisions is None:
408
413
                self.outf.write(page_bytes[:header_end])
409
414
                page_bytes = data
410
415
            self.outf.write('\nPage %d\n' % (page_idx,))
411
 
            decomp_bytes = zlib.decompress(page_bytes)
412
 
            self.outf.write(decomp_bytes)
413
 
            self.outf.write('\n')
 
416
            if len(page_bytes) == 0:
 
417
                self.outf.write('(empty)\n');
 
418
            else:
 
419
                decomp_bytes = zlib.decompress(page_bytes)
 
420
                self.outf.write(decomp_bytes)
 
421
                self.outf.write('\n')
414
422
 
415
423
    def _dump_entries(self, trans, basename):
416
424
        try:
477
485
            d.destroy_workingtree()
478
486
 
479
487
 
 
488
class cmd_repair_workingtree(Command):
 
489
    __doc__ = """Reset the working tree state file.
 
490
 
 
491
    This is not meant to be used normally, but more as a way to recover from
 
492
    filesystem corruption, etc. This rebuilds the working inventory back to a
 
493
    'known good' state. Any new modifications (adding a file, renaming, etc)
 
494
    will be lost, though modified files will still be detected as such.
 
495
 
 
496
    Most users will want something more like "bzr revert" or "bzr update"
 
497
    unless the state file has become corrupted.
 
498
 
 
499
    By default this attempts to recover the current state by looking at the
 
500
    headers of the state file. If the state file is too corrupted to even do
 
501
    that, you can supply --revision to force the state of the tree.
 
502
    """
 
503
 
 
504
    takes_options = ['revision', 'directory',
 
505
        Option('force',
 
506
               help='Reset the tree even if it doesn\'t appear to be'
 
507
                    ' corrupted.'),
 
508
    ]
 
509
    hidden = True
 
510
 
 
511
    def run(self, revision=None, directory='.', force=False):
 
512
        tree, _ = WorkingTree.open_containing(directory)
 
513
        self.add_cleanup(tree.lock_tree_write().unlock)
 
514
        if not force:
 
515
            try:
 
516
                tree.check_state()
 
517
            except errors.BzrError:
 
518
                pass # There seems to be a real error here, so we'll reset
 
519
            else:
 
520
                # Refuse
 
521
                raise errors.BzrCommandError(
 
522
                    'The tree does not appear to be corrupt. You probably'
 
523
                    ' want "bzr revert" instead. Use "--force" if you are'
 
524
                    ' sure you want to reset the working tree.')
 
525
        if revision is None:
 
526
            revision_ids = None
 
527
        else:
 
528
            revision_ids = [r.as_revision_id(tree.branch) for r in revision]
 
529
        try:
 
530
            tree.reset_state(revision_ids)
 
531
        except errors.BzrError, e:
 
532
            if revision_ids is None:
 
533
                extra = (', the header appears corrupt, try passing -r -1'
 
534
                         ' to set the state to the last commit')
 
535
            else:
 
536
                extra = ''
 
537
            raise errors.BzrCommandError('failed to reset the tree state'
 
538
                                         + extra)
 
539
 
 
540
 
480
541
class cmd_revno(Command):
481
542
    __doc__ = """Show current revision number.
482
543
 
1011
1072
            log.show_branch_change(
1012
1073
                branch_to, self.outf, result.old_revno,
1013
1074
                result.old_revid)
 
1075
        if getattr(result, 'tag_conflicts', None):
 
1076
            return 1
 
1077
        else:
 
1078
            return 0
1014
1079
 
1015
1080
 
1016
1081
class cmd_push(Command):
1063
1128
        Option('strict',
1064
1129
               help='Refuse to push if there are uncommitted changes in'
1065
1130
               ' the working tree, --no-strict disables the check.'),
 
1131
        Option('no-tree',
 
1132
               help="Don't populate the working tree, even for protocols"
 
1133
               " that support it."),
1066
1134
        ]
1067
1135
    takes_args = ['location?']
1068
1136
    encoding_type = 'replace'
1070
1138
    def run(self, location=None, remember=False, overwrite=False,
1071
1139
        create_prefix=False, verbose=False, revision=None,
1072
1140
        use_existing_dir=False, directory=None, stacked_on=None,
1073
 
        stacked=False, strict=None):
 
1141
        stacked=False, strict=None, no_tree=False):
1074
1142
        from bzrlib.push import _show_push_branch
1075
1143
 
1076
1144
        if directory is None:
1122
1190
        _show_push_branch(br_from, revision_id, location, self.outf,
1123
1191
            verbose=verbose, overwrite=overwrite, remember=remember,
1124
1192
            stacked_on=stacked_on, create_prefix=create_prefix,
1125
 
            use_existing_dir=use_existing_dir)
 
1193
            use_existing_dir=use_existing_dir, no_tree=no_tree)
1126
1194
 
1127
1195
 
1128
1196
class cmd_branch(Command):
1137
1205
 
1138
1206
    To retrieve the branch as of a particular revision, supply the --revision
1139
1207
    parameter, as in "branch foo/bar -r 5".
 
1208
 
 
1209
    The synonyms 'clone' and 'get' for this command are deprecated.
1140
1210
    """
1141
1211
 
1142
1212
    _see_also = ['checkout']
1172
1242
            files_from=None):
1173
1243
        from bzrlib import switch as _mod_switch
1174
1244
        from bzrlib.tag import _merge_tags_if_possible
 
1245
        if self.invoked_as in ['get', 'clone']:
 
1246
            ui.ui_factory.show_user_warning(
 
1247
                'deprecated_command',
 
1248
                deprecated_name=self.invoked_as,
 
1249
                recommended_name='branch',
 
1250
                deprecated_in_version='2.4')
1175
1251
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1176
1252
            from_location)
1177
1253
        if not (hardlink or files_from):
1505
1581
            title='Deletion Strategy', value_switches=True, enum_switch=False,
1506
1582
            safe='Backup changed files (default).',
1507
1583
            keep='Delete from bzr but leave the working copy.',
 
1584
            no_backup='Don\'t backup changed files.',
1508
1585
            force='Delete all the specified files, even if they can not be '
1509
 
                'recovered and even if they are non-empty directories.')]
 
1586
                'recovered and even if they are non-empty directories. '
 
1587
                '(deprecated, use no-backup)')]
1510
1588
    aliases = ['rm', 'del']
1511
1589
    encoding_type = 'replace'
1512
1590
 
1513
1591
    def run(self, file_list, verbose=False, new=False,
1514
1592
        file_deletion_strategy='safe'):
 
1593
        if file_deletion_strategy == 'force':
 
1594
            note("(The --force option is deprecated, rather use --no-backup "
 
1595
                "in future.)")
 
1596
            file_deletion_strategy = 'no-backup'
 
1597
 
1515
1598
        tree, file_list = WorkingTree.open_containing_paths(file_list)
1516
1599
 
1517
1600
        if file_list is not None:
1538
1621
            file_deletion_strategy = 'keep'
1539
1622
        tree.remove(file_list, verbose=verbose, to_file=self.outf,
1540
1623
            keep_files=file_deletion_strategy=='keep',
1541
 
            force=file_deletion_strategy=='force')
 
1624
            force=(file_deletion_strategy=='no-backup'))
1542
1625
 
1543
1626
 
1544
1627
class cmd_file_id(Command):
1699
1782
                ),
1700
1783
         Option('append-revisions-only',
1701
1784
                help='Never change revnos or the existing log.'
1702
 
                '  Append revisions to it only.')
 
1785
                '  Append revisions to it only.'),
 
1786
         Option('no-tree',
 
1787
                'Create a branch without a working tree.')
1703
1788
         ]
1704
1789
    def run(self, location=None, format=None, append_revisions_only=False,
1705
 
            create_prefix=False):
 
1790
            create_prefix=False, no_tree=False):
1706
1791
        if format is None:
1707
1792
            format = bzrdir.format_registry.make_bzrdir('default')
1708
1793
        if location is None:
1731
1816
        except errors.NotBranchError:
1732
1817
            # really a NotBzrDir error...
1733
1818
            create_branch = bzrdir.BzrDir.create_branch_convenience
 
1819
            if no_tree:
 
1820
                force_new_tree = False
 
1821
            else:
 
1822
                force_new_tree = None
1734
1823
            branch = create_branch(to_transport.base, format=format,
1735
 
                                   possible_transports=[to_transport])
 
1824
                                   possible_transports=[to_transport],
 
1825
                                   force_new_tree=force_new_tree)
1736
1826
            a_bzrdir = branch.bzrdir
1737
1827
        else:
1738
1828
            from bzrlib.transport.local import LocalTransport
1742
1832
                        raise errors.BranchExistsWithoutWorkingTree(location)
1743
1833
                raise errors.AlreadyBranchError(location)
1744
1834
            branch = a_bzrdir.create_branch()
1745
 
            a_bzrdir.create_workingtree()
 
1835
            if not no_tree:
 
1836
                a_bzrdir.create_workingtree()
1746
1837
        if append_revisions_only:
1747
1838
            try:
1748
1839
                branch.set_append_revisions_only(True)
1842
1933
    "bzr diff -p1" is equivalent to "bzr diff --prefix old/:new/", and
1843
1934
    produces patches suitable for "patch -p1".
1844
1935
 
 
1936
    Note that when using the -r argument with a range of revisions, the
 
1937
    differences are computed between the two specified revisions.  That
 
1938
    is, the command does not show the changes introduced by the first 
 
1939
    revision in the range.  This differs from the interpretation of 
 
1940
    revision ranges used by "bzr log" which includes the first revision
 
1941
    in the range.
 
1942
 
1845
1943
    :Exit values:
1846
1944
        1 - changed
1847
1945
        2 - unrepresentable changes
1865
1963
 
1866
1964
            bzr diff -r1..3 xxx
1867
1965
 
1868
 
        To see the changes introduced in revision X::
 
1966
        The changes introduced by revision 2 (equivalent to -r1..2)::
 
1967
 
 
1968
            bzr diff -c2
 
1969
 
 
1970
        To see the changes introduced by revision X::
1869
1971
        
1870
1972
            bzr diff -cX
1871
1973
 
1875
1977
 
1876
1978
            bzr diff -r<chosen_parent>..X
1877
1979
 
1878
 
        The changes introduced by revision 2 (equivalent to -r1..2)::
 
1980
        The changes between the current revision and the previous revision
 
1981
        (equivalent to -c-1 and -r-2..-1)
1879
1982
 
1880
 
            bzr diff -c2
 
1983
            bzr diff -r-2..
1881
1984
 
1882
1985
        Show just the differences for file NEWS::
1883
1986
 
1927
2030
            type=unicode,
1928
2031
            ),
1929
2032
        RegistryOption('format',
 
2033
            short_name='F',
1930
2034
            help='Diff format to use.',
1931
2035
            lazy_registry=('bzrlib.diff', 'format_registry'),
1932
 
            value_switches=False, title='Diff format'),
 
2036
            title='Diff format'),
1933
2037
        ]
1934
2038
    aliases = ['di', 'dif']
1935
2039
    encoding_type = 'exact'
2016
2120
    @display_command
2017
2121
    def run(self, null=False, directory=u'.'):
2018
2122
        tree = WorkingTree.open_containing(directory)[0]
 
2123
        self.add_cleanup(tree.lock_read().unlock)
2019
2124
        td = tree.changes_from(tree.basis_tree())
 
2125
        self.cleanup_now()
2020
2126
        for path, id, kind, text_modified, meta_modified in td.modified:
2021
2127
            if null:
2022
2128
                self.outf.write(path + '\0')
2652
2758
    Patterns prefixed with '!!' act as regular ignore patterns, but have
2653
2759
    precedence over the '!' exception patterns.
2654
2760
 
2655
 
    Note: ignore patterns containing shell wildcards must be quoted from
2656
 
    the shell on Unix.
 
2761
    :Notes: 
 
2762
        
 
2763
    * Ignore patterns containing shell wildcards must be quoted from
 
2764
      the shell on Unix.
 
2765
 
 
2766
    * Ignore patterns starting with "#" act as comments in the ignore file.
 
2767
      To ignore patterns that begin with that character, use the "RE:" prefix.
2657
2768
 
2658
2769
    :Examples:
2659
2770
        Ignore the top level Makefile::
2668
2779
 
2669
2780
            bzr ignore "!special.class"
2670
2781
 
 
2782
        Ignore files whose name begins with the "#" character::
 
2783
 
 
2784
            bzr ignore "RE:^#"
 
2785
 
2671
2786
        Ignore .o files under the lib directory::
2672
2787
 
2673
2788
            bzr ignore "lib/**/*.o"
2681
2796
            bzr ignore "RE:(?!debian/).*"
2682
2797
        
2683
2798
        Ignore everything except the "local" toplevel directory,
2684
 
        but always ignore "*~" autosave files, even under local/::
 
2799
        but always ignore autosave files ending in ~, even under local/::
2685
2800
        
2686
2801
            bzr ignore "*"
2687
2802
            bzr ignore "!./local"
2815
2930
         zip                          .zip
2816
2931
      =================       =========================
2817
2932
    """
 
2933
    encoding = 'exact'
2818
2934
    takes_args = ['dest', 'branch_or_subdir?']
2819
2935
    takes_options = ['directory',
2820
2936
        Option('format',
2998
3114
      to trigger updates to external systems like bug trackers. The --fixes
2999
3115
      option can be used to record the association between a revision and
3000
3116
      one or more bugs. See ``bzr help bugs`` for details.
3001
 
 
3002
 
      A selective commit may fail in some cases where the committed
3003
 
      tree would be invalid. Consider::
3004
 
  
3005
 
        bzr init foo
3006
 
        mkdir foo/bar
3007
 
        bzr add foo/bar
3008
 
        bzr commit foo -m "committing foo"
3009
 
        bzr mv foo/bar foo/baz
3010
 
        mkdir foo/bar
3011
 
        bzr add foo/bar
3012
 
        bzr commit foo/bar -m "committing bar but not baz"
3013
 
  
3014
 
      In the example above, the last commit will fail by design. This gives
3015
 
      the user the opportunity to decide whether they want to commit the
3016
 
      rename at the same time, separately first, or not at all. (As a general
3017
 
      rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3018
3117
    """
3019
 
    # TODO: Run hooks on tree to-be-committed, and after commit.
3020
 
 
3021
 
    # TODO: Strict commit that fails if there are deleted files.
3022
 
    #       (what does "deleted files" mean ??)
3023
 
 
3024
 
    # TODO: Give better message for -s, --summary, used by tla people
3025
 
 
3026
 
    # XXX: verbose currently does nothing
3027
3118
 
3028
3119
    _see_also = ['add', 'bugs', 'hooks', 'uncommit']
3029
3120
    takes_args = ['selected*']
3061
3152
             Option('show-diff', short_name='p',
3062
3153
                    help='When no message is supplied, show the diff along'
3063
3154
                    ' with the status summary in the message editor.'),
 
3155
             Option('lossy', 
 
3156
                    help='When committing to a foreign version control '
 
3157
                    'system do not push data that can not be natively '
 
3158
                    'represented.'),
3064
3159
             ]
3065
3160
    aliases = ['ci', 'checkin']
3066
3161
 
3085
3180
 
3086
3181
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3087
3182
            unchanged=False, strict=False, local=False, fixes=None,
3088
 
            author=None, show_diff=False, exclude=None, commit_time=None):
 
3183
            author=None, show_diff=False, exclude=None, commit_time=None,
 
3184
            lossy=False):
3089
3185
        from bzrlib.errors import (
3090
3186
            PointlessCommit,
3091
3187
            ConflictsInTree,
3105
3201
                raise errors.BzrCommandError(
3106
3202
                    "Could not parse --commit-time: " + str(e))
3107
3203
 
3108
 
        # TODO: Need a blackbox test for invoking the external editor; may be
3109
 
        # slightly problematic to run this cross-platform.
3110
 
 
3111
 
        # TODO: do more checks that the commit will succeed before
3112
 
        # spending the user's valuable time typing a commit message.
3113
 
 
3114
3204
        properties = {}
3115
3205
 
3116
3206
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3193
3283
                        reporter=None, verbose=verbose, revprops=properties,
3194
3284
                        authors=author, timestamp=commit_stamp,
3195
3285
                        timezone=offset,
3196
 
                        exclude=tree.safe_relpath_files(exclude))
 
3286
                        exclude=tree.safe_relpath_files(exclude),
 
3287
                        lossy=lossy)
3197
3288
        except PointlessCommit:
3198
3289
            raise errors.BzrCommandError("No changes to commit."
3199
 
                              " Use --unchanged to commit anyhow.")
 
3290
                " Please 'bzr add' the files you want to commit, or use"
 
3291
                " --unchanged to force an empty commit.")
3200
3292
        except ConflictsInTree:
3201
3293
            raise errors.BzrCommandError('Conflicts detected in working '
3202
3294
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3283
3375
 
3284
3376
 
3285
3377
class cmd_upgrade(Command):
3286
 
    __doc__ = """Upgrade branch storage to current format.
3287
 
 
3288
 
    The check command or bzr developers may sometimes advise you to run
3289
 
    this command. When the default format has changed you may also be warned
3290
 
    during other operations to upgrade.
 
3378
    __doc__ = """Upgrade a repository, branch or working tree to a newer format.
 
3379
 
 
3380
    When the default format has changed after a major new release of
 
3381
    Bazaar, you may be informed during certain operations that you
 
3382
    should upgrade. Upgrading to a newer format may improve performance
 
3383
    or make new features available. It may however limit interoperability
 
3384
    with older repositories or with older versions of Bazaar.
 
3385
 
 
3386
    If you wish to upgrade to a particular format rather than the
 
3387
    current default, that can be specified using the --format option.
 
3388
    As a consequence, you can use the upgrade command this way to
 
3389
    "downgrade" to an earlier format, though some conversions are
 
3390
    a one way process (e.g. changing from the 1.x default to the
 
3391
    2.x default) so downgrading is not always possible.
 
3392
 
 
3393
    A backup.bzr.~#~ directory is created at the start of the conversion
 
3394
    process (where # is a number). By default, this is left there on
 
3395
    completion. If the conversion fails, delete the new .bzr directory
 
3396
    and rename this one back in its place. Use the --clean option to ask
 
3397
    for the backup.bzr directory to be removed on successful conversion.
 
3398
    Alternatively, you can delete it by hand if everything looks good
 
3399
    afterwards.
 
3400
 
 
3401
    If the location given is a shared repository, dependent branches
 
3402
    are also converted provided the repository converts successfully.
 
3403
    If the conversion of a branch fails, remaining branches are still
 
3404
    tried.
 
3405
 
 
3406
    For more information on upgrades, see the Bazaar Upgrade Guide,
 
3407
    http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3291
3408
    """
3292
3409
 
3293
 
    _see_also = ['check']
 
3410
    _see_also = ['check', 'reconcile', 'formats']
3294
3411
    takes_args = ['url?']
3295
3412
    takes_options = [
3296
 
                    RegistryOption('format',
3297
 
                        help='Upgrade to a specific format.  See "bzr help'
3298
 
                             ' formats" for details.',
3299
 
                        lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3300
 
                        converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3301
 
                        value_switches=True, title='Branch format'),
3302
 
                    ]
 
3413
        RegistryOption('format',
 
3414
            help='Upgrade to a specific format.  See "bzr help'
 
3415
                 ' formats" for details.',
 
3416
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3417
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
 
3418
            value_switches=True, title='Branch format'),
 
3419
        Option('clean',
 
3420
            help='Remove the backup.bzr directory if successful.'),
 
3421
        Option('dry-run',
 
3422
            help="Show what would be done, but don't actually do anything."),
 
3423
    ]
3303
3424
 
3304
 
    def run(self, url='.', format=None):
 
3425
    def run(self, url='.', format=None, clean=False, dry_run=False):
3305
3426
        from bzrlib.upgrade import upgrade
3306
 
        upgrade(url, format)
 
3427
        exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
 
3428
        if exceptions:
 
3429
            if len(exceptions) == 1:
 
3430
                # Compatibility with historical behavior
 
3431
                raise exceptions[0]
 
3432
            else:
 
3433
                return 3
3307
3434
 
3308
3435
 
3309
3436
class cmd_whoami(Command):
3345
3472
                self.outf.write(c.username() + '\n')
3346
3473
            return
3347
3474
 
 
3475
        if email:
 
3476
            raise errors.BzrCommandError("--email can only be used to display existing "
 
3477
                                         "identity")
 
3478
 
3348
3479
        # display a warning if an email address isn't included in the given name.
3349
3480
        try:
3350
3481
            _mod_config.extract_email_address(name)
3704
3835
    with bzr send. If neither is specified, the default is the upstream branch
3705
3836
    or the branch most recently merged using --remember.
3706
3837
 
3707
 
    When merging a branch, by default the tip will be merged. To pick a different
3708
 
    revision, pass --revision. If you specify two values, the first will be used as
3709
 
    BASE and the second one as OTHER. Merging individual revisions, or a subset of
3710
 
    available revisions, like this is commonly referred to as "cherrypicking".
3711
 
 
3712
 
    Revision numbers are always relative to the branch being merged.
3713
 
 
3714
 
    By default, bzr will try to merge in all new work from the other
3715
 
    branch, automatically determining an appropriate base.  If this
3716
 
    fails, you may need to give an explicit base.
 
3838
    When merging from a branch, by default bzr will try to merge in all new
 
3839
    work from the other branch, automatically determining an appropriate base
 
3840
    revision.  If this fails, you may need to give an explicit base.
 
3841
 
 
3842
    To pick a different ending revision, pass "--revision OTHER".  bzr will
 
3843
    try to merge in all new work up to and including revision OTHER.
 
3844
 
 
3845
    If you specify two values, "--revision BASE..OTHER", only revisions BASE
 
3846
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
 
3847
    causes some revisions to be skipped, i.e. if the destination branch does
 
3848
    not already contain revision BASE, such a merge is commonly referred to as
 
3849
    a "cherrypick".
 
3850
 
 
3851
    Revision numbers are always relative to the source branch.
3717
3852
 
3718
3853
    Merge will do its best to combine the changes in two branches, but there
3719
3854
    are some kinds of problems only a human can fix.  When it encounters those,
3722
3857
 
3723
3858
    Use bzr resolve when you have fixed a problem.  See also bzr conflicts.
3724
3859
 
3725
 
    If there is no default branch set, the first merge will set it. After
3726
 
    that, you can omit the branch to use the default.  To change the
3727
 
    default, use --remember. The value will only be saved if the remote
3728
 
    location can be accessed.
 
3860
    If there is no default branch set, the first merge will set it (use
 
3861
    --no-remember to *not* set it). After that, you can omit the branch to use
 
3862
    the default.  To change the default, use --remember. The value will only be
 
3863
    saved if the remote location can be accessed.
3729
3864
 
3730
3865
    The results of the merge are placed into the destination working
3731
3866
    directory, where they can be reviewed (with bzr diff), tested, and then
3743
3878
    you to apply each diff hunk and file change, similar to "shelve".
3744
3879
 
3745
3880
    :Examples:
3746
 
        To merge the latest revision from bzr.dev::
 
3881
        To merge all new revisions from bzr.dev::
3747
3882
 
3748
3883
            bzr merge ../bzr.dev
3749
3884
 
3796
3931
    ]
3797
3932
 
3798
3933
    def run(self, location=None, revision=None, force=False,
3799
 
            merge_type=None, show_base=False, reprocess=None, remember=False,
 
3934
            merge_type=None, show_base=False, reprocess=None, remember=None,
3800
3935
            uncommitted=False, pull=False,
3801
3936
            directory=None,
3802
3937
            preview=False,
3864
3999
            merger.other_rev_id is not None):
3865
4000
            note('Nothing to do.')
3866
4001
            return 0
3867
 
        if pull:
 
4002
        if pull and not preview:
3868
4003
            if merger.interesting_files is not None:
3869
4004
                raise errors.BzrCommandError('Cannot pull individual files')
3870
4005
            if (merger.base_rev_id == tree.last_revision()):
3979
4114
        if other_revision_id is None:
3980
4115
            other_revision_id = _mod_revision.ensure_null(
3981
4116
                other_branch.last_revision())
3982
 
        # Remember where we merge from
3983
 
        if ((remember or tree.branch.get_submit_branch() is None) and
3984
 
             user_location is not None):
 
4117
        # Remember where we merge from. We need to remember if:
 
4118
        # - user specify a location (and we don't merge from the parent
 
4119
        #   branch)
 
4120
        # - user ask to remember or there is no previous location set to merge
 
4121
        #   from and user didn't ask to *not* remember
 
4122
        if (user_location is not None
 
4123
            and ((remember
 
4124
                  or (remember is None
 
4125
                      and tree.branch.get_submit_branch() is None)))):
3985
4126
            tree.branch.set_submit_branch(other_branch.base)
3986
 
        _merge_tags_if_possible(other_branch, tree.branch)
 
4127
        # Merge tags (but don't set them in the master branch yet, the user
 
4128
        # might revert this merge).  Commit will propagate them.
 
4129
        _merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
3987
4130
        merger = _mod_merge.Merger.from_revision_ids(pb, tree,
3988
4131
            other_revision_id, base_revision_id, other_branch, base_branch)
3989
4132
        if other_path != '':
4157
4300
    last committed revision is used.
4158
4301
 
4159
4302
    To remove only some changes, without reverting to a prior version, use
4160
 
    merge instead.  For example, "merge . --revision -2..-3" will remove the
4161
 
    changes introduced by -2, without affecting the changes introduced by -1.
4162
 
    Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
 
4303
    merge instead.  For example, "merge . -r -2..-3" (don't forget the ".")
 
4304
    will remove the changes introduced by the second last commit (-2), without
 
4305
    affecting the changes introduced by the last commit (-1).  To remove
 
4306
    certain changes on a hunk-by-hunk basis, see the shelve command.
4163
4307
 
4164
4308
    By default, any files that have been manually changed will be backed up
4165
4309
    first.  (Files changed only by merge are not backed up.)  Backup files have
4195
4339
    target branches.
4196
4340
    """
4197
4341
 
4198
 
    _see_also = ['cat', 'export']
 
4342
    _see_also = ['cat', 'export', 'merge', 'shelve']
4199
4343
    takes_options = [
4200
4344
        'revision',
4201
4345
        Option('no-backup', "Do not save backups of reverted files."),
4494
4638
 
4495
4639
    @display_command
4496
4640
    def run(self, verbose=False):
4497
 
        import bzrlib.plugin
4498
 
        from inspect import getdoc
4499
 
        result = []
4500
 
        for name, plugin in bzrlib.plugin.plugins().items():
4501
 
            version = plugin.__version__
4502
 
            if version == 'unknown':
4503
 
                version = ''
4504
 
            name_ver = '%s %s' % (name, version)
4505
 
            d = getdoc(plugin.module)
4506
 
            if d:
4507
 
                doc = d.split('\n')[0]
4508
 
            else:
4509
 
                doc = '(no description)'
4510
 
            result.append((name_ver, doc, plugin.path()))
4511
 
        for name_ver, doc, path in sorted(result):
4512
 
            self.outf.write("%s\n" % name_ver)
4513
 
            self.outf.write("   %s\n" % doc)
4514
 
            if verbose:
4515
 
                self.outf.write("   %s\n" % path)
4516
 
            self.outf.write("\n")
 
4641
        from bzrlib import plugin
 
4642
        # Don't give writelines a generator as some codecs don't like that
 
4643
        self.outf.writelines(
 
4644
            list(plugin.describe_plugins(show_paths=verbose)))
4517
4645
 
4518
4646
 
4519
4647
class cmd_testament(Command):
4572
4700
    @display_command
4573
4701
    def run(self, filename, all=False, long=False, revision=None,
4574
4702
            show_ids=False, directory=None):
4575
 
        from bzrlib.annotate import annotate_file, annotate_file_tree
 
4703
        from bzrlib.annotate import (
 
4704
            annotate_file_tree,
 
4705
            )
4576
4706
        wt, branch, relpath = \
4577
4707
            _open_directory_or_containing_tree_or_branch(filename, directory)
4578
4708
        if wt is not None:
4581
4711
            self.add_cleanup(branch.lock_read().unlock)
4582
4712
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4583
4713
        self.add_cleanup(tree.lock_read().unlock)
4584
 
        if wt is not None:
 
4714
        if wt is not None and revision is None:
4585
4715
            file_id = wt.path2id(relpath)
4586
4716
        else:
4587
4717
            file_id = tree.path2id(relpath)
4588
4718
        if file_id is None:
4589
4719
            raise errors.NotVersionedError(filename)
4590
 
        file_version = tree.inventory[file_id].revision
4591
4720
        if wt is not None and revision is None:
4592
4721
            # If there is a tree and we're not annotating historical
4593
4722
            # versions, annotate the working tree's content.
4594
4723
            annotate_file_tree(wt, file_id, self.outf, long, all,
4595
4724
                show_ids=show_ids)
4596
4725
        else:
4597
 
            annotate_file(branch, file_version, file_id, long, all, self.outf,
4598
 
                          show_ids=show_ids)
 
4726
            annotate_file_tree(tree, file_id, self.outf, long, all,
 
4727
                show_ids=show_ids, branch=branch)
4599
4728
 
4600
4729
 
4601
4730
class cmd_re_sign(Command):
5364
5493
            if tag_name is None:
5365
5494
                raise errors.BzrCommandError("No tag specified to delete.")
5366
5495
            branch.tags.delete_tag(tag_name)
5367
 
            self.outf.write('Deleted tag %s.\n' % tag_name)
 
5496
            note('Deleted tag %s.' % tag_name)
5368
5497
        else:
5369
5498
            if revision:
5370
5499
                if len(revision) != 1:
5382
5511
            if (not force) and branch.tags.has_tag(tag_name):
5383
5512
                raise errors.TagAlreadyExists(tag_name)
5384
5513
            branch.tags.set_tag(tag_name, revision_id)
5385
 
            self.outf.write('Created tag %s.\n' % tag_name)
 
5514
            note('Created tag %s.' % tag_name)
5386
5515
 
5387
5516
 
5388
5517
class cmd_tags(Command):
5395
5524
    takes_options = [
5396
5525
        custom_help('directory',
5397
5526
            help='Branch whose tags should be displayed.'),
5398
 
        RegistryOption.from_kwargs('sort',
 
5527
        RegistryOption('sort',
5399
5528
            'Sort tags by different criteria.', title='Sorting',
5400
 
            alpha='Sort tags lexicographically (default).',
5401
 
            time='Sort tags chronologically.',
 
5529
            lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5402
5530
            ),
5403
5531
        'show-ids',
5404
5532
        'revision',
5405
5533
    ]
5406
5534
 
5407
5535
    @display_command
5408
 
    def run(self,
5409
 
            directory='.',
5410
 
            sort='alpha',
5411
 
            show_ids=False,
5412
 
            revision=None,
5413
 
            ):
 
5536
    def run(self, directory='.', sort=None, show_ids=False, revision=None):
 
5537
        from bzrlib.tag import tag_sort_methods
5414
5538
        branch, relpath = Branch.open_containing(directory)
5415
5539
 
5416
5540
        tags = branch.tags.get_tag_dict().items()
5425
5549
            # only show revisions between revid1 and revid2 (inclusive)
5426
5550
            tags = [(tag, revid) for tag, revid in tags if
5427
5551
                graph.is_between(revid, revid1, revid2)]
5428
 
        if sort == 'alpha':
5429
 
            tags.sort()
5430
 
        elif sort == 'time':
5431
 
            timestamps = {}
5432
 
            for tag, revid in tags:
5433
 
                try:
5434
 
                    revobj = branch.repository.get_revision(revid)
5435
 
                except errors.NoSuchRevision:
5436
 
                    timestamp = sys.maxint # place them at the end
5437
 
                else:
5438
 
                    timestamp = revobj.timestamp
5439
 
                timestamps[revid] = timestamp
5440
 
            tags.sort(key=lambda x: timestamps[x[1]])
 
5552
        if sort is None:
 
5553
            sort = tag_sort_methods.get()
 
5554
        sort(branch, tags)
5441
5555
        if not show_ids:
5442
5556
            # [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5443
5557
            for index, (tag, revid) in enumerate(tags):
5445
5559
                    revno = branch.revision_id_to_dotted_revno(revid)
5446
5560
                    if isinstance(revno, tuple):
5447
5561
                        revno = '.'.join(map(str, revno))
5448
 
                except errors.NoSuchRevision:
 
5562
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5449
5563
                    # Bad tag data/merges can lead to tagged revisions
5450
5564
                    # which are not in this branch. Fail gracefully ...
5451
5565
                    revno = '?'
5841
5955
            location = "."
5842
5956
        branch = Branch.open_containing(location)[0]
5843
5957
        branch.bzrdir.destroy_branch()
5844
 
        
 
5958
 
5845
5959
 
5846
5960
class cmd_shelve(Command):
5847
5961
    __doc__ = """Temporarily set aside some changes from the current tree.
5866
5980
 
5867
5981
    You can put multiple items on the shelf, and by default, 'unshelve' will
5868
5982
    restore the most recently shelved changes.
 
5983
 
 
5984
    For complicated changes, it is possible to edit the changes in a separate
 
5985
    editor program to decide what the file remaining in the working copy
 
5986
    should look like.  To do this, add the configuration option
 
5987
 
 
5988
        change_editor = PROGRAM @new_path @old_path
 
5989
 
 
5990
    where @new_path is replaced with the path of the new version of the 
 
5991
    file and @old_path is replaced with the path of the old version of 
 
5992
    the file.  The PROGRAM should save the new file with the desired 
 
5993
    contents of the file in the working tree.
 
5994
        
5869
5995
    """
5870
5996
 
5871
5997
    takes_args = ['file*']
5883
6009
        Option('destroy',
5884
6010
               help='Destroy removed changes instead of shelving them.'),
5885
6011
    ]
5886
 
    _see_also = ['unshelve']
 
6012
    _see_also = ['unshelve', 'configuration']
5887
6013
 
5888
6014
    def run(self, revision=None, all=False, file_list=None, message=None,
5889
 
            writer=None, list=False, destroy=False, directory=u'.'):
 
6015
            writer=None, list=False, destroy=False, directory=None):
5890
6016
        if list:
5891
 
            return self.run_for_list()
 
6017
            return self.run_for_list(directory=directory)
5892
6018
        from bzrlib.shelf_ui import Shelver
5893
6019
        if writer is None:
5894
6020
            writer = bzrlib.option.diff_writer_registry.get()
5902
6028
        except errors.UserAbort:
5903
6029
            return 0
5904
6030
 
5905
 
    def run_for_list(self):
5906
 
        tree = WorkingTree.open_containing('.')[0]
 
6031
    def run_for_list(self, directory=None):
 
6032
        if directory is None:
 
6033
            directory = u'.'
 
6034
        tree = WorkingTree.open_containing(directory)[0]
5907
6035
        self.add_cleanup(tree.lock_read().unlock)
5908
6036
        manager = tree.get_shelf_manager()
5909
6037
        shelves = manager.active_shelves()
5968
6096
    """
5969
6097
    takes_options = ['directory',
5970
6098
                     Option('ignored', help='Delete all ignored files.'),
5971
 
                     Option('detritus', help='Delete conflict files, merge'
 
6099
                     Option('detritus', help='Delete conflict files, merge and revert'
5972
6100
                            ' backups, and failed selftest dirs.'),
5973
6101
                     Option('unknown',
5974
6102
                            help='Delete files unknown to bzr (default).'),
6033
6161
            self.outf.write('%s %s\n' % (path, location))
6034
6162
 
6035
6163
 
 
6164
class cmd_export_pot(Command):
 
6165
    __doc__ = """Export command helps and error messages in po format."""
 
6166
 
 
6167
    hidden = True
 
6168
 
 
6169
    def run(self):
 
6170
        from bzrlib.export_pot import export_pot
 
6171
        export_pot(self.outf)
 
6172
 
 
6173
 
6036
6174
def _register_lazy_builtins():
6037
6175
    # register lazy builtins from other modules; called at startup and should
6038
6176
    # be only called once.
6039
6177
    for (name, aliases, module_name) in [
6040
6178
        ('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
 
6179
        ('cmd_config', [], 'bzrlib.config'),
6041
6180
        ('cmd_dpush', [], 'bzrlib.foreign'),
6042
6181
        ('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6043
6182
        ('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6044
6183
        ('cmd_conflicts', [], 'bzrlib.conflicts'),
6045
6184
        ('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
 
6185
        ('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6046
6186
        ]:
6047
6187
        builtin_command_registry.register_lazy(name, aliases, module_name)