#!/usr/bin/env python3 import shlex import subprocess import sys from typing import List def exit(message): # type: (str) -> None print('PROBLEM!') print(message) sys.exit(1) def run(command): # type: (List[str]) -> None print('\n>>> ' + ' '.join(map(shlex.quote, command))) subprocess.check_call(command) def check_output(command): # type: (List[str]) -> str return subprocess.check_output(command).decode('ascii') def get_git_branch(): # type: () -> str command = ['git', 'rev-parse', '--abbrev-ref', 'HEAD'] output = check_output(command) return output.strip() def check_git_pristine(): # type: () -> None command = ['git', 'status', '--porcelain'] output = check_output(command) if output.strip(): exit('Git is not pristine:\n' + output) def ensure_on_clean_master(): # type: () -> None branch = get_git_branch() if branch != 'master': exit('You are still on a feature branch: %s' % (branch,)) check_git_pristine() run(['git', 'fetch', 'upstream', 'master']) run(['git', 'rebase', 'upstream/master']) def create_pull_branch(pull_id): # type: (int) -> None run(['git', 'fetch', 'upstream', 'pull/%d/head' % (pull_id,)]) run(['git', 'checkout', '-B', 'review-%s' % (pull_id,), 'FETCH_HEAD']) run(['git', 'rebase', 'upstream/master']) run(['git', 'log', 'upstream/master..', '--oneline']) run(['git', 'diff', 'upstream/master..', '--name-status']) print() print('PR: %d' % (pull_id,)) print(subprocess.check_output(['git', 'log', 'HEAD~..', '--pretty=format:Author: %an'])) def review_pr(): # type: () -> None try: pull_id = int(sys.argv[1]) except Exception: exit('please provide an integer pull request id') ensure_on_clean_master() create_pull_branch(pull_id) if __name__ == '__main__': review_pr()