Skip to content
This repository has been archived by the owner on May 13, 2020. It is now read-only.

Commit

Permalink
seems to work, gotta test it live
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam Groszer committed Jun 9, 2010
1 parent 23b9db9 commit 54c8af0
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 37 deletions.
111 changes: 109 additions & 2 deletions src/zope/wineggbuilder/README.txt
@@ -1,3 +1,5 @@
Building windows binary eggs
----------------------------

Install mocks:

Expand All @@ -17,15 +19,120 @@ Install mocks:
>>> oldURLgetter = build.Package.urlGetterKlass
>>> build.Package.urlGetterKlass = testing.MockURLGetter()

Let's see:

>>> import os.path
>>> testininame = os.path.join(os.path.dirname(build.__file__), 'test.ini')
>>> build.main([testininame, '-v'])
>>> build.main([testininame, '-v']) # doctest: +REPORT_NDIFF
INFO - loading configuration from /home/adi/zopefix/zope.wineggbuilder/trunk/src/zope/wineggbuilder/test.ini
INFO - Starting to build
DEBUG - getting http://pypi.python.org/simple/zope.proxy/
DEBUG - Got a file: zope.proxy-3.4.0-py2.4-win32.egg
DEBUG - Got a file: zope.proxy-3.4.0.tar.gz
DEBUG - Got a file: zope.proxy-3.4.2.zip
DEBUG - Got a file: zope.proxy-3.4.2-py2.6-win32.egg
DEBUG - Got a file: zope.proxy-3.4.1-py2.4-win32.egg
DEBUG - Got a file: zope.proxy-3.4.1.zip
DEBUG - Got a file: zope.proxy-3.4.2-py2.5-win32.egg
DEBUG - Got a file: zope.proxy-3.4.2-py2.4-win32.egg
DEBUG - Got a file: zope.proxy-3.4.0-py2.5-win32.egg
DEBUG - Got a file: zope.proxy-3.4.0.zip
DEBUG - Checking if build required for zope.proxy 3.4.0 py25_32
DEBUG - Build not required for zope.proxy 3.4.0 py25_32
DEBUG - Checking if build required for zope.proxy 3.4.0 py26_32
DEBUG - Build required for zope.proxy 3.4.0 py26_32
DEBUG - Command: svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.0 /tmp/tmp...wineggbuilder
DEBUG - Output:
A /tmp/tmpgqt2dHwineggbuilder/bootstrap.py
A /tmp/tmpgqt2dHwineggbuilder/buildout.cfg
A /tmp/tmpgqt2dHwineggbuilder/CHANGES.txt
A /tmp/tmpgqt2dHwineggbuilder/setup.py
A /tmp/tmpgqt2dHwineggbuilder/src
A /tmp/tmpgqt2dHwineggbuilder/src/zope
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/_zope_proxy_proxy.c
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/tests
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/tests/__init__.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/tests/test_proxy.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/tests/test_decorator.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/__init__.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/proxy.h
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/decorator.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/proxy/interfaces.py
A /tmp/tmpgqt2dHwineggbuilder/src/zope/__init__.py
A /tmp/tmpgqt2dHwineggbuilder/README.txt
U /tmp/tmpgqt2dHwineggbuilder
Checked out revision 113298.
INFO - Starting build for zope.proxy 3.4.0 py26_32
DEBUG - Running: call c:\program files\msvc\msvcvars.bat
c:\Python26\python setup.py build_ext --compiler msvc bdist_egg upload
In: /tmp/tmp...wineggbuilder
DEBUG - Command: /tmp/tmp...bat
DEBUG - Output:
<BLANKLINE>
<BLANKLINE>
DEBUG - Checking if build required for zope.proxy 3.4.1 py25_32
DEBUG - Build required for zope.proxy 3.4.1 py25_32
DEBUG - Checking if build required for zope.proxy 3.4.1 py26_32
DEBUG - Build required for zope.proxy 3.4.1 py26_32
DEBUG - Command: svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.1 /tmp/tmp...wineggbuilder
DEBUG - Output:
A /tmp/tmpKNdQxlwineggbuilder/bootstrap.py
A /tmp/tmpKNdQxlwineggbuilder/buildout.cfg
A /tmp/tmpKNdQxlwineggbuilder/CHANGES.txt
A /tmp/tmpKNdQxlwineggbuilder/test.py
A /tmp/tmpKNdQxlwineggbuilder/setup.py
A /tmp/tmpKNdQxlwineggbuilder/src
A /tmp/tmpKNdQxlwineggbuilder/src/zope
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/_zope_proxy_proxy.c
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/tests
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/tests/__init__.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/tests/test_proxy.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/tests/test_decorator.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/DEPENDENCIES.cfg
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/__init__.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/proxy.h
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/decorator.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/interfaces.py
A /tmp/tmpKNdQxlwineggbuilder/src/zope/proxy/SETUP.cfg
A /tmp/tmpKNdQxlwineggbuilder/src/zope/__init__.py
A /tmp/tmpKNdQxlwineggbuilder/README.txt
U /tmp/tmpKNdQxlwineggbuilder
Checked out revision 113298.
INFO - Starting build for zope.proxy 3.4.1 py25_32
DEBUG - Running: set PATH=%PATH%;c:\mingw32\bin
c:\Python25\python setup.py build_ext --compiler mingw32 bdist_egg upload
In: /tmp/tmp...wineggbuilder
DEBUG - Command: /tmp/tmp...bat
DEBUG - Output:
<BLANKLINE>
<BLANKLINE>
INFO - Starting build for zope.proxy 3.4.1 py26_32
DEBUG - Running: call c:\program files\msvc\msvcvars.bat
c:\Python26\python setup.py build_ext --compiler msvc bdist_egg upload
In: /tmp/tmp...wineggbuilder
DEBUG - Command: /tmp/tmp...bat
DEBUG - Output:
<BLANKLINE>
<BLANKLINE>
DEBUG - Checking if build required for zope.proxy 3.4.2 py25_32
DEBUG - Build not required for zope.proxy 3.4.2 py25_32
DEBUG - Checking if build required for zope.proxy 3.4.2 py26_32
DEBUG - Build not required for zope.proxy 3.4.2 py26_32
INFO - Done.

