| #!/usr/bin/env python | |
| """Make a pull request from HEAD""" | |
| from __future__ import print_function | |
| from argparse import ArgumentParser | |
| from subprocess import check_call, check_output, Popen, PIPE, CalledProcessError | |
| import sys | |
| import re | |
| import os | |
| import yaml | |
| import github3 | |
| CONFIG_PATH = "~/.config/hub" | |
| OWNER = "rohanpm" | |
| REPO = "more-executors" | |
| def github_session(): | |
| with open(os.path.expanduser(CONFIG_PATH)) as f: | |
| hub_config = yaml.load(f) | |
| creds = hub_config.get("github.com", []) | |
| if not creds: | |
| raise RuntimeError("Login with 'hub' command first") | |
| if len(creds) != 1: | |
| raise RuntimeError("Unexpected content in %s" % CONFIG_PATH) | |
| token = creds[0].get("oauth_token") | |
| if not token: | |
| raise RuntimeError("Missing token in %s" % CONFIG_PATH) | |
| return github3.login(token=token) | |
| def run(raw_args): | |
| parser = ArgumentParser() | |
| parser.add_argument("name", help="name for branch") | |
| parser.add_argument( | |
| "--remove-branch", | |
| action="store_true", | |
| help="remove branch if it already exists", | |
| ) | |
| parser.add_argument( | |
| "--skip-rebase", action="store_true", help="do not rebase on master before push" | |
| ) | |
| parser.add_argument("-m", help="pull-request message") | |
| args = parser.parse_args(raw_args) | |
| if args.remove_branch: | |
| try: | |
| check_call(["git", "branch", "-D", args.name]) | |
| except CalledProcessError: | |
| pass | |
| check_call(["git", "checkout", "-b", args.name]) | |
| if not args.skip_rebase: | |
| check_call(["git", "fetch", "origin"]) | |
| check_call(["git", "rebase", "-i", "origin/master"]) | |
| check_call(["git", "push", "-f", "--set-upstream", "origin", args.name]) | |
| pr_cmd = ["hub", "pull-request"] | |
| if args.m: | |
| pr_cmd.extend(["-m", args.m]) | |
| check_call(pr_cmd) | |
| if __name__ == "__main__": | |
| run(sys.argv[1:]) |