~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-12-01 09:41:08 UTC
  • mfrom: (4845.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20091201094108-g1zkahrmast6h08b
(spiv) Fix crash involving static_tuple when C extensions are not
        built

Show diffs side-by-side

added added

removed removed

Lines of Context:
43
43
    reconfigure,
44
44
    rename_map,
45
45
    revision as _mod_revision,
 
46
    static_tuple,
46
47
    symbol_versioning,
 
48
    timestamp,
47
49
    transport,
48
50
    ui,
49
51
    urlutils,
257
259
    unknown
258
260
        Not versioned and not matching an ignore pattern.
259
261
 
 
262
    Additionally for directories, symlinks and files with an executable
 
263
    bit, Bazaar indicates their type using a trailing character: '/', '@'
 
264
    or '*' respectively.
 
265
 
260
266
    To see ignored files use 'bzr ignored'.  For details on the
261
267
    changes to file texts, use 'bzr diff'.
262
268
 
431
437
        for node in bt.iter_all_entries():
432
438
            # Node is made up of:
433
439
            # (index, key, value, [references])
434
 
            self.outf.write('%s\n' % (node[1:],))
 
440
            refs_as_tuples = static_tuple.as_tuples(node[3])
 
441
            as_tuple = (tuple(node[1]), node[2], refs_as_tuples)
 
442
            self.outf.write('%s\n' % (as_tuple,))
435
443
 
436
444
 
437
445
class cmd_remove_tree(Command):
461
469
            raise errors.BzrCommandError("You cannot remove the working tree"
462
470
                                         " of a remote path")
463
471
        if not force:
464
 
            # XXX: What about pending merges ? -- vila 20090629
465
 
            if working.has_changes(working.basis_tree()):
 
472
            if (working.has_changes()):
466
473
                raise errors.UncommittedChanges(working)
467
474
 
468
475
        working_path = working.bzrdir.root_transport.base
653
660
        if base_tree:
654
661
            base_tree.lock_read()
655
662
        try:
656
 
            file_list = self._maybe_expand_globs(file_list)
657
663
            tree, file_list = tree_files_for_add(file_list)
658
664
            added, ignored = tree.smart_add(file_list, not
659
665
                no_recurse, action=action, save=not dry_run)
848
854
            # All entries reference existing inventory items, so fix them up
849
855
            # for cicp file-systems.
850
856
            rel_names = tree.get_canonical_inventory_paths(rel_names)
851
 
            for pair in tree.move(rel_names[:-1], rel_names[-1], after=after):
852
 
                self.outf.write("%s => %s\n" % pair)
 
857
            for src, dest in tree.move(rel_names[:-1], rel_names[-1], after=after):
 
858
                if not is_quiet():
 
859
                    self.outf.write("%s => %s\n" % (src, dest))
853
860
        else:
854
861
            if len(names_list) != 2:
855
862
                raise errors.BzrCommandError('to mv multiple files the'
899
906
            dest = osutils.pathjoin(dest_parent, dest_tail)
900
907
            mutter("attempting to move %s => %s", src, dest)
901
908
            tree.rename_one(src, dest, after=after)
902
 
            self.outf.write("%s => %s\n" % (src, dest))
 
909
            if not is_quiet():
 
910
                self.outf.write("%s => %s\n" % (src, dest))
903
911
 
904
912
 
905
913
class cmd_pull(Command):
1109
1117
        else:
1110
1118
            revision_id = None
1111
1119
        if strict and tree is not None and revision_id is None:
1112
 
            if (tree.has_changes(tree.basis_tree())
1113
 
                or len(tree.get_parent_ids()) > 1):
 
1120
            if (tree.has_changes()):
1114
1121
                raise errors.UncommittedChanges(
1115
1122
                    tree, more='Use --no-strict to force the push.')
1116
1123
            if tree.last_revision() != tree.branch.last_revision():
1829
1836
 
1830
1837
            bzr diff -r1
1831
1838
 
1832
 
        Difference between revision 2 and revision 1::
1833
 
 
1834
 
            bzr diff -r1..2
1835
 
 
1836
 
        Difference between revision 2 and revision 1 for branch xxx::
1837
 
 
1838
 
            bzr diff -r1..2 xxx
 
1839
        Difference between revision 3 and revision 1::
 
1840
 
 
1841
            bzr diff -r1..3
 
1842
 
 
1843
        Difference between revision 3 and revision 1 for branch xxx::
 
1844
 
 
1845
            bzr diff -r1..3 xxx
 
1846
 
 
1847
        To see the changes introduced in revision X::
 
1848
        
 
1849
            bzr diff -cX
 
1850
 
 
1851
        Note that in the case of a merge, the -c option shows the changes
 
1852
        compared to the left hand parent. To see the changes against
 
1853
        another parent, use::
 
1854
 
 
1855
            bzr diff -r<chosen_parent>..X
 
1856
 
 
1857
        The changes introduced by revision 2 (equivalent to -r1..2)::
 
1858
 
 
1859
            bzr diff -c2
1839
1860
 
1840
1861
        Show just the differences for file NEWS::
1841
1862
 
1887
1908
    @display_command
1888
1909
    def run(self, revision=None, file_list=None, diff_options=None,
1889
1910
            prefix=None, old=None, new=None, using=None):
1890
 
        from bzrlib.diff import _get_trees_to_diff, show_diff_trees
 
1911
        from bzrlib.diff import get_trees_and_branches_to_diff, show_diff_trees
1891
1912
 
1892
1913
        if (prefix is None) or (prefix == '0'):
1893
1914
            # diff -p0 format
1907
1928
            raise errors.BzrCommandError('bzr diff --revision takes exactly'
1908
1929
                                         ' one or two revision specifiers')
1909
1930
 
1910
 
        old_tree, new_tree, specific_files, extra_trees = \
1911
 
                _get_trees_to_diff(file_list, revision, old, new,
1912
 
                apply_view=True)
 
1931
        (old_tree, new_tree,
 
1932
         old_branch, new_branch,
 
1933
         specific_files, extra_trees) = get_trees_and_branches_to_diff(
 
1934
            file_list, revision, old, new, apply_view=True)
1913
1935
        return show_diff_trees(old_tree, new_tree, sys.stdout,
1914
1936
                               specific_files=specific_files,
1915
1937
                               external_diff_options=diff_options,
2491
2513
        if from_root:
2492
2514
            if relpath:
2493
2515
                prefix = relpath + '/'
2494
 
        elif fs_path != '.':
 
2516
        elif fs_path != '.' and not fs_path.endswith('/'):
2495
2517
            prefix = fs_path + '/'
2496
2518
 
2497
2519
        if revision is not None or tree is None:
2573
2595
 
2574
2596
    See ``bzr help patterns`` for details on the syntax of patterns.
2575
2597
 
 
2598
    If a .bzrignore file does not exist, the ignore command
 
2599
    will create one and add the specified files or patterns to the newly
 
2600
    created file. The ignore command will also automatically add the 
 
2601
    .bzrignore file to be versioned. Creating a .bzrignore file without
 
2602
    the use of the ignore command will require an explicit add command.
 
2603
 
2576
2604
    To remove patterns from the ignore list, edit the .bzrignore file.
2577
2605
    After adding, editing or deleting that file either indirectly by
2578
2606
    using this command or directly by using an editor, be sure to commit
2946
2974
             Option('strict',
2947
2975
                    help="Refuse to commit if there are unknown "
2948
2976
                    "files in the working tree."),
 
2977
             Option('commit-time', type=str,
 
2978
                    help="Manually set a commit time using commit date "
 
2979
                    "format, e.g. '2009-10-10 08:00:00 +0100'."),
2949
2980
             ListOption('fixes', type=str,
2950
2981
                    help="Mark a bug as being fixed by this revision "
2951
2982
                         "(see \"bzr help bugs\")."),
2958
2989
                         "the master branch until a normal commit "
2959
2990
                         "is performed."
2960
2991
                    ),
2961
 
              Option('show-diff',
2962
 
                     help='When no message is supplied, show the diff along'
2963
 
                     ' with the status summary in the message editor.'),
 
2992
             Option('show-diff',
 
2993
                    help='When no message is supplied, show the diff along'
 
2994
                    ' with the status summary in the message editor.'),
2964
2995
             ]
2965
2996
    aliases = ['ci', 'checkin']
2966
2997
 
2985
3016
 
2986
3017
    def run(self, message=None, file=None, verbose=False, selected_list=None,
2987
3018
            unchanged=False, strict=False, local=False, fixes=None,
2988
 
            author=None, show_diff=False, exclude=None):
 
3019
            author=None, show_diff=False, exclude=None, commit_time=None):
