| #!/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:]) |