~bzr-pqm/bzr/bzr.dev

5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2006-2011 Canonical Ltd
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
16
17
"""MutableTree object.
18
19
See MutableTree for more details.
20
"""
21
22
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
23
from bzrlib.lazy_import import lazy_import
24
lazy_import(globals(), """
25
import os
4634.55.1 by Robert Collins
Do not add files whose name contains new lines or carriage returns
26
import re
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
27
2568.2.6 by Robert Collins
Review feedback.
28
from bzrlib import (
29
    add,
30
    bzrdir,
4721.3.1 by Vincent Ladeuil
Cleanup imports.
31
    errors,
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
32
    hooks,
5802.1.1 by Jelmer Vernooij
Move Inventory._get_mutable_inventory -> mutable_inventory_from_tree.
33
    inventory as _mod_inventory,
4721.3.1 by Vincent Ladeuil
Cleanup imports.
34
    osutils,
35
    revisiontree,
36
    trace,
37
    tree,
2568.2.6 by Robert Collins
Review feedback.
38
    )
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
39
""")
40
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
41
from bzrlib.decorators import needs_read_lock, needs_write_lock
42
43
1986.1.8 by Robert Collins
Update to bzr.dev, which involves adding lock_tree_write to MutableTree and MemoryTree.
44
def needs_tree_write_lock(unbound):
45
    """Decorate unbound to take out and release a tree_write lock."""
46
    def tree_write_locked(self, *args, **kwargs):
47
        self.lock_tree_write()
48
        try:
49
            return unbound(self, *args, **kwargs)
50
        finally:
51
            self.unlock()
52
    tree_write_locked.__doc__ = unbound.__doc__
53
    tree_write_locked.__name__ = unbound.__name__
54
    return tree_write_locked
55
56
5777.4.1 by Jelmer Vernooij
Split inventory-specific code out of MutableTree into MutableInventoryTree.
57
class MutableTree(tree.Tree):
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
58
    """A MutableTree is a specialisation of Tree which is able to be mutated.
59
60
    Generally speaking these mutations are only possible within a lock_write
61
    context, and will revert if the lock is broken abnormally - but this cannot
62
    be guaranteed - depending on the exact implementation of the mutable state.
63
64
    The most common form of Mutable Tree is WorkingTree, see bzrlib.workingtree.
65
    For tests we also have MemoryTree which is a MutableTree whose contents are
66
    entirely in memory.
67
68
    For now, we are not treating MutableTree as an interface to provide
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
69
    conformance tests for - rather we are testing MemoryTree specifically, and
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
70
    interface testing implementations of WorkingTree.
71
72
    A mutable tree always has an associated Branch and BzrDir object - the
73
    branch and bzrdir attributes.
74
    """
3794.5.19 by Mark Hammond
MutableTree gets case_sensitive attribute and smart_add takes advantage of it to enforce sane CICP-filesystem semantics
75
    def __init__(self, *args, **kw):
76
        super(MutableTree, self).__init__(*args, **kw)
77
        # Is this tree on a case-insensitive or case-preserving file-system?
78
        # Sub-classes may initialize to False if they detect they are being
79
        # used on media which doesn't differentiate the case of names.
80
        self.case_sensitive = True
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
81
5699.2.1 by Jelmer Vernooij
Move is_control_filename() from Tree to MutableTree.
82
    def is_control_filename(self, filename):
83
        """True if filename is the name of a control file in this tree.
84
85
        :param filename: A filename within the tree. This is a relative path
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
86
            from the root of this tree.
5699.2.1 by Jelmer Vernooij
Move is_control_filename() from Tree to MutableTree.
87
88
        This is true IF and ONLY IF the filename is part of the meta data
89
        that bzr controls in this tree. I.E. a random .bzr directory placed
90
        on disk will not be a control file for this tree.
91
        """
92
        raise NotImplementedError(self.is_control_filename)
93
2255.7.66 by Robert Collins
MutableTree.add only needs a tree write lock.
94
    @needs_tree_write_lock
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
95
    def add(self, files, ids=None, kinds=None):
96
        """Add paths to the set of versioned paths.
97
98
        Note that the command line normally calls smart_add instead,
99
        which can automatically recurse.
100
101
        This adds the files to the inventory, so that they will be
102
        recorded by the next commit.
103
104
        :param files: List of paths to add, relative to the base of the tree.
105
        :param ids: If set, use these instead of automatically generated ids.
106
            Must be the same length as the list of files, but may
107
            contain None for ids that are to be autogenerated.
108
        :param kinds: Optional parameter to specify the kinds to be used for
109
            each file.
110
111
        TODO: Perhaps callback with the ids and paths as they're added.
112
        """
113
        if isinstance(files, basestring):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
114
            # XXX: Passing a single string is inconsistent and should be
115
            # deprecated.
116
            if not (ids is None or isinstance(ids, basestring)):
117
                raise AssertionError()
118
            if not (kinds is None or isinstance(kinds, basestring)):
119
                raise AssertionError()
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
120
            files = [files]
121
            if ids is not None:
122
                ids = [ids]
123
            if kinds is not None:
124
                kinds = [kinds]
125
2323.4.2 by Robert Collins
Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.
126
        files = [path.strip('/') for path in files]
127
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
128
        if ids is None:
129
            ids = [None] * len(files)
130
        else:
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
131
            if not (len(ids) == len(files)):
