[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