[Erp5-report] r42782 rafael - /erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/bt...

nobody at svn.erp5.org nobody at svn.erp5.org
Sun Jan 30 23:08:35 CET 2011


Author: rafael
Date: Sun Jan 30 23:08:35 2011
New Revision: 42782

URL: http://svn.erp5.org?rev=42782&view=rev
Log:
Move tarfile monkey patch to a diferent file.
Add download-command-extra (usefull to set revision to the command.)
Minor fixes.

Added:
    erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/tarfilemonkeypatch.py
Modified:
    erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/__init__.py
    erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/genbt5list.py
    erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/repository.py

Modified: erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/__init__.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/__init__.py?rev=42782&r1=42781&r2=42782&view=diff
==============================================================================
--- erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/__init__.py [utf8] (original)
+++ erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/__init__.py [utf8] Sun Jan 30 23:08:35 2011
@@ -44,8 +44,10 @@ class Recipe(object):
                    os.path.join(
                      buildout['buildout']['parts-directory'],
                      self.name))
-    options.setdefault("command", 
+    options.setdefault("download-command", 
                    "svn co --trust-server-cert --non-interactive --quiet")
+    options.setdefault("download-command-extra",
+                       "")
     options.setdefault("download_folder", 
                    "%s__download__" % options.get('location'))
     options.setdefault("preserve-download", True)
@@ -57,6 +59,8 @@ class Recipe(object):
     url = options.get("url")
     requirements, ws = self.egg.working_set(['erp5.recipe.btrepository'])
     script_name = "%s_update" % self.name
+    download_command = " ".join([options.get("download-command"), 
+                                 options.get("download-command-extra")])
     scripts = zc.buildout.easy_install.scripts(
         [(script_name,'erp5.recipe.btrepository.repository', 'main')],
         ws, options['executable'], "bin",
@@ -68,7 +72,7 @@ class Recipe(object):
                                       url.split(),
                                       options.get('location'),
                                       options.get("download_folder"),
-                                      options.get("command"),
+                                      download_command,
                                       int(options.get("preserve-download")))))
 
   def install(self):

Modified: erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/genbt5list.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/genbt5list.py?rev=42782&r1=42781&r2=42782&view=diff
==============================================================================
--- erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/genbt5list.py [utf8] (original)
+++ erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/genbt5list.py [utf8] Sun Jan 30 23:08:35 2011
@@ -38,6 +38,7 @@ import sys
 import tempfile
 import shutil
 import cgi
