[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