#!/usr/bin/env python3

import subprocess
import sys

def exit(message: str) -> None:
    print('PROBLEM!')
    print(message)
    sys.exit(1)

def run(command: str) -> None:
    print('\n>>> ' + command)
    subprocess.check_call(command.split())

def check_output(command: str) -> str:
    return subprocess.check_output(command.split()).decode('ascii')

def get_git_branch() -> str:
    command = 'git rev-parse --abbrev-ref HEAD'
    output = check_output(command)
    return output.strip()

def check_git_pristine() -> None:
    command = 'git status --porcelain'
    output = check_output(command)
    if output.strip():
        exit('Git is not pristine:\n' + output)

def ensure_on_clean_master() -> 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: int) -> None:
    run('git fetch upstream pull/%d/head' % (pull_id,))
    run('git checkout -B review-%s FETCH_HEAD' % (pull_id,))
    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() -> 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()