1
# Copyright (C) 2006, 2007, 2008 Canonical Ltd
1
# Copyright (C) 2006, 2007, 2008, 2009 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
442
442
conflicts.extend(self._overwrite_conflicts())
445
def _check_malformed(self):
446
conflicts = self.find_conflicts()
447
if len(conflicts) != 0:
448
raise MalformedTransform(conflicts=conflicts)
445
450
def _add_tree_children(self):
446
451
"""Add all the children of all active parents to the known paths.
860
865
return _PreviewTree(self)
867
def commit(self, branch, message, merge_parents=None, strict=False):
868
"""Commit the result of this TreeTransform to a branch.
870
:param branch: The branch to commit to.
871
:param message: The message to attach to the commit.
872
:param merge_parents: Additional parents specified by pending merges.
873
:return: The revision_id of the revision committed.
875
self._check_malformed()
877
unversioned = set(self._new_contents).difference(set(self._new_id))
878
for trans_id in unversioned:
879
if self.final_file_id(trans_id) is None:
880
raise errors.StrictCommitFailed()
882
revno, last_rev_id = branch.last_revision_info()
883
if last_rev_id == _mod_revision.NULL_REVISION:
884
if merge_parents is not None:
885
raise ValueError('Cannot supply merge parents for first'
889
parent_ids = [last_rev_id]
890
if merge_parents is not None:
891
parent_ids.extend(merge_parents)
892
if self._tree.get_revision_id() != last_rev_id:
893
raise ValueError('TreeTransform not based on branch basis: %s' %
894
self._tree.get_revision_id())
895
builder = branch.get_commit_builder(parent_ids)
896
preview = self.get_preview_tree()
897
list(builder.record_iter_changes(preview, last_rev_id,
898
self.iter_changes()))
899
builder.finish_inventory()
900
revision_id = builder.commit(message)
901
branch.set_last_revision_info(revno + 1, revision_id)
862
904
def _text_parent(self, trans_id):
863
905
file_id = self.tree_file_id(trans_id)
995
1037
self._new_contents.iteritems()]
996
1038
entries.sort(reverse=True)
997
1039
for path, trans_id, kind in entries:
998
if kind == "directory":
1003
os.rmdir(self._limbodir)
1042
delete_any(self._limbodir)
1004
1043
except OSError:
1005
1044
# We don't especially care *why* the dir is immortal.
1006
1045
raise ImmortalLimbo(self._limbodir)
1008
1047
if self._deletiondir is not None:
1009
os.rmdir(self._deletiondir)
1048
delete_any(self._deletiondir)
1010
1049
except OSError:
1011
1050
raise errors.ImmortalPendingDeletion(self._deletiondir)
1358
1397
yield self.trans_id_tree_path(childpath)
1361
1399
def apply(self, no_conflicts=False, precomputed_delta=None, _mover=None):
1362
1400
"""Apply all changes to the inventory and filesystem.
1373
1411
:param _mover: Supply an alternate FileMover, for testing
1375
1413
if not no_conflicts:
1376
conflicts = self.find_conflicts()
1377
if len(conflicts) != 0:
1378
raise MalformedTransform(conflicts=conflicts)
1414
self._check_malformed()
1379
1415
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1381
1417
if precomputed_delta is None:
1965
2001
return old_annotation
1966
2002
if not changed_content:
1967
2003
return old_annotation
2004
# TODO: This is doing something similar to what WT.annotate_iter is
2005
# doing, however it fails slightly because it doesn't know what
2006
# the *other* revision_id is, so it doesn't know how to give the
2007
# other as the origin for some lines, they all get
2008
# 'default_revision'
2009
# It would be nice to be able to use the new Annotator based
2010
# approach, as well.
1968
2011
return annotate.reannotate([old_annotation],
1969
2012
self.get_file(file_id).readlines(),
1970
2013
default_revision)