summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2020-09-04 10:22:54 -0400
committerJason R. Coombs <jaraco@jaraco.com>2020-09-04 10:22:54 -0400
commitfc4d9828768ceebd2f9337481450c88376c013e9 (patch)
tree6dff622c50739ca19fdfbecf1008a42589d37b57 /tools
parent7bb73a477de24069002516eb6eb1d755bed9d65b (diff)
parent03d36b9edb53e266a0b4b836e1e3178f989a0781 (diff)
downloadpython-setuptools-git-feature/implicit-bootstrap.tar.gz
Merge branch 'master' into feature/implicit-bootstrapfeature/implicit-bootstrap
Diffstat (limited to 'tools')
-rw-r--r--tools/finalize.py81
-rw-r--r--tools/tox_pip.py14
2 files changed, 82 insertions, 13 deletions
diff --git a/tools/finalize.py b/tools/finalize.py
new file mode 100644
index 00000000..98b06c07
--- /dev/null
+++ b/tools/finalize.py
@@ -0,0 +1,81 @@
+"""
+Finalize the repo for a release. Invokes towncrier and bumpversion.
+"""
+
+__requires__ = ['bump2version', 'towncrier']
+
+
+import subprocess
+import pathlib
+import re
+import sys
+
+
+def release_kind():
+ """
+ Determine which release to make based on the files in the
+ changelog.
+ """
+ # use min here as 'major' < 'minor' < 'patch'
+ return min(
+ 'major' if 'breaking' in file.name else
+ 'minor' if 'change' in file.name else
+ 'patch'
+ for file in pathlib.Path('changelog.d').iterdir()
+ )
+
+
+bump_version_command = [
+ sys.executable,
+ '-m', 'bumpversion',
+ release_kind(),
+]
+
+
+def get_version():
+ cmd = bump_version_command + ['--dry-run', '--verbose']
+ out = subprocess.check_output(cmd, text=True)
+ return re.search('^new_version=(.*)', out, re.MULTILINE).group(1)
+
+
+def update_changelog():
+ cmd = [
+ sys.executable, '-m',
+ 'towncrier',
+ '--version', get_version(),
+ '--yes',
+ ]
+ subprocess.check_call(cmd)
+
+
+def bump_version():
+ cmd = bump_version_command + ['--allow-dirty']
+ subprocess.check_call(cmd)
+
+
+def ensure_config():
+ """
+ Double-check that Git has an e-mail configured.
+ """
+ subprocess.check_output(['git', 'config', 'user.email'])
+
+
+def check_changes():
+ """
+ Verify that all of the files in changelog.d have the appropriate
+ names.
+ """
+ allowed = 'deprecation', 'breaking', 'change', 'doc', 'misc'
+ assert all(
+ any(key in file.name for key in allowed)
+ for file in pathlib.Path('changelog.d').iterdir()
+ if file.name != '.gitignore'
+ )
+
+
+if __name__ == '__main__':
+ print("Cutting release at", get_version())
+ ensure_config()
+ check_changes()
+ update_changelog()
+ bump_version()
diff --git a/tools/tox_pip.py b/tools/tox_pip.py
index 3a66b05d..9abba603 100644
--- a/tools/tox_pip.py
+++ b/tools/tox_pip.py
@@ -12,7 +12,7 @@ def remove_setuptools():
cmd = [sys.executable, '-m', 'pip', 'uninstall', '-y', 'setuptools']
# set cwd to something other than '.' to avoid detecting
# '.' as the installed package.
- subprocess.check_call(cmd, cwd='.tox')
+ subprocess.check_call(cmd, cwd=os.environ['TOX_WORK_DIR'])
def is_install_self(args):
@@ -50,23 +50,11 @@ def test_dependencies():
return filter(None, map(clean, raw))
-def disable_python_requires():
- """
- On Python 2, install the dependencies that are selective
- on Python version while honoring REQUIRES_PYTHON, then
- disable REQUIRES_PYTHON so that pip can install this
- checkout of setuptools.
- """
- pip('install', *test_dependencies())
- os.environ['PIP_IGNORE_REQUIRES_PYTHON'] = 'true'
-
-
def run(args):
os.environ['PIP_USE_PEP517'] = 'true'
if is_install_self(args):
remove_setuptools()
- sys.version_info > (3,) or disable_python_requires()
pip(*args)