132
                raise AssertionError()
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
133
        if kinds is None:
134
            kinds = [None] * len(files)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
135
        elif not len(kinds) == len(files):
136
            raise AssertionError()
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
137
        for f in files:
138
            # generic constraint checks:
139
            if self.is_control_filename(f):
140
                raise errors.ForbiddenControlFileError(filename=f)
4721.3.1 by Vincent Ladeuil
Cleanup imports.
141
            fp = osutils.splitpath(f)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
142
        # fill out file kinds for all files [not needed when we stop
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
143
        # caring about the instantaneous file kind within a uncommmitted tree
144
        #
145
        self._gather_kinds(files, kinds)
146
        self._add(files, ids, kinds)
147
2255.6.8 by Aaron Bentley
Merge refactoring of add_reference
148
    def add_reference(self, sub_tree):
149
        """Add a TreeReference to the tree, pointing at sub_tree"""
150
        raise errors.UnsupportedOperation(self.add_reference, self)
151
152
    def _add_reference(self, sub_tree):
153
        """Standard add_reference implementation, for use by subclasses"""
154
        try:
155
            sub_tree_path = self.relpath(sub_tree.basedir)
156
        except errors.PathNotChild:
157
            raise errors.BadReferenceTarget(self, sub_tree,
158
                                            'Target not inside tree.')
159
        sub_tree_id = sub_tree.get_root_id()
160
        if sub_tree_id == self.get_root_id():
161
            raise errors.BadReferenceTarget(self, sub_tree,
162
                                     'Trees have the same root id.')
5777.4.1 by Jelmer Vernooij
Split inventory-specific code out of MutableTree into MutableInventoryTree.
163
        if sub_tree_id in self:
2255.6.8 by Aaron Bentley
Merge refactoring of add_reference
164
            raise errors.BadReferenceTarget(self, sub_tree,
165
                                            'Root id already present in tree')
166
        self._add([sub_tree_path], [sub_tree_id], ['tree-reference'])
167
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
168
    def _add(self, files, ids, kinds):
2255.6.8 by Aaron Bentley
Merge refactoring of add_reference
169
        """Helper function for add - updates the inventory.
170
171
        :param files: sequence of pathnames, relative to the tree root
172
        :param ids: sequence of suggested ids for the files (may be None)
173
        :param kinds: sequence of  inventory kinds of the files (i.e. may
174
            contain "tree-reference")
175
        """
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
176
        raise NotImplementedError(self._add)
177
2376.2.1 by Aaron Bentley
Implement MutableTree.apply_inventory_delta
178
    def apply_inventory_delta(self, changes):
179
        """Apply changes to the inventory as an atomic operation.
180
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
181
        :param changes: An inventory delta to apply to the working tree's
182
            inventory.
183
        :return None:
184
        :seealso Inventory.apply_delta: For details on the changes parameter.
2376.2.9 by Aaron Bentley
Cleanup from review
185
        """
5777.4.1 by Jelmer Vernooij
Split inventory-specific code out of MutableTree into MutableInventoryTree.
186
        raise NotImplementedError(self.apply_inventory_delta)
2376.2.1 by Aaron Bentley
Implement MutableTree.apply_inventory_delta
187
188
    @needs_write_lock
2255.2.218 by Robert Collins
Make the nested tree commit smoke test be more rigourous.
189
    def commit(self, message=None, revprops=None, *args,
2100.3.27 by Aaron Bentley
Enable nested commits
190
               **kwargs):
1986.1.3 by Robert Collins
Merge bzr.dev.
191
        # avoid circular imports
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
192
        from bzrlib import commit
3565.6.9 by Marius Kruger
Jump through hoops not to open multiple connections when committing to a bound branch.
193
        possible_master_transports=[]
5162.4.1 by Aaron Bentley
TreeTransform supports normal commit parameters and includes branch nick.
194
        revprops = commit.Commit.update_revprops(
195
                revprops,
196
                self.branch,
197
                kwargs.pop('authors', None),
198
                kwargs.pop('author', None),
3815.3.4 by Marius Kruger
When doing a `commit --local`, don't try to connect to the master branch.
199
                kwargs.get('local', False),
3565.6.9 by Marius Kruger
Jump through hoops not to open multiple connections when committing to a bound branch.
200
                possible_master_transports)
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
201
        # args for wt.commit start at message from the Commit.commit method,
2367.2.1 by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins)
202
        args = (message, ) + args
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
203
        for hook in MutableTree.hooks['start_commit']:
204
            hook(self)
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
205
        committed_id = commit.Commit().commit(working_tree=self,
3565.6.9 by Marius Kruger
Jump through hoops not to open multiple connections when committing to a bound branch.
206
            revprops=revprops,
207
            possible_master_transports=possible_master_transports,
208
            *args, **kwargs)
4634.33.3 by Ian Clatworthy
review feedback from Robert: rename finish_commit to post_commit
209
        post_hook_params = PostCommitHookParams(self)
210
        for hook in MutableTree.hooks['post_commit']:
211
            hook(post_hook_params)
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
212
        return committed_id
213
214
    def _gather_kinds(self, files, kinds):
215
        """Helper function for add - sets the entries of kinds."""
216
        raise NotImplementedError(self._gather_kinds)
217
1986.1.6 by Robert Collins
Add MemoryTree.last_revision.
218
    @needs_read_lock
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
219
    def has_changes(self, _from_tree=None):