+import tarfilemonkeypatch
 
 property_list = '''
 title
@@ -159,124 +160,5 @@ def main():
       os.umask(cur_umask)
     os.chdir(cwd)
 
-# monkey patch tarfile library if python version is 2.4.
-if sys.version_info[0:2] == (2, 4):
-    from tarfile import BLOCKSIZE, GNUTYPE_SPARSE, SUPPORTED_TYPES, TarFile, \
-         TarInfo, calc_chksum, normpath, nts
-
-    def frombuf(cls, buf):
-        """Construct a TarInfo object from a 512 byte string buffer.
-        """
-        tarinfo = cls()
-        tarinfo.name   = nts(buf[0:100])
-        tarinfo.mode   = int(buf[100:108], 8)
-        tarinfo.uid    = int(buf[108:116],8)
-        tarinfo.gid    = int(buf[116:124],8)
-
-        # There are two possible codings for the size field we
-        # have to discriminate, see comment in tobuf() below.
-        if buf[124] != chr(0200):
-            tarinfo.size = long(buf[124:136], 8)
-        else:
-            tarinfo.size = 0L
-            for i in range(11):
-                tarinfo.size <<= 8
-                tarinfo.size += ord(buf[125 + i])
-
-        tarinfo.mtime  = long(buf[136:148], 8)
-        tarinfo.chksum = int(buf[148:156], 8)
-        tarinfo.type   = buf[156:157]
-        tarinfo.linkname = nts(buf[157:257])
-        tarinfo.uname  = nts(buf[265:297])
-        tarinfo.gname  = nts(buf[297:329])
-        try:
-            tarinfo.devmajor = int(buf[329:337], 8)
-            tarinfo.devminor = int(buf[337:345], 8)
-        except ValueError:
-            tarinfo.devmajor = tarinfo.devmajor = 0
-        tarinfo.prefix = buf[345:500]
-
-        # The prefix field is used for filenames > 100 in
-        # the POSIX standard.
-        # name = prefix + '/' + name
-        if tarinfo.type != GNUTYPE_SPARSE:
-            tarinfo.name = normpath(os.path.join(nts(tarinfo.prefix), tarinfo.name))
-
-        # Directory names should have a '/' at the end.
-        if tarinfo.isdir() and tarinfo.name[-1:] != "/":
-            tarinfo.name += "/"
-        return tarinfo
-
-    TarInfo.frombuf = classmethod(frombuf)
-
-    def next(self):
-        """Return the next member of the archive as a TarInfo object, when
-           TarFile is opened for reading. Return None if there is no more
-           available.
-        """
-        self._check("ra")
-        if self.firstmember is not None:
-            m = self.firstmember
-            self.firstmember = None
-            return m
-
-        # Read the next block.
-        self.fileobj.seek(self.offset)
-        while True:
-            buf = self.fileobj.read(BLOCKSIZE)
-            if not buf:
-                return None
-            try:
-                tarinfo = TarInfo.frombuf(buf)
-            except ValueError:
-                if self.ignore_zeros:
-                    if buf.count(NUL) == BLOCKSIZE:
-                        adj = "empty"
-                    else:
-                        adj = "invalid"
-                    self._dbg(2, "0x%X: %s block" % (self.offset, adj))
-                    self.offset += BLOCKSIZE
-                    continue
-                else:
-                    # Block is empty or unreadable.
-                    if self.offset == 0:
-                        # If the first block is invalid. That does not
-                        # look like a tar archive we can handle.
-                        raise ReadError,"empty, unreadable or compressed file"
-                    return None
-            break
-
-        # We shouldn't rely on this checksum, because some tar programs
-        # calculate it differently and it is merely validating the
-        # header block. We could just as well skip this part, which would
-        # have a slight effect on performance...
-        if tarinfo.chksum != calc_chksum(buf):
-            self._dbg(1, "tarfile: Bad Checksum %r" % tarinfo.name)
-
-        # Set the TarInfo object's offset to the current position of the
-        # TarFile and set self.offset to the position where the data blocks
-        # should begin.
-        tarinfo.offset = self.offset
-        self.offset += BLOCKSIZE
-
-        # Check if the TarInfo object has a typeflag for which a callback
-        # method is registered in the TYPE_METH. If so, then call it.
-        if tarinfo.type in self.TYPE_METH:
-            return self.TYPE_METH[tarinfo.type](self, tarinfo)
-
-        tarinfo.offset_data = self.offset
-        if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES:
-            # Skip the following data blocks.
-            self.offset += self._block(tarinfo.size)
-
-        if tarinfo.isreg() and tarinfo.name[:-1] == "/":
-            # some old tar programs don't know DIRTYPE
-            tarinfo.type = DIRTYPE
-
-        self.members.append(tarinfo)
-        return tarinfo
-
-    TarFile.next = next
-
 if __name__ == "__main__":
   main()

Modified: erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/repository.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/repository.py?rev=42782&r1=42781&r2=42782&view=diff
==============================================================================
--- erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/repository.py [utf8] (original)
+++ erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/repository.py [utf8] Sun Jan 30 23:08:35 2011
@@ -34,6 +34,8 @@ except ImportError:
 import os
 import shutil
 import genbt5list
+import tarfile
+import tarfilemonkeypatch
 
 
 def load_options():
@@ -55,6 +57,13 @@ WORKDIR = "/tmp/update_repository_work"
 DOWNLOADDIR = "/tmp/update_repository_download"
 DOWNLOAD_COMMAND = "svn co --trust-server-cert --non-interactive --quiet"
 
+def pack_business_template(destination, source):
+  t = tarfile.open(destination, "w:gz")
+  def exclude_svn(filemane):
+    return ".svn" in filemane
+  t.add(source, exclude=exclude_svn)
+  t.close()
+
 def main(url_list, destination,
          download_dir=DOWNLOADDIR, 
          download_cmd=DOWNLOAD_COMMAND, 
@@ -75,9 +84,9 @@ def main(url_list, destination,
         os.system("%s %s %s" % (download_cmd, url, repos))
         os.chdir(repos)
         for bt in os.listdir("."):
-          if "." in bt:
+          if "." not in bt:
             # We could use tarfile instead.
-            os.system('tar -zcf "%s/%s.bt5" --exclude .svn "%s"' % (WORKDIR,bt,bt))
+            pack_business_template("%s/%s.bt5" % (WORKDIR,bt), bt)
 
     ### # Publish the repository
     for bt in os.listdir(WORKDIR):

Added: erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/tarfilemonkeypatch.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/tarfilemonkeypatch.py?rev=42782&view=auto
==============================================================================
--- erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/tarfilemonkeypatch.py (added)
+++ erp5/trunk/utils/erp5.recipe.btrepository/src/erp5/recipe/btrepository/tarfilemonkeypatch.py [utf8] Sun Jan 30 23:08:35 2011
@@ -0,0 +1,150 @@
+#! /usr/bin/python
+##############################################################################
+#
+# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
+#                    Yoshinori Okuji <yo at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# 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 the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+import sys
+import os
+
+# monkey patch tarfile library if python version is 2.4.
+if sys.version_info[0:2] == (2, 4):
+    from tarfile import BLOCKSIZE, GNUTYPE_SPARSE, SUPPORTED_TYPES, TarFile, \
+         TarInfo, calc_chksum, normpath, nts
+
+    def frombuf(cls, buf):
+        """Construct a TarInfo object from a 512 byte string buffer.
+        """
+        tarinfo = cls()
+        tarinfo.name   = nts(buf[0:100])
+        tarinfo.mode   = int(buf[100:108], 8)
+        tarinfo.uid    = int(buf[108:116],8)
+        tarinfo.gid    = int(buf[116:124],8)
+
+        # There are two possible codings for the size field we
+        # have to discriminate, see comment in tobuf() below.
+        if buf[124] != chr(0200):
+            tarinfo.size = long(buf[124:136], 8)
+        else:
+            tarinfo.size = 0L
+            for i in range(11):
+                tarinfo.size <<= 8
+                tarinfo.size += ord(buf[125 + i])
+
+        tarinfo.mtime  = long(buf[136:148], 8)
+        tarinfo.chksum = int(buf[148:156], 8)
+        tarinfo.type   = buf[156:157]
+        tarinfo.linkname = nts(buf[157:257])
+        tarinfo.uname  = nts(buf[265:297])
+        tarinfo.gname  = nts(buf[297:329])
+        try:
+            tarinfo.devmajor = int(buf[329:337], 8)
+            tarinfo.devminor = int(buf[337:345], 8)
+        except ValueError:
+            tarinfo.devmajor = tarinfo.devmajor = 0
+        tarinfo.prefix = buf[345:500]
+
+        # The prefix field is used for filenames > 100 in
+        # the POSIX standard.
+        # name = prefix + '/' + name
+        if tarinfo.type != GNUTYPE_SPARSE:
+            tarinfo.name = normpath(os.path.join(nts(tarinfo.prefix), tarinfo.name))
+
+        # Directory names should have a '/' at the end.
+        if tarinfo.isdir() and tarinfo.name[-1:] != "/":
+            tarinfo.name += "/"
+        return tarinfo
+
+    TarInfo.frombuf = classmethod(frombuf)
+
+    def next(self):
+        """Return the next member of the archive as a TarInfo object, when
+           TarFile is opened for reading. Return None if there is no more
+           available.
+        """
+        self._check("ra")
+        if self.firstmember is not None:
+            m = self.firstmember
+            self.firstmember = None
+            return m
+
+        # Read the next block.
+        self.fileobj.seek(self.offset)
+        while True:
+            buf = self.fileobj.read(BLOCKSIZE)
+            if not buf:
+                return None
+            try:
+                tarinfo = TarInfo.frombuf(buf)
+            except ValueError:
+                if self.ignore_zeros:
+                    if buf.count(NUL) == BLOCKSIZE:
+                        adj = "empty"
+                    else:
+                        adj = "invalid"
+                    self._dbg(2, "0x%X: %s block" % (self.offset, adj))
+                    self.offset += BLOCKSIZE
+                    continue
+                else:
+                    # Block is empty or unreadable.
+                    if self.offset == 0:
+                        # If the first block is invalid. That does not
+                        # look like a tar archive we can handle.
+                        raise ReadError,"empty, unreadable or compressed file"
+                    return None
+            break
+
+        # We shouldn't rely on this checksum, because some tar programs
+        # calculate it differently and it is merely validating the
+        # header block. We could just as well skip this part, which would
+        # have a slight effect on performance...
+        if tarinfo.chksum != calc_chksum(buf):
+            self._dbg(1, "tarfile: Bad Checksum %r" % tarinfo.name)
+
+        # Set the TarInfo object's offset to the current position of the
+        # TarFile and set self.offset to the position where the data blocks
+        # should begin.
+        tarinfo.offset = self.offset
+        self.offset += BLOCKSIZE
+
+        # Check if the TarInfo object has a typeflag for which a callback
+        # method is registered in the TYPE_METH. If so, then call it.
+        if tarinfo.type in self.TYPE_METH:
+            return self.TYPE_METH[tarinfo.type](self, tarinfo)
+
+        tarinfo.offset_data = self.offset
+        if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES:
+            # Skip the following data blocks.
+            self.offset += self._block(tarinfo.size)
+
+        if tarinfo.isreg() and tarinfo.name[:-1] == "/":
+            # some old tar programs don't know DIRTYPE
+            tarinfo.type = DIRTYPE
+
+        self.members.append(tarinfo)
+        return tarinfo
+
+    TarFile.next = next



More information about the Erp5-report mailing list