Let's see what was executed on mocks:

>>> from pprint import pprint
>>> pprint(testing.MOCKLOG)

['package_releases: zope.proxy',
'urlget: http://pypi.python.org/simple/zope.proxy/',
'cmd: svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.0 /tmp/tmp...wineggbuilder in None',
'cmd: /tmp/tmp...bat in /tmp/tmp...wineggbuilder',
'cmd: svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.1 /tmp/tmp...wineggbuilder in None',
'cmd: /tmp/tmp...bat in /tmp/tmp...wineggbuilder',
'cmd: /tmp/tmp...bat in /tmp/tmp...wineggbuilder']

Remove mocks:

Expand Down
85 changes: 61 additions & 24 deletions src/zope/wineggbuilder/build.py
Expand Up @@ -47,32 +47,48 @@ def read(self, config):

def checkBuild(self, package, version, files):
"""check whether build is required"""
LOGGER.debug('Checking if build required for %s %s %s',
package.name, version, self.name)
needBuild = True
fe = self.fileEnding.lower()
for file in files:
if file.lower().endswith(fe):
needBuild = False
break

if needBuild:
LOGGER.debug('Build required for %s %s %s',
package.name, version, self.name)
else:
LOGGER.debug('Build not required for %s %s %s',
package.name, version, self.name)
return needBuild

def build(self, package, version, files, sourceFolder):
if self.checkBuild(package, version, files):
#we really need to build
#we have the source in sourceFolder
cmd = self.commandKlass(cwd=sourceFolder, exitOnError=False)

if len(self.command.splitlines()) > 1:
#in case there are more lines we got to do .bat file
tmpfile = tempfile.NamedTemporaryFile(suffix='.bat')
command = tmpfile.name
tmpfile.write(self.command)
tmpfile.file.flush()
else:
command = self.command

cmd.do(command)

pass
LOGGER.info('Starting build for %s %s %s',
package.name, version, self.name)
#we really need to build
#we have the source in sourceFolder
cmd = self.commandKlass(cwd=sourceFolder, exitOnError=False)

if len(self.command.splitlines()) > 1:
#in case there are more lines we got to do .bat file
tmpfile = tempfile.NamedTemporaryFile(suffix='.bat')
command = tmpfile.name
tmpfile.write(self.command)
tmpfile.file.flush()
else:
command = self.command

LOGGER.debug('Running: %s\nIn: %s', self.command, sourceFolder)

#this ought to build and upload the egg
output = cmd.do(command)

def versionToTuple(version):
parts = version.split('.')
parts = [int(v) for v in parts]
return tuple(parts)

class Package(object):
#hook to enable testing
Expand Down Expand Up @@ -102,9 +118,25 @@ def build(self):
versions = pypi.package_releases(self.name, show_hidden=True)

#1.1 filter versions according to minVersion and maxVersion:

if self.minVersion:
minver = versionToTuple(self.minVersion)
versions = [v for v in versions
if versionToTuple(v) >= minver]

if self.maxVersion:
maxver = versionToTuple(self.maxVersion)
versions = [v for v in versions
if versionToTuple(v) <= maxver]

versions.sort()
if len(versions) == 0:
#nothing to do
LOGGER.info('%s no versions, nothing to do', self.name)
return

#2 get file list of each version
LOGGER.debug('getting %s', self.pypiurl)

verFiles = defaultdict(list)
simple = self.urlGetterKlass().get(self.pypiurl)
soup = BeautifulSoup.BeautifulSoup(simple)
Expand All @@ -117,37 +149,38 @@ def build(self):
version = m.group(1)
if version not in versions:
continue
LOGGER.debug('Got a file: %s', cntnt)
verFiles[version].append(cntnt)

svn = self.svnKlass()
for version in versions:
#3 check whether we need a build
needBuild = False
needs = []
for target in self.targets:
needBuild = target.checkBuild(
self, version, verFiles.get(version, []))
if needBuild:
break
needs.append(target)

