[Checkins] SVN: z3c.vcsync/trunk/ Change the export system to write directly to zipfile.
Martijn Faassen
faassen at startifact.com
Tue Jun 2 10:38:09 EDT 2009
Log message for revision 100592:
Change the export system to write directly to zipfile.
Changed:
U z3c.vcsync/trunk/CHANGES.txt
U z3c.vcsync/trunk/src/z3c/vcsync/importexport.py
U z3c.vcsync/trunk/src/z3c/vcsync/interfaces.py
U z3c.vcsync/trunk/src/z3c/vcsync/vc.py
-=-
Modified: z3c.vcsync/trunk/CHANGES.txt
===================================================================
--- z3c.vcsync/trunk/CHANGES.txt 2009-06-02 14:36:52 UTC (rev 100591)
+++ z3c.vcsync/trunk/CHANGES.txt 2009-06-02 14:38:08 UTC (rev 100592)
@@ -4,7 +4,10 @@
0.16 (unreleased)
-----------------
-* ...
+* Change the method by which zip files are created for export to a
+ less filesystem-intensive method; files are directly added to the
+ zip file. This hopefully brings performance benefits on platforms
+ where accessing many small files is slow.
0.15 (2008-08-19)
-----------------
Modified: z3c.vcsync/trunk/src/z3c/vcsync/importexport.py
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/importexport.py 2009-06-02 14:36:52 UTC (rev 100591)
+++ z3c.vcsync/trunk/src/z3c/vcsync/importexport.py 2009-06-02 14:38:08 UTC (rev 100592)
@@ -12,25 +12,26 @@
export(obj, path.join(obj.__name__))
def export_zip(root, name, zippath):
- tmp_dir = py.path.local(tempfile.mkdtemp())
- try:
- save_path = tmp_dir.join(name)
- save_path.ensure(dir=True)
- export(root, save_path)
- zf = zipfile.ZipFile(zippath.strpath, 'w')
- _export_zip_helper(zf, tmp_dir, save_path)
- zf.close()
- finally:
- tmp_dir.remove()
+ zf = zipfile.ZipFile(zippath.strpath, 'w')
+ zf.writestr('data/', '')
+ _export_zip_helper(root, zf, 'data')
+ zf.close()
-def _export_zip_helper(zf, save_path, path):
- if path.check(dir=True):
- zf.writestr(path.relto(save_path) + '/', '')
- for p in path.listdir():
- _export_zip_helper(zf, save_path, p)
- else:
- zf.write(path.strpath, path.relto(save_path))
-
+def _export_zip_helper(root, zf, save_path):
+ for obj in root.values():
+ name, bytes = IDump(obj).save_bytes()
+ if save_path:
+ sub_path = save_path + '/' + name
+ else:
+ sub_path = name
+ sub_path = sub_path.encode('cp437')
+ if IContainer.providedBy(obj):
+ # create a directory
+ zf.writestr(sub_path + '/', '')
+ _export_zip_helper(obj, zf, sub_path)
+ else:
+ zf.writestr(sub_path, bytes)
+
def import_(root, path, modified_function=None):
modified_objects = _import_helper(root, path)
if modified_function is not None:
Modified: z3c.vcsync/trunk/src/z3c/vcsync/interfaces.py
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/interfaces.py 2009-06-02 14:36:52 UTC (rev 100591)
+++ z3c.vcsync/trunk/src/z3c/vcsync/interfaces.py 2009-06-02 14:38:08 UTC (rev 100592)
@@ -229,3 +229,11 @@
Returns the path just created.
"""
+
+ def save_bytes(checkout):
+ """Save context object to bytes.
+
+ Returns the name of the file to be created as well as the bytes to
+ write.
+ """
+
Modified: z3c.vcsync/trunk/src/z3c/vcsync/vc.py
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/vc.py 2009-06-02 14:36:52 UTC (rev 100591)
+++ z3c.vcsync/trunk/src/z3c/vcsync/vc.py 2009-06-02 14:38:08 UTC (rev 100592)
@@ -1,5 +1,6 @@
import os
import py
+from StringIO import StringIO
from datetime import datetime
from zope.interface import Interface
@@ -29,7 +30,16 @@
serializer.serialize(f)
f.close()
return path
-
+
+ def save_bytes(self):
+ serializer = ISerializer(self.context)
+ name = serializer.name()
+ f = StringIO()
+ serializer.serialize(f)
+ bytes = f.getvalue()
+ f.close()
+ return name, bytes
+
class ContainerDump(grok.Adapter):
grok.provides(IDump)
grok.context(IContainer)
@@ -38,6 +48,9 @@
path = path.join(self.context.__name__)
path.ensure(dir=True)
+ def save_bytes(self):
+ return self.context.__name__, ''
+
def resolve(root, root_path, path):
"""Resolve checkout path to obj in state.
More information about the Checkins
mailing list