2989
3020
        from bzrlib.errors import (
2990
3021
            PointlessCommit,
2991
3022
            ConflictsInTree,
2997
3028
            make_commit_message_template_encoded
2998
3029
        )
2999
3030
 
 
3031
        commit_stamp = offset = None
 
3032
        if commit_time is not None:
 
3033
            try:
 
3034
                commit_stamp, offset = timestamp.parse_patch_date(commit_time)
 
3035
            except ValueError, e:
 
3036
                raise errors.BzrCommandError(
 
3037
                    "Could not parse --commit-time: " + str(e))
 
3038
 
3000
3039
        # TODO: Need a blackbox test for invoking the external editor; may be
3001
3040
        # slightly problematic to run this cross-platform.
3002
3041
 
3025
3064
        def get_message(commit_obj):
3026
3065
            """Callback to get commit message"""
3027
3066
            my_message = message
 
3067
            if my_message is not None and '\r' in my_message:
 
3068
                my_message = my_message.replace('\r\n', '\n')
 
3069
                my_message = my_message.replace('\r', '\n')
3028
3070
            if my_message is None and not file:
3029
3071
                t = make_commit_message_template_encoded(tree,
3030
3072
                        selected_list, diff=show_diff,
3054
3096
                        specific_files=selected_list,
3055
3097
                        allow_pointless=unchanged, strict=strict, local=local,
3056
3098
                        reporter=None, verbose=verbose, revprops=properties,
3057
 
                        authors=author,
 
3099
                        authors=author, timestamp=commit_stamp,
 
3100
                        timezone=offset,
3058
3101
                        exclude=safe_relpath_files(tree, exclude))
