diff --git a/bin/make_dependency_update_pr.py b/bin/make_dependency_update_pr.py new file mode 100755 index 00000000..d24295a5 --- /dev/null +++ b/bin/make_dependency_update_pr.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import os +import time +from pathlib import Path +from subprocess import run + +import click +import textwrap + + +def shell(cmd, **kwargs): + return run([cmd], shell=True, **kwargs) + + +def git_repo_has_changes(): + unstaged_changes = shell('git diff-index --quiet HEAD --').returncode != 0 + staged_changes = shell('git diff-index --quiet --cached HEAD --').returncode != 0 + return unstaged_changes or staged_changes + + +@click.command() +def main(force): + project_root = Path(__file__).parent / '..' + os.chdir(project_root) + + if git_repo_has_changes() and not force: + print('Your git repo has uncommitted changes. Commit or stash before continuing.') + exit(1) + + previous_branch = shell('git rev-parse --abbrev-ref HEAD', + check=True, + capture_output=True, + encoding='utf8').stdout.strip() + + shell('git fetch origin', check=True) + + timestamp = time.strftime('%Y-%m-%dT%H-%M-%S', time.gmtime()) + branch_name = f'update-constraints-{timestamp}' + + shell(f'git checkout -b {branch_name} origin/master', check=True) + + try: + shell('bin/update_constraints.py', check=True) + + if not git_repo_has_changes(): + print('Done: no constraint updates required.') + return + + shell('git commit -a -m "Update dependencies"', check=True) + run( + [ + 'gh', 'pr', 'create', + '--repo', 'joerick/cibuildwheel', + '--base', 'master', + '--title', 'Update dependencies', + '--body', textwrap.dedent(f''' + Update the versions of our dependencies. + + PR generated by `{os.path.basename(__file__)}`. + ''') + ], + check=True + ) + + print('Done.') + finally: + # remove any local changes + shell('git checkout -- .') + shell(f'git checkout {previous_branch}', check=True) + shell(f'git branch -D --force {branch_name}', check=True) + + +if __name__ == '__main__': + main.main(standalone_mode=True) diff --git a/bin/update_constraints.py b/bin/update_dependencies.py similarity index 100% rename from bin/update_constraints.py rename to bin/update_dependencies.py diff --git a/requirements-dev.txt b/requirements-dev.txt index df361eba..f838e3f2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,3 +4,4 @@ pytest mkdocs==1.0.4 pip-tools requests +click