220
        """Quickly check that the tree contains at least one commitable change.
221
222
        :param _from_tree: tree to compare against to find changes (default to
223
            the basis tree and is intended to be used by tests).
4503.1.3 by Vincent Ladeuil
Take review comments into account.
224
225
        :return: True if a change is found. False otherwise
226
        """
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
227
        # Check pending merges
228
        if len(self.get_parent_ids()) > 1:
229
            return True
230
        if _from_tree is None:
231
            _from_tree = self.basis_tree()
232
        changes = self.iter_changes(_from_tree)
4503.1.3 by Vincent Ladeuil
Take review comments into account.
233
        try:
234
            change = changes.next()
235
            # Exclude root (talk about black magic... --vila 20090629)
236
            if change[4] == (None, None):
237
                change = changes.next()
238
            return True
239
        except StopIteration:
240
            # No changes
241
            return False
242
243
    @needs_read_lock
5171.2.2 by Vincent Ladeuil
Explain that the uncommitted changes are not processed when
244
    def check_changed_or_out_of_date(self, strict, opt_name,
245
                                     more_error, more_warning):
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
246
        """Check the tree for uncommitted changes and branch synchronization.
247
248
        If strict is None and not set in the config files, a warning is issued.
249
        If strict is True, an error is raised.
250
        If strict is False, no checks are done and no warning is issued.
251
252
        :param strict: True, False or None, searched in branch config if None.
253
254
        :param opt_name: strict option name to search in config file.
255
5171.2.2 by Vincent Ladeuil
Explain that the uncommitted changes are not processed when
256
        :param more_error: Details about how to avoid the check.
257
258
        :param more_warning: Details about what is happening.
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
259
        """
260
        if strict is None:
261
            strict = self.branch.get_config().get_user_option_as_bool(opt_name)
262
        if strict is not False:
5171.2.1 by Vincent Ladeuil
Fix the warning message for unclean trees.
263
            err_class = None
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
264
            if (self.has_changes()):
5171.2.1 by Vincent Ladeuil
Fix the warning message for unclean trees.
265
                err_class = errors.UncommittedChanges
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
266
            elif self.last_revision() != self.branch.last_revision():
267
                # The tree has lost sync with its branch, there is little
268
                # chance that the user is aware of it but he can still force
269
                # the action with --no-strict
5171.2.1 by Vincent Ladeuil
Fix the warning message for unclean trees.
270
                err_class = errors.OutOfDateTree
271
            if err_class is not None:
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
272
                if strict is None:
5171.2.2 by Vincent Ladeuil
Explain that the uncommitted changes are not processed when
273
                    err = err_class(self, more=more_warning)
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
274
                    # We don't want to interrupt the user if he expressed no
275
                    # preference about strict.
5158.1.1 by Vincent Ladeuil
Use the proper argument for the warning.
276
                    trace.warning('%s', err._format())
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
277
                else:
5171.2.2 by Vincent Ladeuil
Explain that the uncommitted changes are not processed when
278
                    err = err_class(self, more=more_error)
5147.2.2 by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees.
279
                    raise err
280
281
    @needs_read_lock
1986.1.6 by Robert Collins
Add MemoryTree.last_revision.
282
    def last_revision(self):
1986.1.7 by Robert Collins
Merge bzr.dev.
283
        """Return the revision id of the last commit performed in this tree.
284
285
        In early tree formats the result of last_revision is the same as the
286
        branch last_revision, but that is no longer the case for modern tree
287
        formats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
288
1986.1.7 by Robert Collins
Merge bzr.dev.
289
        last_revision returns the left most parent id, or None if there are no
290
        parents.
291
292
        last_revision was deprecated as of 0.11. Please use get_parent_ids
293
        instead.
294
        """
1986.1.6 by Robert Collins
Add MemoryTree.last_revision.
295
        raise NotImplementedError(self.last_revision)
296
1986.1.8 by Robert Collins
Update to bzr.dev, which involves adding lock_tree_write to MutableTree and MemoryTree.
297
    def lock_tree_write(self):
298
        """Lock the working tree for write, and the branch for read.
299
300
        This is useful for operations which only need to mutate the working
301
        tree. Taking out branch write locks is a relatively expensive process
302
        and may fail if the branch is on read only media. So branch write locks
303
        should only be taken out when we are modifying branch data - such as in
304
        operations like commit, pull, uncommit and update.
305
        """
306
        raise NotImplementedError(self.lock_tree_write)
307
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
308
    def lock_write(self):
309
        """Lock the tree and its branch. This allows mutating calls to be made.
310
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
311
        Some mutating methods will take out implicit write locks, but in
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
312
        general you should always obtain a write lock before calling mutating
313
        methods on a tree.
314
        """
315
        raise NotImplementedError(self.lock_write)
316
317
    @needs_write_lock
318
    def mkdir(self, path, file_id=None):
319
        """Create a directory in the tree. if file_id is None, one is assigned.
320
321
        :param path: A unicode file path.
322
        :param file_id: An optional file-id.
323
        :return: the file id of the new directory.
324
        """
325
        raise NotImplementedError(self.mkdir)
326
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
327
    def _observed_sha1(self, file_id, path, (sha1, stat_value)):