3059
3102
        except PointlessCommit:
3060
3103
            # FIXME: This should really happen before the file is read in;
3347
3390
    Tests that need working space on disk use a common temporary directory,
3348
3391
    typically inside $TMPDIR or /tmp.
3349
3392
 
 
3393
    If you set BZR_TEST_PDB=1 when running selftest, failing tests will drop
 
3394
    into a pdb postmortem session.
 
3395
 
3350
3396
    :Examples:
3351
3397
        Run only tests relating to 'ignore'::
3352
3398
 
3389
3435
                     Option('lsprof-timed',
3390
3436
                            help='Generate lsprof output for benchmarked'
3391
3437
                                 ' sections of code.'),
 
3438
                     Option('lsprof-tests',
 
3439
                            help='Generate lsprof output for each test.'),
3392
3440
                     Option('cache-dir', type=str,
3393
3441
                            help='Cache intermediate benchmark output in this '
3394
3442
                                 'directory.'),
3435
3483
            first=False, list_only=False,
3436
3484
            randomize=None, exclude=None, strict=False,
3437
3485
            load_list=None, debugflag=None, starting_with=None, subunit=False,
3438
 
            parallel=None):
 
3486
            parallel=None, lsprof_tests=False):
3439
3487
        from bzrlib.tests import selftest
3440
3488
        import bzrlib.benchmarks as benchmarks
3441
3489
        from bzrlib.benchmarks import tree_creator
3475
3523
                              "transport": transport,
3476
3524
                              "test_suite_factory": test_suite_factory,
3477
3525
                              "lsprof_timed": lsprof_timed,
 
3526
                              "lsprof_tests": lsprof_tests,
3478
3527
                              "bench_history": benchfile,
3479
3528
                              "matching_tests_first": first,
3480
3529
                              "list_only": list_only,
3604
3653
 
3605
3654
            bzr merge -r 81..82 ../bzr.dev
3606
3655
 
3607
 
        To apply a merge directive contained in /tmp/merge:
 
3656
        To apply a merge directive contained in /tmp/merge::
3608
3657
 
3609
3658
            bzr merge /tmp/merge
