Merge dev tree.
[jelmer/subvertpy.git] / commit.py
index 769357505ded5a534903b0cd7a9defdb504c82d9..d8225ee582054ac02a45f8282d8836ee0ad06b8b 100644 (file)
--- a/commit.py
+++ b/commit.py
@@ -1,4 +1,4 @@
-# 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
@@ -33,7 +33,8 @@ import os
 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.
@@ -85,10 +86,15 @@ class SvnCommitBuilder(RootCommitBuilder):
         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 = []
@@ -291,7 +297,7 @@ class SvnCommitBuilder(RootCommitBuilder):
         
         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
@@ -373,13 +379,23 @@ def push_as_merged(target, source, revision_id):
     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