Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)