diff options
| author | Maximilian Hils <git@maximilianhils.com> | 2015-11-29 02:46:08 +0100 | 
|---|---|---|
| committer | Maximilian Hils <git@maximilianhils.com> | 2015-11-29 02:46:08 +0100 | 
| commit | decdb75fbaccbcd041433542f10163c104c43b9c (patch) | |
| tree | 15ea67103d36ed26043b0de2d853a02b5266bc53 /rtool | |
| parent | 178324a0eea184930a3f7eb58cd85861f1acd97e (diff) | |
| download | mitmproxy-decdb75fbaccbcd041433542f10163c104c43b9c.tar.gz mitmproxy-decdb75fbaccbcd041433542f10163c104c43b9c.tar.bz2 mitmproxy-decdb75fbaccbcd041433542f10163c104c43b9c.zip  | |
update rtool
Diffstat (limited to 'rtool')
| -rwxr-xr-x | rtool | 368 | 
1 files changed, 0 insertions, 368 deletions
@@ -1,368 +0,0 @@ -#!/usr/bin/env python -from __future__ import ( -    absolute_import, print_function, division -) -from os.path import join -import contextlib -import os.path -import os -import shutil -import subprocess -import glob -import re -import shlex -import runpy -import pprint - -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" - - -RELEASE_DIR = join(os.path.dirname(os.path.realpath(__file__))) -DIST_DIR = join(RELEASE_DIR, "release") -ROOT_DIR = join(RELEASE_DIR, "..") -MITMPROXY_DIR = join(ROOT_DIR, "mitmproxy") - -PYINSTALLER_URL =\ -    "https://github.com/pyinstaller/pyinstaller/archive/develop.zip" -PYINSTALLER_CACHE = os.path.expanduser( -    "~/Library/Application Support/pyinstaller" -) -PYINSTALLER_DIST = join(RELEASE_DIR, "pyinstallerdist") - -VENV_DIR = join(RELEASE_DIR, "venv") -VENV_PIP = join(VENV_DIR, VENV_BIN, "pip") -VENV_PYINSTALLER = join(VENV_DIR, VENV_BIN, "pyinstaller") - -PROJECTS = { -    "netlib": { -        "tools": [], -        "vfile": join(ROOT_DIR, "netlib/netlib/version.py"), -        "version": None, -        "dir": None -    }, -    "pathod": { -        "tools": ["pathod", "pathoc"], -        "vfile": join(ROOT_DIR, "pathod/libpathod/version.py"), -        "version": None, -        "dir": None -    }, -    "mitmproxy": { -        "tools": ["mitmproxy", "mitmdump", "mitmweb"], -        "vfile": join(ROOT_DIR, "mitmproxy/libmproxy/version.py"), -        "version": None, -        "dir": None -    } -} -if os.name == "nt": -    PROJECTS["mitmproxy"]["tools"].remove("mitmproxy") - -for project, settings in PROJECTS.items(): -    settings["version"] = runpy.run_path(settings["vfile"])["VERSION"] -    settings["dir"] = join(ROOT_DIR, project) - - -def proj(spec): -    """ -        A small helper to iterate over filtered projects. -    """ -    for k, v in PROJECTS.items(): -        if k not in spec: -            continue -        yield k, v - - -@contextlib.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 - - -@contextlib.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") -@click.option( -    '--project', '-p', 'projects', -    multiple=True, type=click.Choice(PROJECTS.keys()), default=PROJECTS.keys() -) -def contributors(projects): -    """ -        Update CONTRIBUTORS.md -    """ -    for project, conf in proj(projects): -        with chdir(conf["dir"]): -            print("Updating %s/CONTRIBUTORS..."%project) -            contributors_data = subprocess.check_output( -                shlex.split("git shortlog -n -s") -            ) -            with open("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(PROJECTS.keys()), default=PROJECTS.keys() -) -@click.argument('version') -def set_version(projects, version): -    """ -    Update version information -    """ -    print("Update versions...") -    version = ", ".join(version.split(".")) -    for p, conf in proj(projects): -        print("Update %s..." % conf["vfile"]) -        with open(conf["vfile"], "rb") as f: -            content = f.read() -        new_content = re.sub( -            r"IVERSION\s*=\s*\([\d,\s]+\)", "IVERSION = (%s)" % version, -            content -        ) -        with open(conf["vfile"], "wb") as f: -            f.write(new_content) - - -@cli.command("git") -@click.option( -    '--project', '-p', 'projects', -    multiple=True, type=click.Choice(PROJECTS.keys()), default=PROJECTS.keys() -) -@click.argument('args', nargs=-1, required=True) -def git(projects, args): -    """ -    Run a git command on every project -    """ -    args = ["git"] + list(args) -    for project, conf in proj(projects): -        print("%s> %s..." % (project, " ".join(args))) -        subprocess.check_call( -            args, -            cwd=conf["dir"] -        ) - - -@cli.command("sdist") -@click.option( -    '--project', '-p', 'projects', -    multiple=True, type=click.Choice(PROJECTS.keys()), default=PROJECTS.keys() -) -def sdist(projects): -    """ -    Build a source distribution -    """ -    with empty_pythonpath(): -        print("Building release...") -        if os.path.exists(DIST_DIR): -            shutil.rmtree(DIST_DIR) -        for project, conf in proj(projects): -            print("Creating %s source distribution..." % project) -            subprocess.check_call( -                [ -                    "python", "./setup.py", -                    "-q", "sdist", "--dist-dir", DIST_DIR, "--formats=gztar" -                ], -                cwd=conf["dir"] -            ) - - -@cli.command("osxbin") -@click.option( -    '--project', '-p', 'projects', -    multiple=True, -    type=click.Choice(PROJECTS.keys()), -    default=PROJECTS.keys() -) -@click.pass_context -def osxbin(ctx, projects): -    if not os.path.exists(VENV_PYINSTALLER): -        print("Instaling PyInstaller...") -        subprocess.check_call( -            [ -                VENV_PIP, -                "install", -                PYINSTALLER_URL -            ] -        ) - -    shutil.rmtree(PYINSTALLER_CACHE, ignore_errors=True) -    shutil.rmtree("./build", ignore_errors=True) -    shutil.rmtree(PYINSTALLER_DIST, ignore_errors=True) -    for p, conf in proj(projects): -        specs = glob.glob(os.path.join(conf["dir"], "release/*.spec")) -        if specs: -            for spec in specs: -                subprocess.check_call( -                    [ -                        VENV_PYINSTALLER, -                        "--distpath", PYINSTALLER_DIST, -                        spec -                    ] -                ) -            bins = os.listdir(PYINSTALLER_DIST) - -            base = os.path.join(DIST_DIR, "osx-" + p + "-" + conf["version"]) -            shutil.rmtree(base, ignore_errors=True) -            os.makedirs(base) -            for bin in bins: -                bin = os.path.join(PYINSTALLER_DIST, bin) -                subprocess.check_call([bin, "--version"]) -                shutil.move(bin, base) -            subprocess.check_call( -                [ -                    "tar", -                    "-czvf", -                    base + ".tgz", -                    base -                ] -            ) - - -@cli.command("mkvenv") -@click.option( -    '--project', '-p', 'projects', -    multiple=True, type=click.Choice(PROJECTS.keys()), default=PROJECTS.keys() -) -@click.pass_context -def mkvenv(ctx, projects): -    """ -    make a venv and test the source distribution -    """ -    ctx.invoke(sdist) -    with empty_pythonpath(): -        print("Creating virtualenv for test install...") -        if os.path.exists(VENV_DIR): -            shutil.rmtree(VENV_DIR) -        subprocess.check_call(["virtualenv", "-q", VENV_DIR]) - -        with chdir(DIST_DIR): -            for project, conf in proj(projects): -                print("Installing %s..." % project) -                subprocess.check_call([VENV_PIP, "install", "-q", conf["dir"]]) - -            print("Running binaries...") -            for project, conf in proj(projects): -                for tool in PROJECTS[project]["tools"]: -                    tool = join(VENV_DIR, VENV_BIN, tool) -                    print(tool) -                    print(subprocess.check_output([tool, "--version"])) - -            print("Virtualenv available for further testing:") -            print( -                "source %s" % os.path.normpath( -                    join(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(PROJECTS.keys()), default=PROJECTS.keys() -) -@click.pass_context -def wizard(ctx, version, username, password, repository, projects): -    """ -    Interactive Release Wizard -    """ -    for project, conf in proj(projects): -        if subprocess.check_output( -            ["git", "status", "--porcelain"], -            cwd=conf["dir"] -        ): -            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()  | 
