diff --git a/release/build.py b/release/build.py deleted file mode 100755 index 7d0d52dc6..000000000 --- a/release/build.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/env python - -from __future__ import (absolute_import, print_function, division) -from contextlib import contextmanager -from os.path import dirname, realpath, join, exists, normpath -import os -import shutil -import subprocess -import glob -import re -from shlex import split -import click - -# https://virtualenv.pypa.io/en/latest/userguide.html#windows-notes -# scripts and executables on Windows go in ENV\Scripts\ instead of ENV/bin/ -if os.name == "nt": - venv_bin = "Scripts" -else: - venv_bin = "bin" - -root_dir = join(dirname(realpath(__file__)), "..", "..") -mitmproxy_dir = join(root_dir, "mitmproxy") -dist_dir = join(mitmproxy_dir, "dist") -test_venv_dir = join(root_dir, "venv.mitmproxy-release") - -all_projects = ("netlib", "pathod", "mitmproxy") -tools = { - "mitmproxy": ["mitmproxy", "mitmdump", "mitmweb"], - "pathod": ["pathod", "pathoc"], - "netlib": [] -} -if os.name == "nt": - tools["mitmproxy"].remove("mitmproxy") -version_files = { - "mitmproxy": normpath(join(root_dir, "mitmproxy/libmproxy/version.py")), - "pathod": normpath(join(root_dir, "pathod/libpathod/version.py")), - "netlib": normpath(join(root_dir, "netlib/netlib/version.py")), -} - - -@contextmanager -def empty_pythonpath(): - """ - Make sure that the regular python installation is not on the python path, - which would give us access to modules installed outside of our virtualenv. - """ - pythonpath = os.environ["PYTHONPATH"] - os.environ["PYTHONPATH"] = "" - yield - os.environ["PYTHONPATH"] = pythonpath - - -@contextmanager -def chdir(path): - old_dir = os.getcwd() - os.chdir(path) - yield - os.chdir(old_dir) - - -@click.group(chain=True) -def cli(): - """ - mitmproxy build tool - """ - pass - - -@cli.command("contributors") -def contributors(): - """ - Update CONTRIBUTORS.md - """ - print("Updating CONTRIBUTORS.md...") - contributors_data = subprocess.check_output(split("git shortlog -n -s")) - with open(join(mitmproxy_dir, "CONTRIBUTORS"), "w") as f: - f.write(contributors_data) - - -@cli.command("docs") -def docs(): - """ - Render the docs - """ - print("Rendering the docs...") - subprocess.check_call([ - "cshape", - join(mitmproxy_dir, "doc-src"), - join(mitmproxy_dir, "doc") - ]) - - -@cli.command("set-version") -@click.option('--project', '-p', 'projects', multiple=True, type=click.Choice(all_projects), default=all_projects) -@click.argument('version') -def set_version(projects, version): - """ - Update version information - """ - print("Update versions...") - version = ", ".join(version.split(".")) - for project, version_file in version_files.items(): - if project not in projects: - continue - print("Update %s..." % version_file) - with open(version_file, "rb") as f: - content = f.read() - new_content = re.sub(r"IVERSION\s*=\s*\([\d,\s]+\)", "IVERSION = (%s)" % version, content) - with open(version_file, "wb") as f: - f.write(new_content) - - -@cli.command("git") -@click.option('--project', '-p', 'projects', multiple=True, type=click.Choice(all_projects), default=all_projects) -@click.argument('args', nargs=-1, required=True) -def git(projects, args): - """ - Run a git command on every project - """ - args = ["git"] + list(args) - for project in projects: - print("%s> %s..." % (project, " ".join(args))) - subprocess.check_call( - args, - cwd=join(root_dir, project) - ) - - -@cli.command("sdist") -@click.option('--project', '-p', 'projects', multiple=True, type=click.Choice(all_projects), default=all_projects) -def sdist(projects): - """ - Build a source distribution - """ - with empty_pythonpath(): - print("Building release...") - if exists(dist_dir): - shutil.rmtree(dist_dir) - for project in projects: - print("Creating %s source distribution..." % project) - subprocess.check_call( - ["python", "./setup.py", "-q", "sdist", "--dist-dir", dist_dir, "--formats=gztar"], - cwd=join(root_dir, project) - ) - - -@cli.command("test") -@click.option('--project', '-p', 'projects', multiple=True, type=click.Choice(all_projects), default=all_projects) -@click.pass_context -def test(ctx, projects): - """ - Test the source distribution - """ - if not exists(dist_dir): - ctx.invoke(sdist) - - with empty_pythonpath(): - print("Creating virtualenv for test install...") - if exists(test_venv_dir): - shutil.rmtree(test_venv_dir) - subprocess.check_call(["virtualenv", "-q", test_venv_dir]) - - pip = join(test_venv_dir, venv_bin, "pip") - with chdir(dist_dir): - for project in projects: - print("Installing %s..." % project) - dist = glob.glob("./%s*" % project)[0] - subprocess.check_call([pip, "install", "-q", dist]) - - print("Running binaries...") - for project in projects: - for tool in tools[project]: - tool = join(test_venv_dir, venv_bin, tool) - print(tool) - print(subprocess.check_output([tool, "--version"])) - - print("Virtualenv available for further testing:") - print("source %s" % normpath(join(test_venv_dir, venv_bin, "activate"))) - - -@cli.command("upload") -@click.option('--username', prompt=True) -@click.password_option(confirmation_prompt=False) -@click.option('--repository', default="pypi") -def upload_release(username, password, repository): - """ - Upload source distributions to PyPI - """ - print("Uploading distributions...") - subprocess.check_call([ - "twine", - "upload", - "-u", username, - "-p", password, - "-r", repository, - "%s/*" % dist_dir - ]) - - -# TODO: Fully automate build process. -# This wizard is missing OSX builds and updating mitmproxy.org. -@cli.command("wizard") -@click.option('--version', prompt=True) -@click.option('--username', prompt="PyPI Username") -@click.password_option(confirmation_prompt=False, prompt="PyPI Password") -@click.option('--repository', default="pypi") -@click.option('--project', '-p', 'projects', multiple=True, type=click.Choice(all_projects), default=all_projects) -@click.pass_context -def wizard(ctx, version, username, password, repository, projects): - """ - Interactive Release Wizard - """ - for project in projects: - if subprocess.check_output(["git", "status", "--porcelain"], cwd=join(root_dir, project)): - raise RuntimeError("%s repository is not clean." % project) - - # Build test release - ctx.invoke(sdist, projects=projects) - ctx.invoke(test, projects=projects) - click.confirm("Please test the release now. Is it ok?", abort=True) - - # bump version, update docs and contributors - ctx.invoke(set_version, version=version, projects=projects) - ctx.invoke(docs) - ctx.invoke(contributors) - - # version bump commit + tag - ctx.invoke(git, args=["commit", "-a", "-m", "bump version"], projects=projects) - ctx.invoke(git, args=["tag", "v" + version], projects=projects) - ctx.invoke(git, args=["push"], projects=projects) - ctx.invoke(git, args=["push", "--tags"], projects=projects) - - # Re-invoke sdist with bumped version - ctx.invoke(sdist, projects=projects) - click.confirm("All good, can upload to PyPI?", abort=True) - ctx.invoke(upload_release, username=username, password=password, repository=repository) - click.echo("All done!") - - -if __name__ == "__main__": - cli() diff --git a/release/osx-binaries b/release/osx-binaries deleted file mode 100755 index 3cfe0913b..000000000 --- a/release/osx-binaries +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh - -# Quick and dangerous script for building OSX binaries. - -# At the moment, pyinstaller has no support for entry points, except for this -# hideous hack on the wiki: -# https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Setuptools-Entry-Point -# Once this is fixed, we can ditch the redundant command scripts. - -VENV=../venv.mitmproxy -PYINST_CMD="$VENV/bin/pyinstaller -F --clean" -TMPDIR=./tmp -CACHE="~/Library/Application Support/pyinstaller" - - -if [ ! -d $VENV ] -then - echo "Failed: set up a dev environment as described in the README" - echo "and run from the top-level mitmproxy directory." - exit -fi - -source $VENV/bin/activate - -if [ ! -f $VENV/bin/pyinstaller ] - then - echo "Installing pyinstaller..." - $VENV/bin/pip install \ - --force-reinstall \ - --upgrade \ - https://github.com/pyinstaller/pyinstaller/archive/develop.zip - $VENV/bin/pip install --upgrade macholib -fi - -# readline.so is actually a symlink to a Python file, which breaks PyInstaller -# (and readline itself). Why? Who knows. Re-address this when this stupidity -# ceases to be. -echo "Removing broken readline..." -rm -f $VENV/lib/python2.7/readline.so - - -echo "Clearing caches..." -rm -f dist/* -rm -rf $TMPDIR -rm -rf $CACHE - -$PYINST_CMD ./release/mitmdump.spec -echo "Running mitmdump..." -./dist/mitmdump --version || exit 1 - -$PYINST_CMD ./release/mitmproxy.spec -echo "Running mitmproxy..." -./dist/mitmproxy --version || exit 1 - -$PYINST_CMD ./release/mitmweb.spec -echo "Running mitmweb..." -./dist/mitmweb --version || exit 1 - -DST=osx-mitmproxy-`./dist/mitmdump --shortversion 2>&1` -mkdir -p $TMPDIR/$DST -cp ./dist/mitmproxy $TMPDIR/$DST -cp ./dist/mitmdump $TMPDIR/$DST -cshape ./doc-src $TMPDIR/$DST/doc - -cd $TMPDIR -tar -czvf $DST.tar.gz $DST diff --git a/release/release-checklist.md b/release/release-checklist.md deleted file mode 100644 index e6d9ae1f4..000000000 --- a/release/release-checklist.md +++ /dev/null @@ -1,55 +0,0 @@ -# Release Checklist - -## Test - - - Create the source distributions, make sure the output is sensible: - `./release/build.py release` - All source distributions can be found in `./dist`. - - - Test the source distributions: - `./release/build.py test` - This creates a new virtualenv in `../venv.mitmproxy-release` and installs the distributions from `./dist` into it. - -## Release - - - Verify that repositories are in a clean state: - `./release/build.py git status` - - - Update the version number in `version.py` for all projects: - `./release/build.py set-version 0.13` - - - Ensure that the website style assets have been compiled for production, and synced to the docs. - - - Render the docs, update CONTRIBUTORS file: - `./release/build.py docs contributors` - - - Make version bump commit for all projects, tag and push it: - `./release/build.py git commit -am "bump version"` - `./release/build.py git tag v0.13` - `./release/build.py git push --tags` - - - Recreate the source distributions with updated version information: - `./release/build.py sdist` - - - Build the OSX binaries - - Follow instructions in osx-binaries - - Move to download dir: - `mv ./tmp/osx-mitmproxy-VERSION.tar.gz ~/mitmproxy/www.mitmproxy.org/src/download` - - - Move all source distributions from `./dist` to the server: - `mv ./dist/* ~/mitmproxy/www.mitmproxy.org/src/download` - - - Upload distributions in `./dist` to PyPI: - `./release/build.py upload` - You can test with [testpypi.python.org](https://testpypi.python.org/pypi) by passing `--repository test`. - ([more info](https://tom-christie.github.io/articles/pypi/)) - - - Now bump the version number to be ready for the next cycle: - - **TODO**: We just shipped 0.12 - do we bump to 0.12.1 or 0.13 now? - We should probably just leave it as-is and only bump once we actually do the next release. - - Also, we need a release policy. I propose the following: - - By default, every release is a new minor (`0.x`) release and it will be pushed for all three projects. - - Only if an emergency bugfix is needed, we push a new `0.x.y` bugfix release for a single project. - This matches with what we do in `setup.py`: `"netlib>=%s, <%s" % (version.MINORVERSION, version.NEXT_MINORVERSION)` \ No newline at end of file diff --git a/release/test-release b/release/test-release deleted file mode 100755 index 8cbcea8c5..000000000 --- a/release/test-release +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -MITMPROXY_DIR=~/mitmproxy/mitmproxy -NETLIB_DIR=~/mitmproxy/netlib -PATHOD_DIR=~/mitmproxy/pathod -DST=/tmp/mitmproxy_release - -rm -rf $DST -mkdir -p $DST - -cd $NETLIB_DIR -echo "Creating netlib source distribution..." -python ./setup.py -q sdist --dist-dir $DST - -echo "Creating mitmproxy source distribution..." -cd $MITMPROXY_DIR -python ./setup.py -q sdist --dist-dir $DST - -echo "Creating pathod source distribution..." -cd $PATHOD_DIR -python ./setup.py -q sdist --dist-dir $DST - -echo "Creating virtualenv for test install..." -virtualenv -q $DST/venv - -cd $DST -echo "Installing netlib..." -./venv/bin/pip -q install --download-cache ~/.pipcache ./netlib* -echo "Installing pathod..." -./venv/bin/pip -q install --download-cache ~/.pipcache ./pathod* -echo "Installing mitmproxy..." -./venv/bin/pip -q install --download-cache ~/.pipcache ./mitmproxy* - -echo "Running binaries..." -./venv/bin/mitmproxy --version -./venv/bin/mitmdump --version -./venv/bin/pathod --version -./venv/bin/pathoc --version diff --git a/setup.py b/setup.py index da080bc12..847a17f99 100644 --- a/setup.py +++ b/setup.py @@ -38,8 +38,6 @@ dev_deps = { "nose>=1.3.0", "nose-cov>=1.6", "coveralls>=0.4.1", - "click>=4.1", - "twine>=1.5.0", "pathod>=%s, <%s" % (version.MINORVERSION, version.NEXT_MINORVERSION), "countershape" }