3709.3.1 by Robert Collins
First cut - make it work - at updating the tree stat cache during commit.
328
        """Tell the tree we have observed a paths sha1.
329
330
        The intent of this function is to allow trees that have a hashcache to
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
331
        update the hashcache during commit. If the observed file is too new
332
        (based on the stat_value) to be safely hash-cached the tree will ignore
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
333
        it.
3709.3.1 by Robert Collins
First cut - make it work - at updating the tree stat cache during commit.
334
335
        The default implementation does nothing.
336
337
        :param file_id: The file id
338
        :param path: The file path
339
        :param sha1: The sha 1 that was observed.
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
340
        :param stat_value: A stat result for the file the sha1 was read from.
3709.3.1 by Robert Collins
First cut - make it work - at updating the tree stat cache during commit.
341
        :return: None
342
        """
343
3394.2.1 by Ian Clatworthy
add docstring for put_file_bytes_non_atomic
344
    @needs_write_lock
345
    def put_file_bytes_non_atomic(self, file_id, bytes):
346
        """Update the content of a file in the tree.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
347
3394.2.1 by Ian Clatworthy
add docstring for put_file_bytes_non_atomic
348
        Note that the file is written in-place rather than being
349
        written to a temporary location and renamed. As a consequence,
350
        readers can potentially see the file half-written.
351
352
        :param file_id: file-id of the file
353
        :param bytes: the new file contents
354
        """
355
        raise NotImplementedError(self.put_file_bytes_non_atomic)
356
2418.5.1 by John Arbash Meinel
Make a Branch helper which can create a very basic MemoryTree with history.
357
    def set_parent_ids(self, revision_ids, allow_leftmost_as_ghost=False):
358
        """Set the parents ids of the working tree.
359
360
        :param revision_ids: A list of revision_ids.
361
        """
362
        raise NotImplementedError(self.set_parent_ids)
363
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
364
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
365
        """Set the parents of the working tree.
366
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
367
        :param parents_list: A list of (revision_id, tree) tuples.
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
368
            If tree is None, then that element is treated as an unreachable
369
            parent tree - i.e. a ghost.
370
        """
371
        raise NotImplementedError(self.set_parent_trees)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
372
5777.4.1 by Jelmer Vernooij
Split inventory-specific code out of MutableTree into MutableInventoryTree.
373
    def smart_add(self, file_list, recurse=True, action=None, save=True):
374
        """Version file_list, optionally recursing into directories.
375
376
        This is designed more towards DWIM for humans than API clarity.
377
        For the specific behaviour see the help for cmd_add().
378
379
        :param file_list: List of zero or more paths.  *NB: these are 
380
            interpreted relative to the process cwd, not relative to the 
381
            tree.*  (Add and most other tree methods use tree-relative
382
            paths.)
383
        :param action: A reporter to be called with the inventory, parent_ie,
384
            path and kind of the path being added. It may return a file_id if
385
            a specific one should be used.
386
        :param save: Save the inventory after completing the adds. If False
387
            this provides dry-run functionality by doing the add and not saving
388
            the inventory.
389
        :return: A tuple - files_added, ignored_files. files_added is the count
390
            of added files, and ignored_files is a dict mapping files that were
391
            ignored to the rule that caused them to be ignored.
392
        """
393
        raise NotImplementedError(self.smart_add)
394
395
    def update_basis_by_delta(self, new_revid, delta):
396
        """Update the parents of this tree after a commit.
397
398
        This gives the tree one parent, with revision id new_revid. The
399
        inventory delta is applied to the current basis tree to generate the
400
        inventory for the parent new_revid, and all other parent trees are
401
        discarded.
402
403
        All the changes in the delta should be changes synchronising the basis
404
        tree with some or all of the working tree, with a change to a directory
405
        requiring that its contents have been recursively included. That is,
406
        this is not a general purpose tree modification routine, but a helper
407
        for commit which is not required to handle situations that do not arise
408
        outside of commit.
409
410
        See the inventory developers documentation for the theory behind
411
        inventory deltas.
412
413
        :param new_revid: The new revision id for the trees parent.
414
        :param delta: An inventory delta (see apply_inventory_delta) describing
415
            the changes from the current left most parent revision to new_revid.
416
        """
417
        raise NotImplementedError(self.update_basis_by_delta)
418
419
420
class MutableInventoryTree(MutableTree,tree.InventoryTree):
421
422
    @needs_tree_write_lock
423
    def apply_inventory_delta(self, changes):
424
        """Apply changes to the inventory as an atomic operation.
425
426
        :param changes: An inventory delta to apply to the working tree's
427
            inventory.
428
        :return None:
429
        :seealso Inventory.apply_delta: For details on the changes parameter.
430
        """
431
        self.flush()
432
        inv = self.inventory
433
        inv.apply_delta(changes)
434
        self._write_inventory(inv)
435
436
    def _fix_case_of_inventory_path(self, path):
437
        """If our tree isn't case sensitive, return the canonical path"""
438
        if not self.case_sensitive:
439
            path = self.get_canonical_inventory_path(path)
440
        return path
441
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
442
    @needs_tree_write_lock
443
    def smart_add(self, file_list, recurse=True, action=None, save=True):
