[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