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