444
        """Version file_list, optionally recursing into directories.
445
446
        This is designed more towards DWIM for humans than API clarity.
447
        For the specific behaviour see the help for cmd_add().
448
4634.157.3 by Martin Pool
doc
449
        :param file_list: List of zero or more paths.  *NB: these are 
450
            interpreted relative to the process cwd, not relative to the 
451
            tree.*  (Add and most other tree methods use tree-relative
452
            paths.)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
453
        :param action: A reporter to be called with the inventory, parent_ie,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
454
            path and kind of the path being added. It may return a file_id if
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
455
            a specific one should be used.
456
        :param save: Save the inventory after completing the adds. If False
457
            this provides dry-run functionality by doing the add and not saving
2585.1.1 by Aaron Bentley
Unify MutableTree.smart_add behavior by disabling quirky memory-only Inventory
458
            the inventory.
2568.2.6 by Robert Collins
Review feedback.
459
        :return: A tuple - files_added, ignored_files. files_added is the count
460
            of added files, and ignored_files is a dict mapping files that were
461
            ignored to the rule that caused them to be ignored.
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
462
        """
463
        # not in an inner loop; and we want to remove direct use of this,
464
        # so here as a reminder for now. RBC 20070703
465
        from bzrlib.inventory import InventoryEntry
466
        if action is None:
467
            action = add.AddAction()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
468
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
469
        if not file_list:
470
            # no paths supplied: add the entire tree.
5013.2.4 by Vincent Ladeuil
``bzr add`` won't blindly add conflict related files.
471
            # FIXME: this assumes we are running in a working tree subdir :-/
472
            # -- vila 20100208
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
473
            file_list = [u'.']
474
        # mutter("smart add of %r")
475
        inv = self.inventory
476
        added = []
477
        ignored = {}
478
        dirs_to_add = []
479
        user_dirs = set()
5013.2.5 by Vincent Ladeuil
Use a set() for conflicts_related to stay O(1).
480
        conflicts_related = set()
5013.2.4 by Vincent Ladeuil
``bzr add`` won't blindly add conflict related files.
481
        # Not all mutable trees can have conflicts
482
        if getattr(self, 'conflicts', None) is not None:
483
            # Collect all related files without checking whether they exist or
484
            # are versioned. It's cheaper to do that once for all conflicts
485
            # than trying to find the relevant conflict for each added file.
486
            for c in self.conflicts():
5013.2.5 by Vincent Ladeuil
Use a set() for conflicts_related to stay O(1).
487
                conflicts_related.update(c.associated_filenames())
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
488
4634.159.8 by Martin Pool
Handle adding a file under a symlink whose real parent is not yet versioned
489
        # expand any symlinks in the directory part, while leaving the
490
        # filename alone
4634.169.2 by Martin
Add comment explaining has_symlinks check, and NEWS
491
        # only expanding if symlinks are supported avoids windows path bugs
4634.169.1 by Martin
Don't use normalizepath in smart_add unless symlinks are supported which avoids unicode breakage on windows
492
        if osutils.has_symlinks():
493
            file_list = map(osutils.normalizepath, file_list)
4634.159.8 by Martin Pool
Handle adding a file under a symlink whose real parent is not yet versioned
494
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
495
        # validate user file paths and convert all paths to tree
2568.2.6 by Robert Collins
Review feedback.
496
        # relative : it's cheaper to make a tree relative path an abspath
3794.5.39 by Mark Hammond
typos and whitespace changes.
497
        # than to convert an abspath to tree relative, and it's cheaper to
3794.5.19 by Mark Hammond
MutableTree gets case_sensitive attribute and smart_add takes advantage of it to enforce sane CICP-filesystem semantics
498
        # perform the canonicalization in bulk.
499
        for filepath in osutils.canonical_relpaths(self.basedir, file_list):
500
            rf = _FastPath(filepath)
4721.3.1 by Vincent Ladeuil
Cleanup imports.
501
            # validate user parameters. Our recursive code avoids adding new
502
            # files that need such validation
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
503
            if self.is_control_filename(rf.raw_path):
504
                raise errors.ForbiddenControlFileError(filename=rf.raw_path)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
505
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
506
            abspath = self.abspath(rf.raw_path)
507
            kind = osutils.file_kind(abspath)
508
            if kind == 'directory':
509
                # schedule the dir for scanning
510
                user_dirs.add(rf)
511
            else:
512
                if not InventoryEntry.versionable_kind(kind):
513
                    raise errors.BadFileKindError(filename=abspath, kind=kind)
4721.3.1 by Vincent Ladeuil
Cleanup imports.
514
            # ensure the named path is added, so that ignore rules in the later
515
            # directory walk dont skip it.
516
            # we dont have a parent ie known yet.: use the relatively slower
517
            # inventory probing method
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
518
            versioned = inv.has_filename(rf.raw_path)
519
            if versioned:
520
                continue
521
            added.extend(_add_one_and_parent(self, inv, None, rf, kind, action))
522
523
        if not recurse:
524
            # no need to walk any directories at all.
525
            if len(added) > 0 and save:
526
                self._write_inventory(inv)
527
            return added, ignored
528
529
        # only walk the minimal parents needed: we have user_dirs to override
530
        # ignores.
531
        prev_dir = None
532
533
        is_inside = osutils.is_inside_or_parent_of_any
534
        for path in sorted(user_dirs):
535
            if (prev_dir is None or not is_inside([prev_dir], path.raw_path)):
536
                dirs_to_add.append((path, None))
537
            prev_dir = path.raw_path
538
4634.55.1 by Robert Collins
Do not add files whose name contains new lines or carriage returns
539
        illegalpath_re = re.compile(r'[\r\n]')
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
540
        # dirs_to_add is initialised to a list of directories, but as we scan
