def createRelease(self, version, branch): logger.info('Creating release %r for %r from branch %r' %( version, self.pkg, branch)) # 0. Skip creating releases in offline mode. if self.options.offline: logger.info('Offline: Skip creating a release.') return # 1. Create Release Tag branchUrl = self.getBranchURL(branch) tagUrl = self.getTagURL(version) logger.info('Creating release tag') #TODO: destination folder might not exist... create it self.svn.cp(branchUrl, tagUrl, "Create release tag %s." % version) #base.do('svn cp -m "Create release tag %s." %s %s' %( # version, branchUrl, tagUrl)) # 2. Download tag buildDir = tempfile.mkdtemp() tagDir = os.path.join(buildDir, '%s-%s' %(self.pkg, version)) self.svn.co(tagUrl, tagDir) #base.do('svn co %s %s' %(tagUrl, tagDir)) # 3. Create release # 3.1. Remove setup.cfg logger.info("Updating tag version metadata") setupCfgPath = os.path.join(tagDir, 'setup.cfg') if os.path.exists(setupCfgPath): os.remove(setupCfgPath) # 3.2. Update the version setuppy = file(os.path.join(tagDir, 'setup.py'), 'r').read() setuppy = re.sub( "version ?= ?'(.*)',", "version = '%s'," %version, setuppy) file(os.path.join(tagDir, 'setup.py'), 'w').write(setuppy) # 3.3. Check it all in self.svn.ci(tagDir, "Prepare for release %s." % version) #base.do('svn ci -m "Prepare for release %s." %s' %(version, tagDir)) # 4. Upload the distribution if self.uploadType == 'internal': # 3.4. Create distribution logger.info("Creating release tarball") base.do('python setup.py sdist', cwd = tagDir) if is_win32: ext = 'zip' else: ext = 'tar.gz' distributionFileName = os.path.join( tagDir, 'dist', '%s-%s.%s' %(self.pkg, version, ext)) if not self.options.noUpload: logger.info("Uploading release.") base.uploadFile( distributionFileName, self.packageIndexUrl, self.packageIndexUsername, self.packageIndexPassword, self.options.offline) elif self.uploadType == 'setup.py': # 3.4. Create distribution and upload in one step logger.info("Uploading release to PyPI.") # definitely DO NOT register!!! base.do('python setup.py sdist upload', cwd = tagDir) else: logger.warn('Unknown uploadType: ' + self.uploadType) # 5. Update the start branch to the next development (dev) version if not self.options.noBranchUpdate: logger.info("Updating branch version metadata") # 5.1. Check out the branch. branchDir = os.path.join(buildDir, 'branch') self.svn.co(branchUrl, branchDir) #base.do('svn co --non-recursive %s %s' %(branchUrl, branchDir)) # 5.2. Get the current version. setuppy = file(os.path.join(branchDir, 'setup.py'), 'r').read() currVersion = re.search("version ?= ?'(.*)',", setuppy) if not currVersion: logger.error("No version = found in setup.py, cannot update!") else: currVersion = currVersion.groups()[0] # 5.3. Update setup/py to the next version of the currently # released one newVersion = base.guessNextVersion(version) + 'dev' setuppy = re.sub( "version ?= ?'(.*)',", "version = '%s'," %newVersion, setuppy) file(os.path.join(branchDir, 'setup.py'), 'w').write(setuppy) # 5.4. Check in the changes. self.svn.ci(branchDir, "Update version number to %s." % newVersion) #base.do('svn ci -m "Update version number to %s." %s' %( # newVersion, branchDir)) # 6. Cleanup rmtree(buildDir)
def runCLI(self): # 1. Get the project to be installed. project = self.options.project if project is None: projects = self.getProjects() print 'Projects' for name in projects: print ' * ' + name project = base.getInput('Project', projects[0], False) # 2. Get the variant of the project. variant = self.options.variant if variant is None: variants = self.getVariants(project) print 'Variants' for name in variants: print ' * ' + name if not variants: logger.error( "No variants found, this script only works with variants.") sys.exit(0) variant = base.getInput('Variant', variants[0], False) # 3. Get the version of the project. version = self.options.version if version is None: versions = self.getVersions(project, variant) if len(versions) == 0: print "Sorry, but there have not been any", project, variant, "releases yet." sys.exit(0) if self.options.latest: version = versions[-1] else: print 'Versions' for name in versions: print ' * ' + name version = base.getInput('Version', versions[-1], False) # 4. Install the package url = self.options.url if self.options.username: #add username and password if present so that buildout can access #the URL without prompting parts = urlparse.urlparse(url) url = '%s://%s:%s@%s' % (parts[0], self.options.username, self.options.password, ''.join(parts[1:])) options = [] if self.options.verbose: options.append('-vv') if self.options.overrideDir: overrideDir = self.options.overrideDir #make it absolute if it's not #buildout does not like relative, buildbot cannot do absolute if is_win32: isAbs = overrideDir[0].lower().isalpha() and overrideDir[1]==':' if not isAbs: overrideDir = os.path.abspath(overrideDir) else: isAbs = overrideDir.startswith('/') if not isAbs: overrideDir = os.path.abspath(overrideDir) options.append('buildout:directory=%s' % overrideDir) cfgFile = '%s%s/%s-%s-%s.cfg' % (url, project, project, variant, version) base.do('%s -t %s %s -c %s' %( self.options.buildout, self.options.timeout, ' '.join(options), cfgFile), captureOutput=False)