-# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+# Copyright (C) 2006-2007 Jelmer Vernooij <jelmer@samba.org>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
class SvnCommitBuilder(RootCommitBuilder):
"""Commit Builder implementation wrapped around svn_delta_editor. """
- def __init__(self, repository, branch, parents, config, revprops):
+ def __init__(self, repository, branch, parents, config, revprops,
+ old_inv=None):
"""Instantiate a new SvnCommitBuilder.
:param repository: SvnRepository to commit to.
assert (self.branch.last_revision() is None or
self.branch.last_revision() in parents)
- if self.branch.last_revision() is None:
- self.old_inv = Inventory(root_id=None)
+ if old_inv is None:
+ if self.branch.last_revision() is None:
+ self.old_inv = Inventory(root_id=None)
+ else:
+ self.old_inv = self.repository.get_inventory(
+ self.branch.last_revision())
else:
- self.old_inv = self.repository.get_inventory(self.branch.last_revision())
+ self.old_inv = old_inv
+ assert self.old_inv.revision_id == self.branch.last_revision()
self.modified_files = {}
self.modified_dirs = []
mutter('obtaining commit editor')
self.editor, editor_baton = self.repository.transport.get_commit_editor(
- message, done, None, False)
+ message.encode("utf-8"), done, None, False)
if self.branch.last_revision() is None:
self.base_revnum = 0
rev = source.repository.get_revision(revision_id)
inv = source.repository.get_inventory(revision_id)
- mutter('committing %r on top of %r' % (revision_id,
- target.last_revision()))
+ # revision on top of which to commit
+ prev_revid = target.last_revision()
- old_tree = source.repository.revision_tree(revision_id)
- new_tree = target.repository.revision_tree(target.last_revision())
+ mutter('committing %r on top of %r' % (revision_id, prev_revid))
- builder = target.get_commit_builder([revision_id, target.last_revision()])
+ old_tree = source.repository.revision_tree(revision_id)
+ if source.repository.has_revision(prev_revid):
+ new_tree = source.repository.revision_tree(prev_revid)
+ else:
+ new_tree = target.repository.revision_tree(prev_revid)
+
+ builder = SvnCommitBuilder(target.repository, target,
+ [revision_id, prev_revid],
+ target.get_config(),
+ rev.properties,
+ new_tree.inventory)
+
delta = new_tree.changes_from(old_tree)
builder.new_inventory = inv