541
        # directories we append files to it.
542
        # XXX: We should determine kind of files when we scan them rather than
543
        # adding to this list. RBC 20070703
544
        for directory, parent_ie in dirs_to_add:
545
            # directory is tree-relative
546
            abspath = self.abspath(directory.raw_path)
547
548
            # get the contents of this directory.
549
550
            # find the kind of the path being added.
551
            kind = osutils.file_kind(abspath)
552
553
            if not InventoryEntry.versionable_kind(kind):
4721.3.1 by Vincent Ladeuil
Cleanup imports.
554
                trace.warning("skipping %s (can't add file of kind '%s')",
555
                              abspath, kind)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
556
                continue
4634.55.1 by Robert Collins
Do not add files whose name contains new lines or carriage returns
557
            if illegalpath_re.search(directory.raw_path):
4721.3.1 by Vincent Ladeuil
Cleanup imports.
558
                trace.warning("skipping %r (contains \\n or \\r)" % abspath)
4634.55.1 by Robert Collins
Do not add files whose name contains new lines or carriage returns
559
                continue
5013.2.4 by Vincent Ladeuil
``bzr add`` won't blindly add conflict related files.
560
            if directory.raw_path in conflicts_related:
561
                # If the file looks like one generated for a conflict, don't
562
                # add it.
563
                trace.warning(
564
                    'skipping %s (generated to help resolve conflicts)',
565
                    abspath)
566
                continue
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
567
568
            if parent_ie is not None:
569
                versioned = directory.base_path in parent_ie.children
570
            else:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
571
                # without the parent ie, use the relatively slower inventory
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
572
                # probing method
3794.5.19 by Mark Hammond
MutableTree gets case_sensitive attribute and smart_add takes advantage of it to enforce sane CICP-filesystem semantics
573
                versioned = inv.has_filename(
3794.5.31 by Mark Hammond
bulk of the simple review comments from igc.
574
                        self._fix_case_of_inventory_path(directory.raw_path))
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
575
576
            if kind == 'directory':
577
                try:
578
                    sub_branch = bzrdir.BzrDir.open(abspath)
579
                    sub_tree = True
580
                except errors.NotBranchError:
581
                    sub_tree = False
582
                except errors.UnsupportedFormatError:
583
                    sub_tree = True
584
            else:
585
                sub_tree = False
586
587
            if directory.raw_path == '':
588
                # mutter("tree root doesn't need to be added")
589
                sub_tree = False
590
            elif versioned:
591
                pass
592
                # mutter("%r is already versioned", abspath)
593
            elif sub_tree:
4721.3.1 by Vincent Ladeuil
Cleanup imports.
594
                # XXX: This is wrong; people *might* reasonably be trying to
595
                # add subtrees as subtrees.  This should probably only be done
596
                # in formats which can represent subtrees, and even then
597
                # perhaps only when the user asked to add subtrees.  At the
598
                # moment you can add them specially through 'join --reference',
599
                # which is perhaps reasonable: adding a new reference is a
600
                # special operation and can have a special behaviour.  mbp
601
                # 20070306
602
                trace.mutter("%r is a nested bzr tree", abspath)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
603
            else:
604
                _add_one(self, inv, parent_ie, directory, kind, action)
605
                added.append(directory.raw_path)
606
607
            if kind == 'directory' and not sub_tree:
608
                if parent_ie is not None:
609
                    # must be present:
610
                    this_ie = parent_ie.children[directory.base_path]
611
                else:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
612
                    # without the parent ie, use the relatively slower inventory
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
613
                    # probing method
3794.5.19 by Mark Hammond
MutableTree gets case_sensitive attribute and smart_add takes advantage of it to enforce sane CICP-filesystem semantics
614
                    this_id = inv.path2id(
4721.3.1 by Vincent Ladeuil
Cleanup imports.
615
                        self._fix_case_of_inventory_path(directory.raw_path))
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
616
                    if this_id is None:
617
                        this_ie = None
618
                    else:
619
                        this_ie = inv[this_id]
5504.6.2 by Martin
If a dir being added used to be something else detect and correct
620
                        # Same as in _add_one below, if the inventory doesn't
621
                        # think this is a directory, update the inventory
622
                        if this_ie.kind != 'directory':
5802.1.1 by Jelmer Vernooij
Move Inventory._get_mutable_inventory -> mutable_inventory_from_tree.
623
                            this_ie = _mod_inventory.make_entry('directory',
5504.6.2 by Martin
If a dir being added used to be something else detect and correct
624
                                this_ie.name, this_ie.parent_id, this_id)
625
                            del inv[this_id]
626
                            inv.add(this_ie)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
627
628
                for subf in sorted(os.listdir(abspath)):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
629
                    # here we could use TreeDirectory rather than
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
630
                    # string concatenation.
631
                    subp = osutils.pathjoin(directory.raw_path, subf)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
632
                    # TODO: is_control_filename is very slow. Make it faster.
633
                    # TreeDirectory.is_control_filename could also make this
634
                    # faster - its impossible for a non root dir to have a
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
635
                    # control file.
636
                    if self.is_control_filename(subp):
4721.3.1 by Vincent Ladeuil
Cleanup imports.
637
                        trace.mutter("skip control directory %r", subp)
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
638
                    elif subf in this_ie.children:
639
                        # recurse into this already versioned subdir.
