1
# Copyright (C) 2006-2011 Canonical Ltd
1
# Copyright (C) 2006-2010 Canonical Ltd
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
80
79
# used on media which doesn't differentiate the case of names.
81
80
self.case_sensitive = True
83
def is_control_filename(self, filename):
84
"""True if filename is the name of a control file in this tree.
86
:param filename: A filename within the tree. This is a relative path
87
from the root of this tree.
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.
93
raise NotImplementedError(self.is_control_filename)
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.
196
183
# avoid circular imports
197
184
from bzrlib import commit
198
187
possible_master_transports=[]
199
revprops = commit.Commit.update_revprops(
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')
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',
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')
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().
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
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())
431
# expand any symlinks in the directory part, while leaving the
433
# only expanding if symlinks are supported avoids windows path bugs
434
if osutils.has_symlinks():
435
file_list = map(osutils.normalizepath, file_list)
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
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)
570
565
for subf in sorted(os.listdir(abspath)):
571
566
# here we could use TreeDirectory rather than
652
647
"""Create the default hooks.
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))
668
663
# install the default hooks into the MutableTree class.
745
740
file_id or None to generate a new file id
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,