#!/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_main() -> None: branch = get_git_branch() if branch != "main": exit(f"You are still on a feature branch: {branch}") check_git_pristine() run("git fetch upstream main") run("git rebase upstream/main") def create_pull_branch(pull_id: int) -> None: run("git fetch upstream pull/%d/head" % (pull_id,)) run(f"git checkout -B review-{pull_id} FETCH_HEAD") run("git rebase upstream/main") run("git log upstream/main.. --oneline") run("git diff upstream/main.. --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_main() create_pull_branch(pull_id) if __name__ == "__main__": review_pr()