2568.2.5 by Robert Collins
* ``bzrlib.add.FastPath`` is now private and moved to
640
                        dirs_to_add.append((_FastPath(subp, subf), this_ie))
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
641
                    else:
642
                        # user selection overrides ignoes
643
                        # ignore while selecting files - if we globbed in the
644
                        # outer loop we would ignore user files.
645
                        ignore_glob = self.is_ignored(subp)
646
                        if ignore_glob is not None:
647
                            # mutter("skip ignored sub-file %r", subp)
648
                            ignored.setdefault(ignore_glob, []).append(subp)
649
                        else:
650
                            #mutter("queue to add sub-file %r", subp)
2568.2.5 by Robert Collins
* ``bzrlib.add.FastPath`` is now private and moved to
651
                            dirs_to_add.append((_FastPath(subp, subf), this_ie))
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
652
2585.1.1 by Aaron Bentley
Unify MutableTree.smart_add behavior by disabling quirky memory-only Inventory
653
        if len(added) > 0:
654
            if save:
655
                self._write_inventory(inv)
656
            else:
657
                self.read_working_inventory()
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
658
        return added, ignored
659
2903.2.7 by Martin Pool
Rename update_to_one_parent_via_delta to more wieldy update_basis_by_delta
660
    def update_basis_by_delta(self, new_revid, delta):
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
661
        """Update the parents of this tree after a commit.
662
663
        This gives the tree one parent, with revision id new_revid. The
2903.2.1 by Martin Pool
Commit now tells the working tree about the new basis by passing the an inventory delta from the previous basis
664
        inventory delta is applied to the current basis tree to generate the
2865.1.3 by Robert Collins
Review feedback.
665
        inventory for the parent new_revid, and all other parent trees are
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
666
        discarded.
667
2929.2.1 by Robert Collins
* Commit updates the state of the working tree via a delta rather than
668
        All the changes in the delta should be changes synchronising the basis
669
        tree with some or all of the working tree, with a change to a directory
670
        requiring that its contents have been recursively included. That is,
671
        this is not a general purpose tree modification routine, but a helper
672
        for commit which is not required to handle situations that do not arise
673
        outside of commit.
674
4501.1.1 by Robert Collins
Add documentation describing how and why we use inventory deltas, and what can go wrong with them.
675
        See the inventory developers documentation for the theory behind
676
        inventory deltas.
677
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
678
        :param new_revid: The new revision id for the trees parent.
679
        :param delta: An inventory delta (see apply_inventory_delta) describing
680
            the changes from the current left most parent revision to new_revid.
681
        """
682
        # if the tree is updated by a pull to the branch, as happens in
683
        # WorkingTree2, when there was no separation between branch and tree,
684
        # then just clear merges, efficiency is not a concern for now as this
685
        # is legacy environments only, and they are slow regardless.
686
        if self.last_revision() == new_revid:
687
            self.set_parent_ids([new_revid])
688
            return
689
        # generic implementation based on Inventory manipulation. See
690
        # WorkingTree classes for optimised versions for specific format trees.
691
        basis = self.basis_tree()
692
        basis.lock_read()
4244.2.1 by Vincent Ladeuil
inv._get_mutable_inventory() - prepare for CHKInventory
693
        # TODO: Consider re-evaluating the need for this with CHKInventory
694
        # we don't strictly need to mutate an inventory for this
695
        # it only makes sense when apply_delta is cheaper than get_inventory()
5802.1.1 by Jelmer Vernooij
Move Inventory._get_mutable_inventory -> mutable_inventory_from_tree.
696
        inventory = _mod_inventory.mutable_inventory_from_tree(basis)
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
697
        basis.unlock()
698
        inventory.apply_delta(delta)
5793.2.2 by Jelmer Vernooij
Split inventory-specific code out of RevisionTree into InventoryRevisionTree.
699
        rev_tree = revisiontree.InventoryRevisionTree(self.branch.repository,
4721.3.1 by Vincent Ladeuil
Cleanup imports.
700
                                             inventory, new_revid)
2865.1.1 by Robert Collins
Create new mutable tree method update_to_one_parent_via_delta for eventual use by commit.
701
        self.set_parent_trees([(new_revid, rev_tree)])
702
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
703
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
704
class MutableTreeHooks(hooks.Hooks):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
705
    """A dictionary mapping a hook name to a list of callables for mutabletree
3335.1.4 by Jelmer Vernooij
Fix indentation, add version number.
706
    hooks.
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
707
    """
708
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
709
    def __init__(self):
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
710
        """Create the default hooks.
711
712
        """
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
713
        hooks.Hooks.__init__(self, "bzrlib.mutabletree", "MutableTree.hooks")
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
714
        self.add_hook('start_commit',
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
715
            "Called before a commit is performed on a tree. The start commit "
716
            "hook is able to change the tree before the commit takes place. "
4634.33.2 by Ian Clatworthy
review feedback from jam
717
            "start_commit is called with the bzrlib.mutabletree.MutableTree "
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
718
            "that the commit is being performed on.", (1, 4))
