/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/mutabletree.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Canonical Ltd
 
1
# Copyright (C) 2006-2010 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
32
32
    hooks,
33
33
    osutils,
34
34
    revisiontree,
35
 
    inventory,
36
35
    symbol_versioning,
37
36
    trace,
38
37
    tree,
80
79
        # used on media which doesn't differentiate the case of names.
81
80
        self.case_sensitive = True
82
81
 
83
 
    def is_control_filename(self, filename):
84
 
        """True if filename is the name of a control file in this tree.
85
 
 
86
 
        :param filename: A filename within the tree. This is a relative path
87
 
        from the root of this tree.
88
 
 
89
 
        This is true IF and ONLY IF the filename is part of the meta data
90
 
        that bzr controls in this tree. I.E. a random .bzr directory placed
91
 
        on disk will not be a control file for this tree.
92
 
        """
93
 
        raise NotImplementedError(self.is_control_filename)
94
 
 
95
82
    @needs_tree_write_lock
96
83
    def add(self, files, ids=None, kinds=None):
97
84
        """Add paths to the set of versioned paths.
195
182
               **kwargs):
196
183
        # avoid circular imports
197
184
        from bzrlib import commit
 
185
        if revprops is None:
 
186
            revprops = {}
198
187
        possible_master_transports=[]
199
 
        revprops = commit.Commit.update_revprops(
200
 
                revprops,
201
 
                self.branch,
202
 
                kwargs.pop('authors', None),
203
 
                kwargs.pop('author', None),
 
188
        if not 'branch-nick' in revprops:
 
189
            revprops['branch-nick'] = self.branch._get_nick(
204
190
                kwargs.get('local', False),
205
191
                possible_master_transports)
 
192
        authors = kwargs.pop('authors', None)
 
193
        author = kwargs.pop('author', None)
 
194
        if authors is not None:
 
195
            if author is not None:
 
196
                raise AssertionError('Specifying both author and authors '
 
197
                        'is not allowed. Specify just authors instead')
 
198
            if 'author' in revprops or 'authors' in revprops:
 
199
                # XXX: maybe we should just accept one of them?
 
200
                raise AssertionError('author property given twice')
 
201
            if authors:
 
202
                for individual in authors:
 
203
                    if '\n' in individual:
 
204
                        raise AssertionError('\\n is not a valid character '
 
205
                                'in an author identity')
 
206
                revprops['authors'] = '\n'.join(authors)
 
207
        if author is not None:
 
208
            symbol_versioning.warn('The parameter author was deprecated'
 
209
                   ' in version 1.13. Use authors instead',
 
210
                   DeprecationWarning)
 
211
            if 'author' in revprops or 'authors' in revprops:
 
212
                # XXX: maybe we should just accept one of them?
 
213
                raise AssertionError('author property given twice')
 
214
            if '\n' in author:
 
215
                raise AssertionError('\\n is not a valid character '
 
216
                        'in an author identity')
 
217
            revprops['authors'] = author
206
218
        # args for wt.commit start at message from the Commit.commit method,
207
219
        args = (message, ) + args
208
220
        for hook in MutableTree.hooks['start_commit']:
388
400
        This is designed more towards DWIM for humans than API clarity.
389
401
        For the specific behaviour see the help for cmd_add().
390
402
 
391
 
        :param file_list: List of zero or more paths.  *NB: these are 
392
 
            interpreted relative to the process cwd, not relative to the 
393
 
            tree.*  (Add and most other tree methods use tree-relative
394
 
            paths.)
395
403
        :param action: A reporter to be called with the inventory, parent_ie,
396
404
            path and kind of the path being added. It may return a file_id if
397
405
            a specific one should be used.
428
436
            for c in self.conflicts():
429
437
                conflicts_related.update(c.associated_filenames())
430
438
 
431
 
        # expand any symlinks in the directory part, while leaving the
432
 
        # filename alone
433
 
        # only expanding if symlinks are supported avoids windows path bugs
434
 
        if osutils.has_symlinks():
435
 
            file_list = map(osutils.normalizepath, file_list)
436
 
 
437
439
        # validate user file paths and convert all paths to tree
438
440
        # relative : it's cheaper to make a tree relative path an abspath
439
441
        # than to convert an abspath to tree relative, and it's cheaper to
559
561
                        this_ie = None
560
562
                    else:
561
563
                        this_ie = inv[this_id]
562
 
                        # Same as in _add_one below, if the inventory doesn't
563
 
                        # think this is a directory, update the inventory
564
 
                        if this_ie.kind != 'directory':
565
 
                            this_ie = inventory.make_entry('directory',
566
 
                                this_ie.name, this_ie.parent_id, this_id)
567
 
                            del inv[this_id]
568
 
                            inv.add(this_ie)
569
564
 
570
565
                for subf in sorted(os.listdir(abspath)):
571
566
                    # here we could use TreeDirectory rather than
652
647
        """Create the default hooks.
653
648
 
654
649
        """
655
 
        hooks.Hooks.__init__(self, "bzrlib.mutabletree", "MutableTree.hooks")
656
 
        self.add_hook('start_commit',
 
650
        hooks.Hooks.__init__(self)
 
651
        self.create_hook(hooks.HookPoint('start_commit',
657
652
            "Called before a commit is performed on a tree. The start commit "
658
653
            "hook is able to change the tree before the commit takes place. "
659
654
            "start_commit is called with the bzrlib.mutabletree.MutableTree "
660
 
            "that the commit is being performed on.", (1, 4))
661
 
        self.add_hook('post_commit',
 
655
            "that the commit is being performed on.", (1, 4), None))
 
656
        self.create_hook(hooks.HookPoint('post_commit',
662
657
            "Called after a commit is performed on a tree. The hook is "
663
658
            "called with a bzrlib.mutabletree.PostCommitHookParams object. "
664
659
            "The mutable tree the commit was performed on is available via "
665
 
            "the mutable_tree attribute of that object.", (2, 0))
 
660
            "the mutable_tree attribute of that object.", (2, 0), None))
666
661
 
667
662
 
668
663
# install the default hooks into the MutableTree class.
745
740
        file_id or None to generate a new file id
746
741
    :returns: None
747
742
    """
748
 
    # if the parent exists, but isn't a directory, we have to do the
749
 
    # kind change now -- really the inventory shouldn't pretend to know
750
 
    # the kind of wt files, but it does.
751
 
    if parent_ie.kind != 'directory':
752
 
        # nb: this relies on someone else checking that the path we're using
753
 
        # doesn't contain symlinks.
754
 
        new_parent_ie = inventory.make_entry('directory', parent_ie.name,
755
 
            parent_ie.parent_id, parent_ie.file_id)
756
 
        del inv[parent_ie.file_id]
757
 
        inv.add(new_parent_ie)
758
 
        parent_ie = new_parent_ie
759
743
    file_id = file_id_callback(inv, parent_ie, path, kind)
760
744
    entry = inv.make_entry(kind, path.base_path, parent_ie.file_id,
761
745
        file_id=file_id)