67 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#!/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()
 |