1
# Copyright (C) 2006, 2007 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
183
184
# avoid circular imports
184
185
from bzrlib import commit
187
186
possible_master_transports=[]
188
if not 'branch-nick' in revprops:
189
revprops['branch-nick'] = self.branch._get_nick(
187
revprops = commit.Commit.update_revprops(
190
kwargs.pop('authors', None),
191
kwargs.pop('author', None),
190
192
kwargs.get('local', False),
191
193
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
194
# args for wt.commit start at message from the Commit.commit method,
219
195
args = (message, ) + args
220
196
for hook in MutableTree.hooks['start_commit']:
237
def check_changed_or_out_of_date(self, strict, opt_name,
238
more_error, more_warning):
239
"""Check the tree for uncommitted changes and branch synchronization.
241
If strict is None and not set in the config files, a warning is issued.
242
If strict is True, an error is raised.
243
If strict is False, no checks are done and no warning is issued.
245
:param strict: True, False or None, searched in branch config if None.
247
:param opt_name: strict option name to search in config file.
249
:param more_error: Details about how to avoid the check.
251
:param more_warning: Details about what is happening.
254
strict = self.branch.get_config().get_user_option_as_bool(opt_name)
255
if strict is not False:
257
if (self.has_changes()):
258
err_class = errors.UncommittedChanges
259
elif self.last_revision() != self.branch.last_revision():
260
# The tree has lost sync with its branch, there is little
261
# chance that the user is aware of it but he can still force
262
# the action with --no-strict
263
err_class = errors.OutOfDateTree
264
if err_class is not None:
266
err = err_class(self, more=more_warning)
267
# We don't want to interrupt the user if he expressed no
268
# preference about strict.
269
trace.warning('%s', err._format())
271
err = err_class(self, more=more_error)
261
275
def last_revision(self):
262
276
"""Return the revision id of the last commit performed in this tree.
362
376
This is designed more towards DWIM for humans than API clarity.
363
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
365
383
:param action: A reporter to be called with the inventory, parent_ie,
366
384
path and kind of the path being added. It may return a file_id if
367
385
a specific one should be used.
398
416
for c in self.conflicts():
399
417
conflicts_related.update(c.associated_filenames())
419
# expand any symlinks in the directory part, while leaving the
421
file_list = map(osutils.normalizepath, file_list)
401
423
# validate user file paths and convert all paths to tree
402
424
# relative : it's cheaper to make a tree relative path an abspath
403
425
# than to convert an abspath to tree relative, and it's cheaper to
525
547
this_ie = inv[this_id]
548
# Same as in _add_one below, if the inventory doesn't
549
# think this is a directory, update the inventory
550
if this_ie.kind != 'directory':
551
this_ie = inventory.make_entry('directory',
552
this_ie.name, this_ie.parent_id, this_id)
527
556
for subf in sorted(os.listdir(abspath)):
528
557
# here we could use TreeDirectory rather than
702
731
file_id or None to generate a new file id
734
# if the parent exists, but isn't a directory, we have to do the
735
# kind change now -- really the inventory shouldn't pretend to know
736
# the kind of wt files, but it does.
737
if parent_ie.kind != 'directory':
738
# nb: this relies on someone else checking that the path we're using
739
# doesn't contain symlinks.
740
new_parent_ie = inventory.make_entry('directory', parent_ie.name,
741
parent_ie.parent_id, parent_ie.file_id)
742
del inv[parent_ie.file_id]
743
inv.add(new_parent_ie)
744
parent_ie = new_parent_ie
705
745
file_id = file_id_callback(inv, parent_ie, path, kind)
706
746
entry = inv.make_entry(kind, path.base_path, parent_ie.file_id,