719
        self.add_hook('post_commit',
4634.33.1 by Ian Clatworthy
original finish_commit hook patch
720
            "Called after a commit is performed on a tree. The hook is "
4634.33.3 by Ian Clatworthy
review feedback from Robert: rename finish_commit to post_commit
721
            "called with a bzrlib.mutabletree.PostCommitHookParams object. "
4634.33.2 by Ian Clatworthy
review feedback from jam
722
            "The mutable tree the commit was performed on is available via "
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
723
            "the mutable_tree attribute of that object.", (2, 0))
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
724
725
726
# install the default hooks into the MutableTree class.
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
727
MutableTree.hooks = MutableTreeHooks()
3335.1.2 by Jelmer Vernooij
Add mutabletree hooks class and start_commit hook.
728
729
4634.33.3 by Ian Clatworthy
review feedback from Robert: rename finish_commit to post_commit
730
class PostCommitHookParams(object):
731
    """Parameters for the post_commit hook.
4634.33.2 by Ian Clatworthy
review feedback from jam
732
733
    To access the parameters, use the following attributes:
734
735
    * mutable_tree - the MutableTree object
736
    """
737
738
    def __init__(self, mutable_tree):
4634.33.3 by Ian Clatworthy
review feedback from Robert: rename finish_commit to post_commit
739
        """Create the parameters for the post_commit hook."""
4634.33.2 by Ian Clatworthy
review feedback from jam
740
        self.mutable_tree = mutable_tree
741
742
2568.2.5 by Robert Collins
* ``bzrlib.add.FastPath`` is now private and moved to
743
class _FastPath(object):
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
744
    """A path object with fast accessors for things like basename."""
745
746
    __slots__ = ['raw_path', 'base_path']
747
748
    def __init__(self, path, base_path=None):
749
        """Construct a FastPath from path."""
750
        if base_path is None:
751
            self.base_path = osutils.basename(path)
752
        else:
753
            self.base_path = base_path
754
        self.raw_path = path
755
756
    def __cmp__(self, other):
757
        return cmp(self.raw_path, other.raw_path)
758
759
    def __hash__(self):
760
        return hash(self.raw_path)
761
762
763
def _add_one_and_parent(tree, inv, parent_ie, path, kind, action):
764
    """Add a new entry to the inventory and automatically add unversioned parents.
765
766
    :param inv: Inventory which will receive the new entry.
767
    :param parent_ie: Parent inventory entry if known, or None.  If
768
        None, the parent is looked up by name and used if present, otherwise it
769
        is recursively added.
770
    :param kind: Kind of new entry (file, directory, etc)
771
    :param action: callback(inv, parent_ie, path, kind); return ignored.
772
    :return: A list of paths which have been added.
773
    """
774
    # Nothing to do if path is already versioned.
775
    # This is safe from infinite recursion because the tree root is
776
    # always versioned.
777
    if parent_ie is not None:
778
        # we have a parent ie already
779
        added = []
780
    else:
781
        # slower but does not need parent_ie
3794.5.31 by Mark Hammond
bulk of the simple review comments from igc.
782
        if inv.has_filename(tree._fix_case_of_inventory_path(path.raw_path)):
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
783
            return []
784
        # its really not there : add the parent
785
        # note that the dirname use leads to some extra str copying etc but as
786
        # there are a limited number of dirs we can be nested under, it should
787
        # generally find it very fast and not recurse after that.
2568.2.5 by Robert Collins
* ``bzrlib.add.FastPath`` is now private and moved to
788
        added = _add_one_and_parent(tree, inv, None,
4721.3.1 by Vincent Ladeuil
Cleanup imports.
789
            _FastPath(osutils.dirname(path.raw_path)), 'directory', action)
790
        parent_id = inv.path2id(osutils.dirname(path.raw_path))
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
791
        parent_ie = inv[parent_id]
792
    _add_one(tree, inv, parent_ie, path, kind, action)
793
    return added + [path.raw_path]
794
795
796
def _add_one(tree, inv, parent_ie, path, kind, file_id_callback):
797
    """Add a new entry to the inventory.
798
799
    :param inv: Inventory which will receive the new entry.
800
    :param parent_ie: Parent inventory entry.
801
    :param kind: Kind of new entry (file, directory, etc)
802
    :param file_id_callback: callback(inv, parent_ie, path, kind); return a
803
        file_id or None to generate a new file id
804
    :returns: None
805
    """
4634.159.6 by Martin Pool
* Fix ``AttributeError on parent.children`` when adding a file under a
806
    # if the parent exists, but isn't a directory, we have to do the
807
    # kind change now -- really the inventory shouldn't pretend to know
808
    # the kind of wt files, but it does.
809
    if parent_ie.kind != 'directory':
810
        # nb: this relies on someone else checking that the path we're using
811
        # doesn't contain symlinks.
5802.1.1 by Jelmer Vernooij
Move Inventory._get_mutable_inventory -> mutable_inventory_from_tree.
812
        new_parent_ie = _mod_inventory.make_entry('directory', parent_ie.name,
4634.159.6 by Martin Pool
* Fix ``AttributeError on parent.children`` when adding a file under a
813
            parent_ie.parent_id, parent_ie.file_id)
814
        del inv[parent_ie.file_id]
815
        inv.add(new_parent_ie)
816
        parent_ie = new_parent_ie
2568.2.4 by Robert Collins
* ``bzrlib.add.smart_add`` and ``bzrlib.add.smart_add_tree`` are now
817
    file_id = file_id_callback(inv, parent_ie, path, kind)
818
    entry = inv.make_entry(kind, path.base_path, parent_ie.file_id,
819
        file_id=file_id)
820
    inv.add(entry)