xref: /aosp_15_r20/external/fmtlib/support/check-commits (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*5c90c05cSAndroid Build Coastguard Worker
3*5c90c05cSAndroid Build Coastguard Worker"""Compile source on a range of commits
4*5c90c05cSAndroid Build Coastguard Worker
5*5c90c05cSAndroid Build Coastguard WorkerUsage:
6*5c90c05cSAndroid Build Coastguard Worker  check-commits <start> <source>
7*5c90c05cSAndroid Build Coastguard Worker"""
8*5c90c05cSAndroid Build Coastguard Worker
9*5c90c05cSAndroid Build Coastguard Workerimport docopt, os, sys, tempfile
10*5c90c05cSAndroid Build Coastguard Workerfrom subprocess import check_call, check_output, run
11*5c90c05cSAndroid Build Coastguard Worker
12*5c90c05cSAndroid Build Coastguard Workerargs = docopt.docopt(__doc__)
13*5c90c05cSAndroid Build Coastguard Workerstart = args.get('<start>')
14*5c90c05cSAndroid Build Coastguard Workersource = args.get('<source>')
15*5c90c05cSAndroid Build Coastguard Worker
16*5c90c05cSAndroid Build Coastguard Workercwd = os.getcwd()
17*5c90c05cSAndroid Build Coastguard Worker
18*5c90c05cSAndroid Build Coastguard Workerwith tempfile.TemporaryDirectory() as work_dir:
19*5c90c05cSAndroid Build Coastguard Worker  check_call(['git', 'clone', 'https://github.com/fmtlib/fmt.git'],
20*5c90c05cSAndroid Build Coastguard Worker             cwd=work_dir)
21*5c90c05cSAndroid Build Coastguard Worker  repo_dir = os.path.join(work_dir, 'fmt')
22*5c90c05cSAndroid Build Coastguard Worker  commits = check_output(
23*5c90c05cSAndroid Build Coastguard Worker    ['git', 'rev-list', f'{start}..HEAD', '--abbrev-commit',
24*5c90c05cSAndroid Build Coastguard Worker     '--', 'include', 'src'],
25*5c90c05cSAndroid Build Coastguard Worker    text=True, cwd=repo_dir).rstrip().split('\n')
26*5c90c05cSAndroid Build Coastguard Worker  commits.reverse()
27*5c90c05cSAndroid Build Coastguard Worker  print('Time\tCommit')
28*5c90c05cSAndroid Build Coastguard Worker  for commit in commits:
29*5c90c05cSAndroid Build Coastguard Worker    check_call(['git', '-c', 'advice.detachedHead=false', 'checkout', commit],
30*5c90c05cSAndroid Build Coastguard Worker               cwd=repo_dir)
31*5c90c05cSAndroid Build Coastguard Worker    returncode = run(
32*5c90c05cSAndroid Build Coastguard Worker      ['c++', '-std=c++11', '-O3', '-DNDEBUG', '-I', 'include',
33*5c90c05cSAndroid Build Coastguard Worker       'src/format.cc', os.path.join(cwd, source)], cwd=repo_dir).returncode
34*5c90c05cSAndroid Build Coastguard Worker    if returncode != 0:
35*5c90c05cSAndroid Build Coastguard Worker      continue
36*5c90c05cSAndroid Build Coastguard Worker    times = []
37*5c90c05cSAndroid Build Coastguard Worker    for i in range(5):
38*5c90c05cSAndroid Build Coastguard Worker      output = check_output([os.path.join(repo_dir, 'a.out')], text=True)
39*5c90c05cSAndroid Build Coastguard Worker      times.append(float(output))
40*5c90c05cSAndroid Build Coastguard Worker    message = check_output(['git', 'log', '-1', '--pretty=format:%s', commit],
41*5c90c05cSAndroid Build Coastguard Worker                           cwd=repo_dir, text=True)
42*5c90c05cSAndroid Build Coastguard Worker    print(f'{min(times)}\t{commit} {message[:40]}')
43*5c90c05cSAndroid Build Coastguard Worker    sys.stdout.flush()
44