3610
3659
    """
3657
3706
        verified = 'inapplicable'
3658
3707
        tree = WorkingTree.open_containing(directory)[0]
3659
3708
 
3660
 
        # die as quickly as possible if there are uncommitted changes
3661
3709
        try:
3662
3710
            basis_tree = tree.revision_tree(tree.last_revision())
3663
3711
        except errors.NoSuchRevision:
3664
3712
            basis_tree = tree.basis_tree()
 
3713
 
 
3714
        # die as quickly as possible if there are uncommitted changes
3665
3715
        if not force:
3666
 
            if tree.has_changes(basis_tree):
 
3716
            if tree.has_changes():
3667
3717
                raise errors.UncommittedChanges(tree)
3668
3718
 
3669
3719
        view_info = _get_view_info_for_change_reporter(tree)
3720
3770
                                       merger.other_rev_id)
3721
3771
                    result.report(self.outf)
3722
3772
                    return 0
3723
 
            merger.check_basis(False)
 
3773
            if merger.this_basis is None:
 
3774
                raise errors.BzrCommandError(
 
3775
                    "This branch has no commits."
 
3776
                    " (perhaps you would prefer 'bzr pull')")
3724
3777
            if preview:
3725
3778
                return self._do_preview(merger, cleanups)
3726
3779
            elif interactive:
4020
4073
    name.  If you name a directory, all the contents of that directory will be
4021
4074
    reverted.
4022
4075
 
4023
 
    Any files that have been newly added since that revision will be deleted,
4024
 
    with a backup kept if appropriate.  Directories containing unknown files
4025
 
    will not be deleted.
 
4076
    If you have newly added files since the target revision, they will be
 
4077
    removed.  If the files to be removed have been changed, backups will be
 
4078
    created as above.  Directories containing unknown files will not be
 
4079
    deleted.
4026
4080
 
4027
4081
    The working tree contains a list of pending merged revisions, which will
4028
4082
    be included as parents in the next commit.  Normally, revert clears that
4031
4085
    revert ." in the tree root to revert all files but keep the merge record,
4032
4086
    and "bzr revert --forget-merges" to clear the pending merge list without
4033
4087
    reverting any files.
 
4088
 
 
4089
    Using "bzr revert --forget-merges", it is possible to apply the changes
 
4090
    from an arbitrary merge as a single revision.  To do this, perform the
 
4091
    merge as desired.  Then doing revert with the "--forget-merges" option will
 
4092
    keep the content of the tree as it was, but it will clear the list of
 
4093
    pending merges.  The next commit will then contain all of the changes that
 
4094
    would have been in the merge, but without any mention of the other parent
 
4095
    revisions.  Because this technique forgets where these changes originated,
 
4096
    it may cause additional conflicts on later merges involving the source and
 
4097
    target branches.
4034
4098
    """
4035
4099
 
4036
4100
    _see_also = ['cat', 'export']
4506
4570
    before they will be applied to the local branch.
4507
4571
 
4508
4572
    Bound branches use the nickname of its master branch unless it is set
4509
 
    locally, in which case binding will update the the local nickname to be
 
4573
    locally, in which case binding will update the local nickname to be
4510
4574
    that of the master.
4511
4575
    """
4512
4576
 
4712
4776
    takes_options = [
4713
4777
        Option('inet',
4714
4778
               help='Serve on stdin/out for use from inetd or sshd.'),
4715
 
        RegistryOption('protocol', 
4716
 
               help="Protocol to serve.", 
 
4779
        RegistryOption('protocol',
 
4780
               help="Protocol to serve.",
4717
4781
               lazy_registry=('bzrlib.transport', 'transport_server_registry'),
4718
4782
               value_switches=True),
4719
4783
        Option('port',
4728
4792
        Option('allow-writes',
4729
4793
               help='By default the server is a readonly server.  Supplying '
4730
4794
                    '--allow-writes enables write access to the contents of '
4731
 
                    'the served directory and below.'
 
4795
                    'the served directory and below.  Note that ``bzr serve`` '
 
4796
                    'does not perform authentication, so unless some form of '
 
4797
                    'external authentication is arranged supplying this '
 
4798
                    'option leads to global uncontrolled write access to your '
 
4799
                    'file system.'
4732
4800
                ),
4733
4801
        ]
4734
4802
 
4969
5037
 
4970
5038
    To use a specific mail program, set the mail_client configuration option.
4971
5039
    (For Thunderbird 1.5, this works around some bugs.)  Supported values for
4972
 
    specific clients are "claws", "evolution", "kmail", "mutt", and
4973
 
    "thunderbird"; generic options are "default", "editor", "emacsclient",
4974
 
    "mapi", and "xdg-email".  Plugins may also add supported clients.
 
5040
    specific clients are "claws", "evolution", "kmail", "mail.app" (MacOS X's
 
5041
    Mail.app), "mutt", and "thunderbird"; generic options are "default",
 
5042
    "editor", "emacsclient", "mapi", and "xdg-email".  Plugins may also add
 
5043
    supported clients.
4975
5044
 
4976
5045
    If mail is being sent, a to address is required.  This can be supplied
4977
5046
    either on the commandline, by setting the submit_to configuration
5356
5425
    /path/to/newbranch.
5357
5426
 
5358
5427
    Bound branches use the nickname of its master branch unless it is set
5359
 
    locally, in which case switching will update the the local nickname to be
 
5428
    locally, in which case switching will update the local nickname to be
5360
5429
    that of the master.
5361
5430
    """
5362
5431
 
5656
5725
            try:
5657
5726
                shelver.run()
5658
5727
            finally:
5659
 
                shelver.work_tree.unlock()
 
5728
                shelver.finalize()
5660
5729
        except errors.UserAbort:
5661
5730
            return 0
5662
5731