if needBuild:
if needs:
tmpfolder = tempfile.mkdtemp('wineggbuilder')
try:
#3.1 svn co tag
svnurl = "%s/%s" % (self.tagurl, version)
svn.co(svnurl, tmpfolder)

#3.2 build missing
for target in self.targets:
for target in needs:
needBuild = target.build(
self, version, verFiles.get(version, []), tmpfolder)
finally:
#3.3 del temp folder
base.rmtree(tmpfolder)



class Builder(object):
def __init__(self, configFileName, options):
LOGGER.info('loading configuration from %s', configFileName)

config = ConfigParser.RawConfigParser()
config.read(configFileName)

Expand All @@ -160,9 +193,13 @@ def __init__(self, configFileName, options):
self.packages.append(Package(pkg, config, options, self.compilers))

def runCLI(self):
LOGGER.info('Starting to build')

for pkg in self.packages:
pkg.build()

LOGGER.info('Done.')


def main(args=None):
# Make sure we get the arguments.
Expand Down
6 changes: 3 additions & 3 deletions src/zope/wineggbuilder/test.ini
Expand Up @@ -26,6 +26,6 @@ fileEnding = py2.6-win-amd64.egg
[zope.proxy]
pypiurl = http://pypi.python.org/simple/zope.proxy/
tagurl = svn://svn.zope.org/repos/main/zope.proxy/tags/
minVersion =
maxVersion =
targets = py25_32 py26_32
minVersion = 3.4
maxVersion = 3.5
targets = py25_32 py26_32
25 changes: 17 additions & 8 deletions src/zope/wineggbuilder/testing.py
Expand Up @@ -8,11 +8,15 @@
import doctest
import pprint

from zope.wineggbuilder import base

LOGGER = base.LOGGER

MOCKLOG = []

#format is [(expected cmd, result)]
CommandIO = [
#svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.6.0 /tmp/tmpgqt2dHwineggbuilder
#svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.0 /tmp/tmpgqt2dHwineggbuilder
"""A /tmp/tmpgqt2dHwineggbuilder/bootstrap.py
A /tmp/tmpgqt2dHwineggbuilder/buildout.cfg
A /tmp/tmpgqt2dHwineggbuilder/CHANGES.txt
Expand All @@ -33,6 +37,9 @@
A /tmp/tmpgqt2dHwineggbuilder/README.txt
U /tmp/tmpgqt2dHwineggbuilder
Checked out revision 113298.""",
#cmd: /tmp/tmp9pHarC.bat in /tmp/tmpWIuwvGwineggbuilder
"""
""",
#svn co --non-interactive svn://svn.zope.org/repos/main/zope.proxy/tags/3.4.1 /tmp/tmpKNdQxlwineggbuilder
"""A /tmp/tmpKNdQxlwineggbuilder/bootstrap.py
A /tmp/tmpKNdQxlwineggbuilder/buildout.cfg
Expand All @@ -57,12 +64,11 @@
A /tmp/tmpKNdQxlwineggbuilder/README.txt
U /tmp/tmpKNdQxlwineggbuilder
Checked out revision 113298.""",
'svn co',
'svn co',
'bat',
'bat',
'bat',
'bat',
#cmd: /tmp/tmpXhyppL.bat in /tmp/tmpIK6VMJwineggbuilder
"""
""",
"""
""",
]

class MockCommand(object):
Expand All @@ -79,12 +85,16 @@ def do(self, cmd):
global MOCKLOG
MOCKLOG.append('cmd: %s in %s' % (cmd, self.cwd))

LOGGER.debug('Command: ' + cmd)

global CommandIO
next = CommandIO.pop(0)

if isinstance(next, Exception):
raise next

LOGGER.debug('Output: \n%s' % next)

return next

PYPI_RELEASES = {
Expand Down Expand Up @@ -142,7 +152,6 @@ def package_releases(self, package_name, show_hidden=False):
<a href="../../packages/2.6/z/zope.proxy/zope.proxy-3.6.0-py2.6-win32.egg#md5=6984986850f74abdb3cd0c738579cb16">zope.proxy-3.6.0-py2.6-win32.egg</a><br/>
<a href="../../packages/source/z/zope.proxy/zope.proxy-3.4.0.zip#md5=3fef9f29c8b920c9f20aa3a2f92afa70">zope.proxy-3.4.0.zip</a><br/>
<a href="../../packages/2.4/z/zope.proxy/zope.proxy-3.3.0-py2.4-win32.egg#md5=554d10d694d7e5ea9468d88c1c078387">zope.proxy-3.3.0-py2.4-win32.egg</a><br/>
<a href="../../packages/2.5/z/zope.proxy/zope.proxy-3.4.1-py2.5-win32.egg#md5=82c2d44d956ceaa1c838bf23be18fe95">zope.proxy-3.4.1-py2.5-win32.egg</a><br/>
<a href="http://svn.zope.org/zope.proxy" rel="homepage">3.3.0 home_page</a><br/>
<a href="http://docs.python.org/ref/sequence-methods.html">http://docs.python.org/ref/sequence-methods.html</a><br/>
</body></html>""",
Expand Down

0 comments on commit 54c8af0

Please sign in to comment.