Merge pull request #2733 from mitmproxy/pyinstaller

Update PyInstaller, add dev version info to builds.
This commit is contained in:
Maximilian Hils 2017-12-30 22:29:49 +01:00 committed by GitHub
commit d9d4d15ee0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 165 additions and 118 deletions

View File

@ -34,9 +34,9 @@ install:
test_script:
- ps: "tox -- --verbose --cov-report=term"
- ps: |
$Env:VERSION = $(python mitmproxy/version.py)
$Env:VERSION = $(python -m mitmproxy.version)
$Env:SKIP_MITMPROXY = "python -c `"print('skip mitmproxy')`""
tox -e wheel
tox -e rtool -- wheel
tox -e rtool -- bdist
- ps: |
@ -46,7 +46,7 @@ test_script:
) {
echo "Decrypt license..."
tox -e rtool -- decrypt release\installbuilder\license.xml.enc release\installbuilder\license.xml
$ibVersion = "17.9.0"
$ibVersion = "17.12.0"
$ibSetup = "C:\projects\mitmproxy\release\installbuilder-installer.exe"
$ibCli = "C:\Program Files (x86)\BitRock InstallBuilder Enterprise $ibVersion\bin\builder-cli.exe"
if (!(Test-Path $ibSetup)) {

View File

@ -1,3 +0,0 @@
# https://github.com/mitmproxy/mitmproxy/issues/1809
# import script here so that pyinstaller registers it.
from . import script # noqa

View File

@ -1,43 +1,24 @@
import gc
import os
import platform
import re
import signal
import sys
import threading
import signal
import platform
import traceback
import subprocess
from mitmproxy import version
from OpenSSL import SSL
from mitmproxy import version
def dump_system_info():
mitmproxy_version = version.VERSION
here = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
try:
git_describe = subprocess.check_output(
['git', 'describe', '--tags', '--long'],
stderr=subprocess.STDOUT,
cwd=here,
)
except:
pass
else:
last_tag, tag_dist, commit = git_describe.decode().strip().rsplit("-", 2)
commit = commit.lstrip("g") # remove the 'g' prefix added by recent git versions
tag_dist = int(tag_dist)
if tag_dist > 0:
tag_dist = "dev{:04}".format(tag_dist)
else:
tag_dist = ""
mitmproxy_version += "{tag_dist} ({commit})".format(
tag_dist=tag_dist,
commit=commit,
)
mitmproxy_version = version.get_version(True, True)
mitmproxy_version = re.sub(
r"-0x([0-9a-f]+)",
r" (commit \1)",
mitmproxy_version
)
# PyInstaller builds indicator, if using precompiled binary
if getattr(sys, 'frozen', False):

View File

@ -1,5 +1,9 @@
IVERSION = (3, 0, 0)
VERSION = ".".join(str(i) for i in IVERSION)
import os
import subprocess
# The actual version string. For precompiled binaries, this will be changed to include the build
# tag, e.g. "3.0.0.dev0042-0xcafeabc"
VERSION = "3.0.0"
PATHOD = "pathod " + VERSION
MITMPROXY = "mitmproxy " + VERSION
@ -7,5 +11,54 @@ MITMPROXY = "mitmproxy " + VERSION
# for each change in the file format.
FLOW_FORMAT_VERSION = 5
def get_version(dev: bool = False, build: bool = False, refresh: bool = False) -> str:
"""
Return a detailed version string, sourced either from a hardcoded VERSION constant
or obtained dynamically using git.
Args:
dev: If True, non-tagged releases will include a ".devXXXX" suffix, where XXXX is the number
of commits since the last tagged release.
build: If True, non-tagged releases will include a "-0xXXXXXXX" suffix, where XXXXXXX are
the first seven digits of the commit hash.
refresh: If True, always try to use git instead of a potentially hardcoded constant.
"""
mitmproxy_version = VERSION
if "dev" in VERSION and not refresh:
pass # There is a hardcoded build tag, so we just use what's there.
elif dev or build:
here = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
try:
git_describe = subprocess.check_output(
['git', 'describe', '--tags', '--long'],
stderr=subprocess.STDOUT,
cwd=here,
)
last_tag, tag_dist, commit = git_describe.decode().strip().rsplit("-", 2)
commit = commit.lstrip("g")[:7]
tag_dist = int(tag_dist)
except Exception:
pass
else:
# Remove current suffix
mitmproxy_version = mitmproxy_version.split(".dev")[0]
# Add suffix for non-tagged releases
if tag_dist > 0:
mitmproxy_version += ".dev{tag_dist:04}".format(tag_dist=tag_dist)
# The wheel build tag (we use the commit) must start with a digit, so we include "0x"
mitmproxy_version += "-0x{commit}".format(commit=commit)
if not dev:
mitmproxy_version = mitmproxy_version.split(".dev")[0]
elif not build:
mitmproxy_version = mitmproxy_version.split("-0x")[0]
return mitmproxy_version
if __name__ == "__main__":
print(VERSION)

View File

@ -0,0 +1 @@
hiddenimports = ["mitmproxy.script"]

View File

@ -4,6 +4,7 @@ import contextlib
import fnmatch
import os
import platform
import re
import runpy
import shlex
import shutil
@ -79,26 +80,21 @@ def git(args: str) -> str:
return subprocess.check_output(["git"] + shlex.split(args)).decode()
def get_version() -> str:
return runpy.run_path(VERSION_FILE)["VERSION"]
def get_version(dev: bool = False, build: bool = False) -> str:
x = runpy.run_path(VERSION_FILE)
return x["get_version"](dev, build, True)
def get_snapshot_version() -> str:
last_tag, tag_dist, commit = git("describe --tags --long").strip().rsplit("-", 2)
tag_dist = int(tag_dist)
if tag_dist == 0:
return get_version()
else:
# remove the 'g' prefix added by recent git versions
if commit.startswith('g'):
commit = commit[1:]
# The wheel build tag (we use the commit) must start with a digit, so we include "0x"
return "{version}dev{tag_dist:04}-0x{commit}".format(
version=get_version(), # this should already be the next version
tag_dist=tag_dist,
commit=commit
)
def set_version(dev: bool) -> None:
"""
Update version information in mitmproxy's version.py to either include hardcoded information or not.
"""
version = get_version(dev, dev)
with open(VERSION_FILE, "r") as f:
content = f.read()
content = re.sub(r'^VERSION = ".+?"', 'VERSION = "{}"'.format(version), content, flags=re.M)
with open(VERSION_FILE, "w") as f:
f.write(content)
def archive_name(bdist: str) -> str:
@ -116,7 +112,7 @@ def archive_name(bdist: str) -> str:
def wheel_name() -> str:
return "mitmproxy-{version}-py3-none-any.whl".format(
version=get_version(),
version=get_version(True),
)
@ -179,6 +175,23 @@ def contributors():
f.write(contributors_data.encode())
@cli.command("wheel")
def make_wheel():
"""
Build a Python wheel
"""
set_version(True)
try:
subprocess.check_call([
"tox", "-e", "wheel",
], env={
**os.environ,
"VERSION": get_version(True),
})
finally:
set_version(False)
@cli.command("bdist")
def make_bdist():
"""
@ -206,24 +219,30 @@ def make_bdist():
excludes.append("mitmproxy.tools.web")
if tool != "mitmproxy_main":
excludes.append("mitmproxy.tools.console")
subprocess.check_call(
[
"pyinstaller",
"--clean",
"--workpath", PYINSTALLER_TEMP,
"--distpath", PYINSTALLER_DIST,
"--additional-hooks-dir", PYINSTALLER_HOOKS,
"--onefile",
"--console",
"--icon", "icon.ico",
# This is PyInstaller, so setting a
# different log level obviously breaks it :-)
# "--log-level", "WARN",
]
+ [x for e in excludes for x in ["--exclude-module", e]]
+ PYINSTALLER_ARGS
+ [tool]
)
# Overwrite mitmproxy/version.py to include commit info
set_version(True)
try:
subprocess.check_call(
[
"pyinstaller",
"--clean",
"--workpath", PYINSTALLER_TEMP,
"--distpath", PYINSTALLER_DIST,
"--additional-hooks-dir", PYINSTALLER_HOOKS,
"--onefile",
"--console",
"--icon", "icon.ico",
# This is PyInstaller, so setting a
# different log level obviously breaks it :-)
# "--log-level", "WARN",
]
+ [x for e in excludes for x in ["--exclude-module", e]]
+ PYINSTALLER_ARGS
+ [tool]
)
finally:
set_version(False)
# Delete the spec file - we're good without.
os.remove("{}.spec".format(tool))
@ -299,7 +318,11 @@ def upload_snapshot(host, port, user, private_key, private_key_password, wheel,
for f in files:
local_path = join(DIST_DIR, f)
remote_filename = f.replace(get_version(), get_snapshot_version())
remote_filename = re.sub(
r"{version}(\.dev\d+(-0x[0-9a-f]+)?)?".format(version=get_version()),
get_version(True, True),
f
)
symlink_path = "../{}".format(f.replace(get_version(), "latest"))
# Upload new version

View File

@ -1,18 +0,0 @@
from setuptools import setup
setup(
name='mitmproxy-rtool',
version="1.0",
py_modules=["rtool"],
install_requires=[
"click>=6.2, <7.0",
"twine>=1.6.5, <1.10",
"pysftp==0.2.8",
"cryptography>=2.0.0, <2.1",
],
entry_points={
"console_scripts": [
"rtool=rtool:cli",
],
},
)

View File

@ -1,7 +1,7 @@
import os
import runpy
from codecs import open
import re
from setuptools import setup, find_packages
# Based on https://github.com/pypa/sampleproject/blob/master/setup.py
@ -12,7 +12,8 @@ here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.rst'), encoding='utf-8') as f:
long_description = f.read()
VERSION = runpy.run_path(os.path.join(here, "mitmproxy", "version.py"))["VERSION"]
with open(os.path.join(here, "mitmproxy", "version.py")) as f:
VERSION = re.search(r'VERSION = "(.+?)(?:-0x|")', f.read()).group(1)
setup(
name="mitmproxy",

View File

@ -1,4 +1,6 @@
import runpy
import subprocess
from unittest import mock
from mitmproxy import version
@ -8,3 +10,24 @@ def test_version(capsys):
stdout, stderr = capsys.readouterr()
assert len(stdout) > 0
assert stdout.strip() == version.VERSION
def test_get_version_hardcoded():
version.VERSION = "3.0.0.dev123-0xcafebabe"
assert version.get_version() == "3.0.0"
assert version.get_version(True) == "3.0.0.dev123"
assert version.get_version(True, True) == "3.0.0.dev123-0xcafebabe"
def test_get_version():
version.VERSION = "3.0.0"
with mock.patch('subprocess.check_output') as m:
m.return_value = b"tag-0-cafecafe"
assert version.get_version(True, True) == "3.0.0"
m.return_value = b"tag-2-cafecafe"
assert version.get_version(True, True) == "3.0.0.dev0002-0xcafecaf"
m.side_effect = subprocess.CalledProcessError(-1, 'git describe --tags --long')
assert version.get_version(True, True) == "3.0.0"

View File

@ -1,5 +1,4 @@
import io
import subprocess
import sys
from unittest import mock
import pytest
@ -14,18 +13,6 @@ def test_dump_system_info_precompiled(precompiled):
assert ("binary" in debug.dump_system_info()) == precompiled
def test_dump_system_info_version():
with mock.patch('subprocess.check_output') as m:
m.return_value = b"v2.0.0-0-cafecafe"
x = debug.dump_system_info()
assert 'dev' not in x
assert 'cafecafe' in x
with mock.patch('subprocess.check_output') as m:
m.side_effect = subprocess.CalledProcessError(-1, 'git describe --tags --long')
assert 'dev' not in debug.dump_system_info()
def test_dump_info():
cs = io.StringIO()
debug.dump_info(None, None, file=cs, testing=True)

17
tox.ini
View File

@ -25,7 +25,7 @@ commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
commands =
mitmdump --version
flake8 --jobs 8 mitmproxy pathod examples test release
python3 test/filename_matching.py
python test/filename_matching.py
rstcheck README.rst
mypy --ignore-missing-imports ./mitmproxy
mypy --ignore-missing-imports ./pathod
@ -35,7 +35,7 @@ commands =
deps =
-rrequirements.txt
commands =
python3 test/individual_coverage.py
python test/individual_coverage.py
[testenv:wheel]
recreate = True
@ -51,14 +51,13 @@ commands =
pathoc --version
[testenv:rtool]
passenv = SKIP_MITMPROXY SNAPSHOT_HOST SNAPSHOT_PORT SNAPSHOT_USER SNAPSHOT_PASS RTOOL_KEY
deps =
-rrequirements.txt
-e./release
# The 3.2 release is broken
# the next commit after this updates the bootloaders, which then segfault!
# https://github.com/pyinstaller/pyinstaller/issues/2232
git+https://github.com/pyinstaller/pyinstaller.git@483c819d6a256b58db6740696a901bd41c313f0c; sys_platform == 'win32'
git+https://github.com/mhils/pyinstaller.git@d094401e4196b1a6a03818b80164a5f555861cef; sys_platform != 'win32'
pyinstaller==3.3.1
twine==1.9.1
pysftp==0.2.8
commands =
rtool {posargs}
mitmdump --version
python ./release/rtool.py {posargs}