160
160
if sub_tree_id == self.get_root_id():
161
161
raise errors.BadReferenceTarget(self, sub_tree,
162
162
'Trees have the same root id.')
163
if sub_tree_id in self.inventory:
163
if sub_tree_id in self:
164
164
raise errors.BadReferenceTarget(self, sub_tree,
165
165
'Root id already present in tree')
166
166
self._add([sub_tree_path], [sub_tree_id], ['tree-reference'])
381
371
raise NotImplementedError(self.set_parent_trees)
373
def smart_add(self, file_list, recurse=True, action=None, save=True):
374
"""Version file_list, optionally recursing into directories.
376
This is designed more towards DWIM for humans than API clarity.
377
For the specific behaviour see the help for cmd_add().
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
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
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.
393
raise NotImplementedError(self.smart_add)
395
def update_basis_by_delta(self, new_revid, delta):
396
"""Update the parents of this tree after a commit.
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
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
410
See the inventory developers documentation for the theory behind
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.
417
raise NotImplementedError(self.update_basis_by_delta)
420
class MutableInventoryTree(MutableTree,tree.InventoryTree):
422
@needs_tree_write_lock
423
def apply_inventory_delta(self, changes):
424
"""Apply changes to the inventory as an atomic operation.
426
:param changes: An inventory delta to apply to the working tree's
429
:seealso Inventory.apply_delta: For details on the changes parameter.
433
inv.apply_delta(changes)
434
self._write_inventory(inv)
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)
383
442
@needs_tree_write_lock
384
443
def smart_add(self, file_list, recurse=True, action=None, save=True):
385
444
"""Version file_list, optionally recursing into directories.