blob: 8a99fc8833735e8b41bfecb6d9221ceac2f9755d [file] [log] [blame]
Samuel Huang775b5512020-03-23 19:12:581#!/usr/bin/env python3
Avi Drissmandfd880852022-09-15 20:11:092# Copyright 2019 The Chromium Authors
Andrew Grieve0bbc6fa2019-07-10 16:14:393# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Prints the large commits given a .csv file from a telemetry size graph."""
7
8import argparse
9import re
10import subprocess
11
12
Andrew Grievefb8510092022-09-13 14:22:3913# Commit ranges where perf bot was giving invalid results.
14# Range objects implement __contains__ for fast "in" operators.
15_BAD_COMMIT_RANGES = [
16 range(1045024, 1045552), # https://crbug.com/1361952
17]
18
19
Andrew Grieve0bbc6fa2019-07-10 16:14:3920def _ReadCsv(path):
21 """Returns the contents of the .csv as a list of (int, int)."""
22 ret = []
23 with open(path) as f:
24 for line in f:
25 parts = line.rstrip().split(',')
26 if len(parts) == 2 and parts[0] != 'revision':
27 ret.append((int(parts[0]), int(float(parts[1]))))
28 return ret
29
30
31def _FindBigDeltas(revs_and_sizes, increase_threshold, decrease_threshold):
32 """Filters revs_and_sizes for entries that grow/shrink too much."""
33 big_jumps = []
Andrew Grieve4fde1a92022-03-23 17:34:5934 prev_rev, prev_size = revs_and_sizes[0]
Andrew Grieve0bbc6fa2019-07-10 16:14:3935 for rev, size in revs_and_sizes:
36 delta = size - prev_size
Andrew Grieve0bbc6fa2019-07-10 16:14:3937 if delta > increase_threshold or -delta > decrease_threshold:
Andrew Grieve4fde1a92022-03-23 17:34:5938 big_jumps.append((rev, delta, prev_rev))
39 prev_rev = rev
40 prev_size = size
Andrew Grieve0bbc6fa2019-07-10 16:14:3941 return big_jumps
42
43
44def _LookupCommitInfo(rev):
Andrew Grieveedcaf9f2020-04-08 16:05:4745 sha1 = subprocess.check_output(
46 ['git', 'crrev-parse', str(rev)], encoding="utf-8").strip()
Andrew Grievee93ed6f2022-06-30 02:18:4247 if not sha1:
48 raise Exception(f'git crrev-parse for {rev} failed. Probably need to '
49 f'"git fetch origin main"')
Andrew Grieveedcaf9f2020-04-08 16:05:4750 desc = subprocess.check_output(['git', 'log', '-n1', sha1], encoding="utf-8")
Andrew Grieve0bbc6fa2019-07-10 16:14:3951 author = re.search(r'Author: .*?<(.*?)>', desc).group(1)
52 day, year = re.search(r'Date:\s+\w+\s+(\w+ \d+)\s+.*?\s+(\d+)', desc).groups()
53 date = '{} {}'.format(day, year)
54 title = re.search(r'\n +(\S.*)', desc).group(1).replace('\t', ' ')
Andrew Grieve2ca52f52023-07-07 05:16:5955 return sha1, author, date, title
Andrew Grieve0bbc6fa2019-07-10 16:14:3956
57
58def main():
59 parser = argparse.ArgumentParser()
60 parser.add_argument(
61 '--increase-threshold',
62 type=int,
Andrew Grieve4fde1a92022-03-23 17:34:5963 default=30 * 1024,
Andrew Grieve0bbc6fa2019-07-10 16:14:3964 help='Minimum number of bytes larger to be considered a notable.')
65 parser.add_argument(
66 '--decrease-threshold',
67 type=int,
68 default=30 * 1024,
69 help='Minimum number of bytes smaller to be considered a notable.')
70 parser.add_argument(
71 'points_csv', help='Input .csv file with columns: revision,value')
72 options = parser.parse_args()
73
74 revs_and_sizes = _ReadCsv(options.points_csv)
Andrew Grieve4fde1a92022-03-23 17:34:5975 big_deltas = _FindBigDeltas(revs_and_sizes, options.increase_threshold,
76 options.decrease_threshold)
Andrew Grieve0bbc6fa2019-07-10 16:14:3977
Raul Tambre57e09d62019-09-22 17:18:5278 print('Printing info for up to {} commits in the range {}-{}'.format(
Andrew Grieve4fde1a92022-03-23 17:34:5979 len(big_deltas), revs_and_sizes[0][0], revs_and_sizes[-1][0]))
Andrew Grieve2ca52f52023-07-07 05:16:5980 print('Revision,Hash,Title,Author,Delta,Date')
Andrew Grievefb8510092022-09-13 14:22:3981 num_bad_commits = 0
Andrew Grieve4fde1a92022-03-23 17:34:5982 for rev, delta, prev_rev in big_deltas:
Andrew Grievefb8510092022-09-13 14:22:3983 if any(rev in r for r in _BAD_COMMIT_RANGES):
84 num_bad_commits += 1
85 continue
Andrew Grieve2ca52f52023-07-07 05:16:5986 sha1, author, date, title = _LookupCommitInfo(rev)
Andrew Grieve4fde1a92022-03-23 17:34:5987 rev_str = str(rev)
88 if rev - prev_rev > 1:
89 rev_str = f'{prev_rev}..{rev}'
Andrew Grieve2ca52f52023-07-07 05:16:5990 print('\t'.join([rev_str, sha1, title, author, str(delta), date]))
Andrew Grieve0bbc6fa2019-07-10 16:14:3991
Andrew Grievefb8510092022-09-13 14:22:3992 if num_bad_commits:
93 print(f'Ignored {num_bad_commits} commits from bad ranges')
94
Andrew Grieve0bbc6fa2019-07-10 16:14:3995
96if __name__ == '__main__':
97 main()