[Checkins] SVN: keas.build/trunk/ - Improvement: added ``buildout-upload-type`` option.
Adam Groszer
agroszer at gmail.com
Tue Oct 6 11:37:10 EDT 2009
Log message for revision 104837:
- Improvement: added ``buildout-upload-type`` option.
- Bug Fix: multiline template option values crashed on parsing
Changed:
U keas.build/trunk/CHANGES.txt
U keas.build/trunk/src/keas/build/build.py
U keas.build/trunk/src/keas/build/index.txt
-=-
Modified: keas.build/trunk/CHANGES.txt
===================================================================
--- keas.build/trunk/CHANGES.txt 2009-10-06 11:51:21 UTC (rev 104836)
+++ keas.build/trunk/CHANGES.txt 2009-10-06 15:37:10 UTC (rev 104837)
@@ -7,6 +7,11 @@
- Improvement: removed dependency on lxml. Now we just use pythons
built-in xml library.
+- Improvement: added ``buildout-upload-type`` option.
+ See doc for further info
+
+- Bug Fix: multiline template option values crashed on parsing
+
0.1.4 (2009-10-01)
------------------
@@ -38,7 +43,7 @@
0.1.1 (internal)
----------------
-- Bug Fix: If a proejct variant is specified for which no release have
+- Bug Fix: If a project variant is specified for which no release have
been made, the build script now exits nicely with a human readable
error message.
Modified: keas.build/trunk/src/keas/build/build.py
===================================================================
--- keas.build/trunk/src/keas/build/build.py 2009-10-06 11:51:21 UTC (rev 104836)
+++ keas.build/trunk/src/keas/build/build.py 2009-10-06 15:37:10 UTC (rev 104837)
@@ -24,33 +24,53 @@
import pkg_resources
import re
import sys
+import shutil
+import os
import urllib2
from keas.build import base, package
logger = base.logger
-def findProjectVersions(project, config, options):
+def findProjectVersions(project, config, options, uploadType):
if options.offline:
logger.info('Offline: Skip looking for project versions.')
return []
- url = config.get(base.BUILD_SECTION, 'buildout-server') + project + '/'
- logger.debug('Package Index: ' + url)
- req = urllib2.Request(url)
- username = config.get(base.BUILD_SECTION, 'buildout-server-username')
- password = config.get(base.BUILD_SECTION, 'buildout-server-password')
- base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
- req.add_header("Authorization", "Basic %s" % base64string)
+ VERSION = re.compile(project+r'-(\d+\.\d+(\.\d+){0,2})')
- try:
- soup = BeautifulSoup.BeautifulSoup(urllib2.urlopen(req).read())
- except urllib2.HTTPError, err:
- logger.error("There was an error accessing %s: %s" % (url, err))
- return []
- versions = [tag.contents[0][len(project)+1:-4]
- for tag in soup('a')
- if re.match(project+'-[0-9]', tag.contents[0])]
+ if uploadType == 'local':
+ dest = os.path.join(config.get(base.BUILD_SECTION, 'buildout-server'),
+ project)
+ versions = []
+ for root, dirs, files in os.walk(dest):
+ for fname in files:
+ m = VERSION.search(fname)
+ if m:
+ versions.append(m.group(1))
+ else:
+ url = config.get(base.BUILD_SECTION, 'buildout-server') + project + '/'
+ logger.debug('Package Index: ' + url)
+ req = urllib2.Request(url)
+
+ username = config.get(base.BUILD_SECTION, 'buildout-server-username')
+ password = config.get(base.BUILD_SECTION, 'buildout-server-password')
+ base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
+ req.add_header("Authorization", "Basic %s" % base64string)
+
+ try:
+ soup = BeautifulSoup.BeautifulSoup(urllib2.urlopen(req).read())
+ except urllib2.HTTPError, err:
+ logger.error("There was an error accessing %s: %s" % (url, err))
+ return []
+
+ versions = []
+ for tag in soup('a'):
+ cntnt = tag.contents[0]
+ m = VERSION.search(cntnt)
+ if m:
+ versions.append(m.group(1))
+
return sorted(versions, key=lambda x: pkg_resources.parse_version(x))
@@ -81,6 +101,11 @@
pkgversions[pkg] = version
projectParser.set('versions', pkg, version)
+ try:
+ uploadType = config.get(base.BUILD_SECTION, 'buildout-upload-type')
+ except ConfigParser.NoOptionError:
+ uploadType = "webdav"
+
# Stop if no buildout-server given
try:
config.get(base.BUILD_SECTION, 'buildout-server')
@@ -94,7 +119,8 @@
# Write the new configuration file to disk
projectName = config.get(base.BUILD_SECTION, 'name')
defaultVersion = configVersion = config.get(base.BUILD_SECTION, 'version')
- projectVersions = findProjectVersions(projectName, config, options)
+ projectVersions = findProjectVersions(projectName, config,
+ options, uploadType)
if projectVersions:
defaultVersion = projectVersions[-1]
if options.nextVersion or configVersion == '+':
@@ -106,17 +132,8 @@
logger.info('Writing project configuration file: ' + projectConfigFilename)
projectParser.write(open(projectConfigFilename, 'w'))
- # Upload the release file
- if not options.offline and not options.noUpload:
- base.uploadFile(
- projectConfigFilename,
- config.get(base.BUILD_SECTION, 'buildout-server')+'/'+projectName,
- config.get(base.BUILD_SECTION, 'buildout-server-username'),
- config.get(base.BUILD_SECTION, 'buildout-server-password'),
- options.offline)
+ filesToUpload = [projectConfigFilename]
- filesToUpload = []
-
# Create deployment configurations
for section in config.sections():
if section == base.BUILD_SECTION:
@@ -131,6 +148,14 @@
vars['project-name'] = projectName
vars['project-version'] = projectVersion
vars['instance-name'] = section
+
+ #handle multi-line items, ConfigParser removes leading spaces
+ #we need to add some back otherwise it will be a parsing error
+ for k, v in vars.items():
+ if '\n' in v:
+ #add a 2 space indent
+ vars[k] = v.replace('\n', '\n ')
+
try:
deployConfigText = template % vars
except KeyError, e:
@@ -148,15 +173,26 @@
filesToUpload.append(deployConfigFilename)
# Upload the deployment files
- if not options.offline and not options.noUpload:
+ if uploadType == 'local':
+ #no upload, just copy to destination
+ dest = os.path.join(config.get(base.BUILD_SECTION, 'buildout-server'),
+ projectName)
+ if not os.path.exists(dest):
+ os.makedirs(dest)
for filename in filesToUpload:
- base.uploadFile(
- filename,
- config.get(
- base.BUILD_SECTION, 'buildout-server')+'/'+projectName,
- config.get(base.BUILD_SECTION, 'buildout-server-username'),
- config.get(base.BUILD_SECTION, 'buildout-server-password'),
- options.offline)
+ shutil.copyfile(filename, os.path.join(dest, filename))
+ elif uploadType == 'webdav':
+ if not options.offline and not options.noUpload:
+ for filename in filesToUpload:
+ base.uploadFile(
+ filename,
+ config.get(
+ base.BUILD_SECTION, 'buildout-server')+'/'+projectName,
+ config.get(base.BUILD_SECTION, 'buildout-server-username'),
+ config.get(base.BUILD_SECTION, 'buildout-server-password'),
+ options.offline)
+ elif uploadType == 'mypypi':
+ pass
def main(args=None):
Modified: keas.build/trunk/src/keas/build/index.txt
===================================================================
--- keas.build/trunk/src/keas/build/index.txt 2009-10-06 11:51:21 UTC (rev 104836)
+++ keas.build/trunk/src/keas/build/index.txt 2009-10-06 15:37:10 UTC (rev 104837)
@@ -203,8 +203,23 @@
- **package-index-password** - The password for accessing the WebDAV
server
+- **buildout-upload-type** - Choose from ``webdav``, ``local`` or ``mypypi``
+
+ - **webdav** Upload generated buildout files to the url specified by
+ ``buildout-server`` with the WebDAV protocol.
+
+ - **local** Just generate buildout files, don't upload them.
+ If ``buildout-server`` is given buildout files will be copied to that
+ folder.
+
+ - **mypypi** Upload generated buildout files to the url specified by
+ ``buildout-server``. The url should point to the mypypi upload page.
+ (coming soon)
+
- **buildout-server** - The url to a WebDAV enabled web
server where generated buildout files should be uploaded.
+ If ``buildout-upload-type`` is ``local`` this is a path on the local
+ filesystem. Buildout files wil be copied to this folder.
If not given, the process stops after releasing the packages.
- **buildout-server-username** - The username for accessing the WebDAV
More information about the checkins
mailing list