Rev 432: Don't do extra checkout before push. This changes the complexity of push to Subversion from O(tree size+commit size) to O(commit size). in file:///home/jelmer/bzr-svn/0.3/

Jelmer Vernooij jelmer at samba.org
Mon Mar 19 16:14:40 GMT 2007


At file:///home/jelmer/bzr-svn/0.3/

------------------------------------------------------------
revno: 432
revision-id: jelmer at samba.org-20070315160951-gv05hnso079m6gu1
parent: jelmer at samba.org-20070313100558-tfdjo5ar8fzhuoy9
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.3
timestamp: Thu 2007-03-15 17:09:51 +0100
message:
  Don't do extra checkout before push. This changes the complexity of push to Subversion from O(tree size+commit size) to O(commit size). 
  Pushing to Samba is now only a few seconds!
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  tree.py                        tree.py-20060624222557-dudlwqcmkf22lt2s-1
=== modified file 'NEWS'
--- a/NEWS	2007-03-13 10:05:58 +0000
+++ b/NEWS	2007-03-15 16:09:51 +0000
@@ -1,3 +1,9 @@
+bzr-svn 0.3.3	UNRELEASED
+
+  IMPROVEMENTS
+
+  * Don't do extra checkout before push if possible. (#91885)
+
 bzr-svn 0.3.2	2007-03-13
 
   BUG FIXES

=== modified file 'commit.py'
--- a/commit.py	2007-03-13 09:40:12 +0000
+++ b/commit.py	2007-03-15 16:09:51 +0000
@@ -33,7 +33,8 @@
 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,11 +86,15 @@
         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)
+        if old_inv is None:
+            if self.branch.last_revision() is None:
+                self.old_inv = Inventory(ROOT_ID)
+            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 = []
@@ -374,13 +379,23 @@
     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()
+
+    mutter('committing %r on top of %r' % (revision_id, prev_revid))
 
     old_tree = source.repository.revision_tree(revision_id)
-    new_tree = target.repository.revision_tree(target.last_revision())
+    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 = target.get_commit_builder([revision_id, target.last_revision()])
+    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
 

=== modified file 'tree.py'
--- a/tree.py	2007-03-12 23:11:30 +0000
+++ b/tree.py	2007-03-15 16:09:51 +0000
@@ -87,7 +87,11 @@
         self.revnum = revnum
 
     def open_root(self, revnum, baton):
-        return ROOT_ID
+        file_id, revision_id = self.tree.id_map[""]
+        ie = self.tree._inventory.add_path("", 'directory', file_id)
+        ie.revision = revision_id
+        self.tree._inventory.revision_id = revision_id
+        return file_id
 
     def add_directory(self, path, parent_baton, copyfrom_path, copyfrom_revnum, pool):
         path = path.decode("utf-8")
@@ -200,8 +204,7 @@
     """Optimized version of SvnRevisionTree."""
     def __init__(self, workingtree):
         self.workingtree = workingtree
-        self._revision_id = workingtree.branch.repository.generate_revision_id(
-                workingtree.base_revnum, workingtree.branch.branch_path)
+        self._revision_id = workingtree.branch.generate_revision_id(workingtree.base_revnum)
         self.id_map = workingtree.branch.repository.get_fileid_map(
                 workingtree.base_revnum, workingtree.branch.branch_path)
         self._inventory = Inventory()




More information about the bazaar-commits mailing list