#!/usr/bin/env python3

"""Compile source on a range of commits

Usage:
  check-commits <start> <source>
"""

import os
import sys
import tempfile
from subprocess import check_call, check_output, run

import docopt

args = docopt.docopt(__doc__)
start = args.get("<start>")
source = args.get("<source>")

cwd = os.getcwd()

with tempfile.TemporaryDirectory() as work_dir:
    check_call(["git", "clone", "https://github.com/fmtlib/fmt.git"], cwd=work_dir)
    repo_dir = os.path.join(work_dir, "fmt")
    commits = (
        check_output(
            [
                "git",
                "rev-list",
                f"{start}..HEAD",
                "--abbrev-commit",
                "--",
                "include",
                "src",
            ],
            text=True,
            cwd=repo_dir,
        )
        .rstrip()
        .split("\n")
    )
    commits.reverse()
    print("Time\tCommit")
    for commit in commits:
        check_call(
            ["git", "-c", "advice.detachedHead=false", "checkout", commit], cwd=repo_dir
        )
        returncode = run(
            [
                "c++",
                "-std=c++11",
                "-O3",
                "-DNDEBUG",
                "-I",
                "include",
                "src/format.cc",
                os.path.join(cwd, source),
            ],
            cwd=repo_dir,
        ).returncode
        if returncode != 0:
            continue
        times = []
        for i in range(5):
            output = check_output([os.path.join(repo_dir, "a.out")], text=True)
            times.append(float(output))
        message = check_output(
            ["git", "log", "-1", "--pretty=format:%s", commit], cwd=repo_dir, text=True
        )
        print(f"{min(times)}\t{commit} {message[:40]}")
        sys.stdout.flush()
