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