diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/release_windows.bat | 51 | ||||
-rw-r--r-- | tools/tasks.py | 221 |
2 files changed, 272 insertions, 0 deletions
diff --git a/tools/release_windows.bat b/tools/release_windows.bat new file mode 100644 index 0000000..48f2548 --- /dev/null +++ b/tools/release_windows.bat @@ -0,0 +1,51 @@ +@echo off +REM build a pyzmq release on Windows +REM 32+64b eggs on Python 27, and wheels on 27, 34 +REM that's 6 bdists +REM requires Windows SDK 7.0 (for py2) and 7.1 (for py3) +REM and Python installed in the locations: C:\Python34 (32b) and C:\Python34_64 (64b) + +REM run with cmd /k tools/release_windows.bat + +setlocal EnableDelayedExpansion + +set SDKS=C:\Program Files\Microsoft SDKs\Windows +set SDK7=%SDKS%\v7.0 +set SDK71=%SDKS%\v7.1 +set DISTUTILS_USE_SDK=1 +set UPLOAD=%~1 +set PYROOT=C:\ + +for %%p in (34, 27) do ( + if "%%p"=="27" ( + set SDK=%SDK7% + ) else ( + set SDK=%SDK71% + ) + + if "%%p"=="34" ( + set cmd=build bdist_wheel --zmq=bundled %UPLOAD% + ) else ( + set cmd=build bdist_egg bdist_wheel --zmq=bundled %UPLOAD% + ) + for %%b in (64, 32) do ( + if "%%b"=="64" ( + set SUFFIX=_64 + set ARCH=/x64 + ) else ( + set SUFFIX= + set ARCH=/x86 + ) + set PY=%PYROOT%\Python%%p!SUFFIX!\Python + echo !PY! !SDK! + !PY! -m pip install --upgrade setuptools pip wheel + + @call "!SDK!\Bin\SetEnv.cmd" /release !ARCH! + if !errorlevel! neq 0 exit /b !errorlevel! + @echo on + !PY! setupegg.py !cmd! + @echo off + if !errorlevel! neq 0 exit !errorlevel! + ) +) +exit diff --git a/tools/tasks.py b/tools/tasks.py new file mode 100644 index 0000000..34741cc --- /dev/null +++ b/tools/tasks.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python +""" +invoke script for releasing pyzmq + +usage: + + invoke release 14.3.1 + +""" + +# Copyright (C) PyZMQ Developers +# Distributed under the terms of the Modified BSD License. + + +from __future__ import print_function + +import glob +import os +import pipes +import re +import shutil +import sys + +from contextlib import contextmanager +from subprocess import check_call + +from invoke import task, run as invoke_run + +pjoin = os.path.join + +repo = "git@github.com:zeromq/pyzmq" + +py_exes = { + '2.7' : "/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7", + '3.4' : "/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4", + 'pypy': "/usr/local/bin/pypy", +} +egg_pys = {'2.7'} + +tmp = "/tmp" +env_root = os.path.join(tmp, 'envs') +repo_root = pjoin(tmp, 'pyzmq-release') +sdist_root = pjoin(tmp, 'pyzmq-sdist') + +def _py(py): + return py_exes.get(py, py) + +def run(cmd, **kwargs): + """wrapper around invoke.run that accepts a Popen list""" + if isinstance(cmd, list): + cmd = " ".join(pipes.quote(s) for s in cmd) + kwargs.setdefault('echo', True) + return invoke_run(cmd, **kwargs) + +@contextmanager +def cd(path): + """Context manager for temporary CWD""" + cwd = os.getcwd() + os.chdir(path) + try: + yield + finally: + os.chdir(cwd) + +@task +def clone_repo(reset=False): + """Clone the repo""" + if os.path.exists(repo_root) and reset: + shutil.rmtree(repo_root) + if os.path.exists(repo_root): + with cd(repo_root): + run("git pull") + else: + run("git clone %s %s" % (repo, repo_root)) + +@task +def patch_version(vs): + """Patch zmq/sugar/version.py for the current release""" + major, minor, patch = vs_to_tup(vs) + version_py = pjoin(repo_root, 'zmq', 'sugar', 'version.py') + print("patching %s with %s" % (version_py, vs)) + # read version.py, minus VERSION_ constants + with open(version_py) as f: + pre_lines = [] + post_lines = [] + lines = pre_lines + for line in f: + if line.startswith("VERSION_"): + lines = post_lines + else: + lines.append(line) + + # write new version.py with given VERSION_ constants + with open(version_py, 'w') as f: + for line in pre_lines: + f.write(line) + f.write('VERSION_MAJOR = %s\n' % major) + f.write('VERSION_MINOR = %s\n' % minor) + f.write('VERSION_PATCH = %s\n' % patch) + f.write('VERSION_EXTRA = ""\n') + for line in post_lines: + f.write(line) + +@task +def tag(vs, push=False): + """Make the tag (don't push)""" + patch_version(vs) + with cd(repo_root): + run('git commit -a -m "release {}"'.format(vs)) + run('git tag -a -m "release {0}" v{0}'.format(vs)) + if push: + run('git push') + run('git push --tags') + +def make_env(py_exe, *packages): + """Make a virtualenv + + Assumes `which python` has the `virtualenv` package + """ + py_exe = py_exes.get(py_exe, py_exe) + + if not os.path.exists(env_root): + os.makedirs(env_root) + + env = os.path.join(env_root, os.path.basename(py_exe)) + py = pjoin(env, 'bin', 'python') + # new env + if not os.path.exists(py): + run('python -m virtualenv {} -p {}'.format( + pipes.quote(env), + pipes.quote(py_exe), + )) + py = pjoin(env, 'bin', 'python') + run([py, '-V']) + install(py, 'pip', 'setuptools') + install(py, *packages) + return py + +def build_sdist(py, upload=False): + """Build sdists + + Returns the path to the tarball + """ + install(py, 'cython') + with cd(repo_root): + cmd = [py, 'setup.py', 'sdist', '--formats=zip,gztar'] + if upload: + cmd.append('upload') + run(cmd) + + return glob.glob(pjoin(repo_root, 'dist', '*.tar.gz'))[0] + +@task +def sdist(vs, upload=False): + clone_repo() + patch_version(vs) + tag(vs, push=upload) + py = make_env('2.7', 'cython') + tarball = build_sdist(py, upload=upload) + return untar(tarball) + +def install(py, *packages): + packages + run([py, '-m', 'pip', 'install', '--upgrade'] + list(packages)) + +def vs_to_tup(vs): + """version string to tuple""" + return re.findall(r'\d+', vs) + +def tup_to_vs(tup): + """tuple to version string""" + return '.'.join(tup) + +def untar(tarball): + if os.path.exists(sdist_root): + shutil.rmtree(sdist_root) + os.makedirs(sdist_root) + with cd(sdist_root): + run(['tar', '-xzf', tarball]) + + return glob.glob(pjoin(sdist_root, '*'))[0] + +def bdist(py, upload=False, wheel=True, egg=False): + py = make_env(py, 'wheel') + cmd = [py, 'setupegg.py'] + if wheel: + cmd.append('bdist_wheel') + if egg: + cmd.append('bdist_egg') + if upload: + cmd.append('upload') + cmd.append('--zmq=bundled') + + run(cmd) + +@task +def release(vs, upload=False): + """Release pyzmq""" + # start from scrach with clone and envs + clone_repo(reset=True) + if os.path.exists(env_root): + shutil.rmtree(env_root) + + path = sdist(vs, upload=upload) + + with cd(path): + for v in py_exes: + bdist(v, upload=upload, wheel=True, egg=(v in egg_pys)) + + if upload: + gh_pages() + +@task +def gh_pages(): + py = make_env('2.7', 'cython', 'sphinx', 'numpydoc', 'gevent') + bin = os.path.dirname(py) + with cd(repo_root): + run([py, 'setup.py', 'install', '--zmq=bundled']) + with cd(pjoin(repo_root, 'docs')): + os.environ['PATH'] = '%s:%s' % (bin, os.environ['PATH']) + run('make gh-pages') |