1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2006-2011 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
79
80
# used on media which doesn't differentiate the case of names.
80
81
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)
82
95
@needs_tree_write_lock
83
96
def add(self, files, ids=None, kinds=None):
84
97
"""Add paths to the set of versioned paths.
183
196
# avoid circular imports
184
197
from bzrlib import commit
187
198
possible_master_transports=[]
188
if not 'branch-nick' in revprops:
189
revprops['branch-nick'] = self.branch._get_nick(
199
revprops = commit.Commit.update_revprops(
202
kwargs.pop('authors', None),
203
kwargs.pop('author', None),
190
204
kwargs.get('local', False),
191
205
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
218
206
# args for wt.commit start at message from the Commit.commit method,
219
207
args = (message, ) + args
220
208
for hook in MutableTree.hooks['start_commit']:
400
388
This is designed more towards DWIM for humans than API clarity.
401
389
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
403
395
:param action: A reporter to be called with the inventory, parent_ie,
404
396
path and kind of the path being added. It may return a file_id if
405
397
a specific one should be used.
436
428
for c in self.conflicts():
437
429
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)
439
437
# validate user file paths and convert all paths to tree
440
438
# relative : it's cheaper to make a tree relative path an abspath
441
439
# than to convert an abspath to tree relative, and it's cheaper to
563
561
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)
565
570
for subf in sorted(os.listdir(abspath)):
566
571
# here we could use TreeDirectory rather than
740
745
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
743
759
file_id = file_id_callback(inv, parent_ie, path, kind)
744
760
entry = inv.make_entry(kind, path.base_path, parent_ie.file_id,