~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Andrew Bennetts
  • Date: 2011-07-11 02:06:18 UTC
  • mfrom: (6018 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6020.
  • Revision ID: andrew.bennetts@canonical.com-20110711020618-gcjgoeb5azwjrnu6
MergeĀ lp:bzr/2.4.

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
    rename_map,
45
45
    revision as _mod_revision,
46
46
    static_tuple,
47
 
    symbol_versioning,
48
47
    timestamp,
49
48
    transport,
50
49
    ui,
51
50
    urlutils,
52
51
    views,
 
52
    gpg,
53
53
    )
54
54
from bzrlib.branch import Branch
55
55
from bzrlib.conflicts import ConflictList
72
72
    _parse_revision_str,
73
73
    )
74
74
from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
 
75
from bzrlib import (
 
76
    symbol_versioning,
 
77
    )
75
78
 
76
79
 
77
80
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
229
232
    unknown
230
233
        Not versioned and not matching an ignore pattern.
231
234
 
232
 
    Additionally for directories, symlinks and files with an executable
233
 
    bit, Bazaar indicates their type using a trailing character: '/', '@'
234
 
    or '*' respectively.
 
235
    Additionally for directories, symlinks and files with a changed
 
236
    executable bit, Bazaar indicates their type using a trailing
 
237
    character: '/', '@' or '*' respectively. These decorations can be
 
238
    disabled using the '--no-classify' option.
235
239
 
236
240
    To see ignored files use 'bzr ignored'.  For details on the
237
241
    changes to file texts, use 'bzr diff'.
268
272
                            short_name='V'),
269
273
                     Option('no-pending', help='Don\'t show pending merges.',
270
274
                           ),
 
275
                     Option('no-classify',
 
276
                            help='Do not mark object type using indicator.',
 
277
                           ),
271
278
                     ]
272
279
    aliases = ['st', 'stat']
273
280
 
276
283
 
277
284
    @display_command
278
285
    def run(self, show_ids=False, file_list=None, revision=None, short=False,
279
 
            versioned=False, no_pending=False, verbose=False):
 
286
            versioned=False, no_pending=False, verbose=False,
 
287
            no_classify=False):
280
288
        from bzrlib.status import show_tree_status
281
289
 
282
290
        if revision and len(revision) > 2:
296
304
        show_tree_status(tree, show_ids=show_ids,
297
305
                         specific_files=relfile_list, revision=revision,
298
306
                         to_file=self.outf, short=short, versioned=versioned,
299
 
                         show_pending=(not no_pending), verbose=verbose)
 
307
                         show_pending=(not no_pending), verbose=verbose,
 
308
                         classify=not no_classify)
300
309
 
301
310
 
302
311
class cmd_cat_revision(Command):
794
803
                                      require_versioned=True)
795
804
            # find_ids_across_trees may include some paths that don't
796
805
            # exist in 'tree'.
797
 
            entries = sorted((tree.id2path(file_id), tree.inventory[file_id])
798
 
                             for file_id in file_ids if file_id in tree)
 
806
            entries = sorted(
 
807
                (tree.id2path(file_id), tree.inventory[file_id])
 
808
                for file_id in file_ids if tree.has_id(file_id))
799
809
        else:
800
810
            entries = tree.inventory.entries()
801
811
 
962
972
    match the remote one, use pull --overwrite. This will work even if the two
963
973
    branches have diverged.
964
974
 
965
 
    If there is no default location set, the first pull will set it.  After
966
 
    that, you can omit the location to use the default.  To change the
967
 
    default, use --remember. The value will only be saved if the remote
968
 
    location can be accessed.
 
975
    If there is no default location set, the first pull will set it (use
 
976
    --no-remember to avoid settting it). After that, you can omit the
 
977
    location to use the default.  To change the default, use --remember. The
 
978
    value will only be saved if the remote location can be accessed.
969
979
 
970
980
    Note: The location can be specified either in the form of a branch,
971
981
    or in the form of a path to a file containing a merge directive generated
990
1000
    takes_args = ['location?']
991
1001
    encoding_type = 'replace'
992
1002
 
993
 
    def run(self, location=None, remember=False, overwrite=False,
 
1003
    def run(self, location=None, remember=None, overwrite=False,
994
1004
            revision=None, verbose=False,
995
1005
            directory=None, local=False,
996
1006
            show_base=False):
1047
1057
            branch_from = Branch.open(location,
1048
1058
                possible_transports=possible_transports)
1049
1059
            self.add_cleanup(branch_from.lock_read().unlock)
1050
 
 
1051
 
            if branch_to.get_parent() is None or remember:
 
1060
            # Remembers if asked explicitly or no previous location is set
 
1061
            if (remember
 
1062
                or (remember is None and branch_to.get_parent() is None)):
1052
1063
                branch_to.set_parent(branch_from.base)
1053
1064
 
1054
1065
        if revision is not None:
1098
1109
    do a merge (see bzr help merge) from the other branch, and commit that.
1099
1110
    After that you will be able to do a push without '--overwrite'.
1100
1111
 
1101
 
    If there is no default push location set, the first push will set it.
1102
 
    After that, you can omit the location to use the default.  To change the
1103
 
    default, use --remember. The value will only be saved if the remote
1104
 
    location can be accessed.
 
1112
    If there is no default push location set, the first push will set it (use
 
1113
    --no-remember to avoid settting it).  After that, you can omit the
 
1114
    location to use the default.  To change the default, use --remember. The
 
1115
    value will only be saved if the remote location can be accessed.
1105
1116
    """
1106
1117
 
1107
1118
    _see_also = ['pull', 'update', 'working-trees']
1135
1146
    takes_args = ['location?']
1136
1147
    encoding_type = 'replace'
1137
1148
 
1138
 
    def run(self, location=None, remember=False, overwrite=False,
 
1149
    def run(self, location=None, remember=None, overwrite=False,
1139
1150
        create_prefix=False, verbose=False, revision=None,
1140
1151
        use_existing_dir=False, directory=None, stacked_on=None,
1141
1152
        stacked=False, strict=None, no_tree=False):
1737
1748
            b = wt.branch
1738
1749
            last_revision = wt.last_revision()
1739
1750
 
1740
 
        revision_ids = b.repository.get_ancestry(last_revision)
1741
 
        revision_ids.pop(0)
1742
 
        for revision_id in revision_ids:
 
1751
        self.add_cleanup(b.repository.lock_read().unlock)
 
1752
        graph = b.repository.get_graph()
 
1753
        revisions = [revid for revid, parents in
 
1754
            graph.iter_ancestry([last_revision])]
 
1755
        for revision_id in reversed(revisions):
 
1756
            if _mod_revision.is_null(revision_id):
 
1757
                continue
1743
1758
            self.outf.write(revision_id + '\n')
1744
1759
 
1745
1760
 
2147
2162
        basis_inv = basis.inventory
2148
2163
        inv = wt.inventory
2149
2164
        for file_id in inv:
2150
 
            if file_id in basis_inv:
 
2165
            if basis_inv.has_id(file_id):
2151
2166
                continue
2152
2167
            if inv.is_root(file_id) and len(basis_inv) == 0:
2153
2168
                continue
2386
2401
            Option('exclude-common-ancestry',
2387
2402
                   help='Display only the revisions that are not part'
2388
2403
                   ' of both ancestries (require -rX..Y)'
2389
 
                   )
 
2404
                   ),
 
2405
            Option('signatures',
 
2406
                   help='Show digital signature validity'),
2390
2407
            ]
2391
2408
    encoding_type = 'replace'
2392
2409
 
2405
2422
            include_merges=False,
2406
2423
            authors=None,
2407
2424
            exclude_common_ancestry=False,
 
2425
            signatures=False,
2408
2426
            ):
2409
2427
        from bzrlib.log import (
2410
2428
            Logger,
2464
2482
            self.add_cleanup(b.lock_read().unlock)
2465
2483
            rev1, rev2 = _get_revision_range(revision, b, self.name())
2466
2484
 
 
2485
        if b.get_config().validate_signatures_in_log():
 
2486
            signatures = True
 
2487
 
 
2488
        if signatures:
 
2489
            if not gpg.GPGStrategy.verify_signatures_available():
 
2490
                raise errors.GpgmeNotInstalled(None)
 
2491
 
2467
2492
        # Decide on the type of delta & diff filtering to use
2468
2493
        # TODO: add an --all-files option to make this configurable & consistent
2469
2494
        if not verbose:
2515
2540
            message_search=message, delta_type=delta_type,
2516
2541
            diff_type=diff_type, _match_using_deltas=match_using_deltas,
2517
2542
            exclude_common_ancestry=exclude_common_ancestry,
 
2543
            signature=signatures
2518
2544
            )
2519
2545
        Logger(b, rqst).show(lf)
2520
2546
 
3190
3216
        from bzrlib.msgeditor import (
3191
3217
            edit_commit_message_encoded,
3192
3218
            generate_commit_message_template,
3193
 
            make_commit_message_template_encoded
 
3219
            make_commit_message_template_encoded,
 
3220
            set_commit_message,
3194
3221
        )
3195
3222
 
3196
3223
        commit_stamp = offset = None
3262
3289
                # make_commit_message_template_encoded returns user encoding.
3263
3290
                # We probably want to be using edit_commit_message instead to
3264
3291
                # avoid this.
3265
 
                start_message = generate_commit_message_template(commit_obj)
3266
 
                my_message = edit_commit_message_encoded(text,
3267
 
                    start_message=start_message)
 
3292
                my_message = set_commit_message(commit_obj)
 
3293
                if my_message is None:
 
3294
                    start_message = generate_commit_message_template(commit_obj)
 
3295
                    my_message = edit_commit_message_encoded(text,
 
3296
                        start_message=start_message)
3268
3297
                if my_message is None:
3269
3298
                    raise errors.BzrCommandError("please specify a commit"
3270
3299
                        " message with either --message or --file")
3645
3674
        if typestring == "sftp":
3646
3675
            from bzrlib.tests import stub_sftp
3647
3676
            return stub_sftp.SFTPAbsoluteServer
3648
 
        if typestring == "memory":
 
3677
        elif typestring == "memory":
3649
3678
            from bzrlib.tests import test_server
3650
3679
            return memory.MemoryServer
3651
 
        if typestring == "fakenfs":
 
3680
        elif typestring == "fakenfs":
3652
3681
            from bzrlib.tests import test_server
3653
3682
            return test_server.FakeNFSServer
3654
3683
        msg = "No known transport type %s. Supported types are: sftp\n" %\
3688
3717
                     Option('randomize', type=str, argname="SEED",
3689
3718
                            help='Randomize the order of tests using the given'
3690
3719
                                 ' seed or "now" for the current time.'),
3691
 
                     Option('exclude', type=str, argname="PATTERN",
3692
 
                            short_name='x',
3693
 
                            help='Exclude tests that match this regular'
3694
 
                                 ' expression.'),
 
3720
                     ListOption('exclude', type=str, argname="PATTERN",
 
3721
                                short_name='x',
 
3722
                                help='Exclude tests that match this regular'
 
3723
                                ' expression.'),
3695
3724
                     Option('subunit',
3696
3725
                        help='Output test progress via subunit.'),
3697
3726
                     Option('strict', help='Fail on missing dependencies or '
3748
3777
                "--benchmark is no longer supported from bzr 2.2; "
3749
3778
                "use bzr-usertest instead")
3750
3779
        test_suite_factory = None
 
3780
        if not exclude:
 
3781
            exclude_pattern = None
 
3782
        else:
 
3783
            exclude_pattern = '(' + '|'.join(exclude) + ')'
3751
3784
        selftest_kwargs = {"verbose": verbose,
3752
3785
                          "pattern": pattern,
3753
3786
                          "stop_on_failure": one,
3758
3791
                          "matching_tests_first": first,
3759
3792
                          "list_only": list_only,
3760
3793
                          "random_seed": randomize,
3761
 
                          "exclude_pattern": exclude,
 
3794
                          "exclude_pattern": exclude_pattern,
3762
3795
                          "strict": strict,
3763
3796
                          "load_list": load_list,
3764
3797
                          "debug_flags": debugflag,
3833
3866
    The source of the merge can be specified either in the form of a branch,
3834
3867
    or in the form of a path to a file containing a merge directive generated
3835
3868
    with bzr send. If neither is specified, the default is the upstream branch
3836
 
    or the branch most recently merged using --remember.
 
3869
    or the branch most recently merged using --remember.  The source of the
 
3870
    merge may also be specified in the form of a path to a file in another
 
3871
    branch:  in this case, only the modifications to that file are merged into
 
3872
    the current working tree.
3837
3873
 
3838
3874
    When merging from a branch, by default bzr will try to merge in all new
3839
3875
    work from the other branch, automatically determining an appropriate base
3846
3882
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
3847
3883
    causes some revisions to be skipped, i.e. if the destination branch does
3848
3884
    not already contain revision BASE, such a merge is commonly referred to as
3849
 
    a "cherrypick".
 
3885
    a "cherrypick". Unlike a normal merge, Bazaar does not currently track
 
3886
    cherrypicks. The changes look like a normal commit, and the history of the
 
3887
    changes from the other branch is not stored in the commit.
3850
3888
 
3851
3889
    Revision numbers are always relative to the source branch.
3852
3890
 
3857
3895
 
3858
3896
    Use bzr resolve when you have fixed a problem.  See also bzr conflicts.
3859
3897
 
3860
 
    If there is no default branch set, the first merge will set it. After
3861
 
    that, you can omit the branch to use the default.  To change the
3862
 
    default, use --remember. The value will only be saved if the remote
3863
 
    location can be accessed.
 
3898
    If there is no default branch set, the first merge will set it (use
 
3899
    --no-remember to avoid settting it). After that, you can omit the branch
 
3900
    to use the default.  To change the default, use --remember. The value will
 
3901
    only be saved if the remote location can be accessed.
3864
3902
 
3865
3903
    The results of the merge are placed into the destination working
3866
3904
    directory, where they can be reviewed (with bzr diff), tested, and then
3867
3905
    committed to record the result of the merge.
3868
3906
 
3869
3907
    merge refuses to run if there are any uncommitted changes, unless
3870
 
    --force is given. The --force option can also be used to create a
 
3908
    --force is given.  If --force is given, then the changes from the source 
 
3909
    will be merged with the current working tree, including any uncommitted
 
3910
    changes in the tree.  The --force option can also be used to create a
3871
3911
    merge revision which has more than two parents.
3872
3912
 
3873
3913
    If one would like to merge changes from the working tree of the other
3931
3971
    ]
3932
3972
 
3933
3973
    def run(self, location=None, revision=None, force=False,
3934
 
            merge_type=None, show_base=False, reprocess=None, remember=False,
 
3974
            merge_type=None, show_base=False, reprocess=None, remember=None,
3935
3975
            uncommitted=False, pull=False,
3936
3976
            directory=None,
3937
3977
            preview=False,
3945
3985
        merger = None
3946
3986
        allow_pending = True
3947
3987
        verified = 'inapplicable'
 
3988
 
3948
3989
        tree = WorkingTree.open_containing(directory)[0]
 
3990
        if tree.branch.revno() == 0:
 
3991
            raise errors.BzrCommandError('Merging into empty branches not currently supported, '
 
3992
                                         'https://bugs.launchpad.net/bzr/+bug/308562')
3949
3993
 
3950
3994
        try:
3951
3995
            basis_tree = tree.revision_tree(tree.last_revision())
3997
4041
        self.sanity_check_merger(merger)
3998
4042
        if (merger.base_rev_id == merger.other_rev_id and
3999
4043
            merger.other_rev_id is not None):
 
4044
            # check if location is a nonexistent file (and not a branch) to
 
4045
            # disambiguate the 'Nothing to do'
 
4046
            if merger.interesting_files:
 
4047
                if not merger.other_tree.has_filename(
 
4048
                    merger.interesting_files[0]):
 
4049
                    note("merger: " + str(merger))
 
4050
                    raise errors.PathsDoNotExist([location])
4000
4051
            note('Nothing to do.')
4001
4052
            return 0
4002
4053
        if pull and not preview:
4114
4165
        if other_revision_id is None:
4115
4166
            other_revision_id = _mod_revision.ensure_null(
4116
4167
                other_branch.last_revision())
4117
 
        # Remember where we merge from
4118
 
        if ((remember or tree.branch.get_submit_branch() is None) and
4119
 
             user_location is not None):
 
4168
        # Remember where we merge from. We need to remember if:
 
4169
        # - user specify a location (and we don't merge from the parent
 
4170
        #   branch)
 
4171
        # - user ask to remember or there is no previous location set to merge
 
4172
        #   from and user didn't ask to *not* remember
 
4173
        if (user_location is not None
 
4174
            and ((remember
 
4175
                  or (remember is None
 
4176
                      and tree.branch.get_submit_branch() is None)))):
4120
4177
            tree.branch.set_submit_branch(other_branch.base)
4121
4178
        # Merge tags (but don't set them in the master branch yet, the user
4122
4179
        # might revert this merge).  Commit will propagate them.
4633
4690
    @display_command
4634
4691
    def run(self, verbose=False):
4635
4692
        from bzrlib import plugin
 
4693
        # Don't give writelines a generator as some codecs don't like that
4636
4694
        self.outf.writelines(
4637
 
            plugin.describe_plugins(show_paths=verbose))
 
4695
            list(plugin.describe_plugins(show_paths=verbose)))
4638
4696
 
4639
4697
 
4640
4698
class cmd_testament(Command):
4693
4751
    @display_command
4694
4752
    def run(self, filename, all=False, long=False, revision=None,
4695
4753
            show_ids=False, directory=None):
4696
 
        from bzrlib.annotate import annotate_file, annotate_file_tree
 
4754
        from bzrlib.annotate import (
 
4755
            annotate_file_tree,
 
4756
            )
4697
4757
        wt, branch, relpath = \
4698
4758
            _open_directory_or_containing_tree_or_branch(filename, directory)
4699
4759
        if wt is not None:
4714
4774
            annotate_file_tree(wt, file_id, self.outf, long, all,
4715
4775
                show_ids=show_ids)
4716
4776
        else:
4717
 
            file_version = tree.get_file_revision(file_id)
4718
 
            annotate_file(branch, file_version, file_id, long, all, self.outf,
4719
 
                          show_ids=show_ids)
 
4777
            annotate_file_tree(tree, file_id, self.outf, long, all,
 
4778
                show_ids=show_ids, branch=branch)
4720
4779
 
4721
4780
 
4722
4781
class cmd_re_sign(Command):
4937
4996
 
4938
4997
        if not force:
4939
4998
            if not ui.ui_factory.confirm_action(
4940
 
                    'Uncommit these revisions',
 
4999
                    u'Uncommit these revisions',
4941
5000
                    'bzrlib.builtins.uncommit',
4942
5001
                    {}):
4943
5002
                self.outf.write('Canceled\n')
5279
5338
    source branch defaults to that containing the working directory, but can
5280
5339
    be changed using --from.
5281
5340
 
 
5341
    Both the submit branch and the public branch follow the usual behavior with
 
5342
    respect to --remember: If there is no default location set, the first send
 
5343
    will set it (use --no-remember to avoid settting it). After that, you can
 
5344
    omit the location to use the default.  To change the default, use
 
5345
    --remember. The value will only be saved if the location can be accessed.
 
5346
 
5282
5347
    In order to calculate those changes, bzr must analyse the submit branch.
5283
5348
    Therefore it is most efficient for the submit branch to be a local mirror.
5284
5349
    If a public location is known for the submit_branch, that location is used
5353
5418
        ]
5354
5419
 
5355
5420
    def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5356
 
            no_patch=False, revision=None, remember=False, output=None,
 
5421
            no_patch=False, revision=None, remember=None, output=None,
5357
5422
            format=None, mail_to=None, message=None, body=None,
5358
5423
            strict=None, **kwargs):
5359
5424
        from bzrlib.send import send
5615
5680
            unstacked=None):
5616
5681
        directory = bzrdir.BzrDir.open(location)
5617
5682
        if stacked_on and unstacked:
5618
 
            raise BzrCommandError("Can't use both --stacked-on and --unstacked")
 
5683
            raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
5619
5684
        elif stacked_on is not None:
5620
5685
            reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5621
5686
        elif unstacked:
6153
6218
            self.outf.write('%s %s\n' % (path, location))
6154
6219
 
6155
6220
 
 
6221
class cmd_export_pot(Command):
 
6222
    __doc__ = """Export command helps and error messages in po format."""
 
6223
 
 
6224
    hidden = True
 
6225
 
 
6226
    def run(self):
 
6227
        from bzrlib.export_pot import export_pot
 
6228
        export_pot(self.outf)
 
6229
 
 
6230
 
6156
6231
def _register_lazy_builtins():
6157
6232
    # register lazy builtins from other modules; called at startup and should
6158
6233
    # be only called once.
6163
6238
        ('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6164
6239
        ('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6165
6240
        ('cmd_conflicts', [], 'bzrlib.conflicts'),
6166
 
        ('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
 
6241
        ('cmd_sign_my_commits', [], 'bzrlib.commit_signature_commands'),
 
6242
        ('cmd_verify_signatures', [],
 
6243
                                        'bzrlib.commit_signature_commands'),
6167
6244
        ('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6168
6245
        ]:
6169
6246
        builtin_command_registry.register_lazy(name, aliases, module_name)