-
Notifications
You must be signed in to change notification settings - Fork 1
/
missing_coverage.py
114 lines (94 loc) · 3.78 KB
/
missing_coverage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import json
import sys
from argparse import ArgumentParser
def skipfile(file, startswith, endswith, patterns):
for text in startswith:
if file.startswith(text):
return True
for text in endswith:
if file.endswith(text):
return True
for text in patterns:
try:
if file.index(text) >= 0:
return True
except:
pass
return False
def main(args=sys.argv[1:]):
parser = ArgumentParser()
parser.add_argument('--json', required=True,
help="json map of coverage jobs.")
parser.add_argument('--changesets', required=True,
help="json of hg changesets + files changed.")
args = parser.parse_args(args)
with open(args.json, 'r') as f:
coverage_map = json.load(f)
with open(args.changesets, 'r') as f:
changesets = json.load(f)
all_missing = []
for rev in changesets:
missing = []
matched = 0
total_files = 0
for file in changesets[rev]:
total_files += 1
# Known lack of coverage
startswith = ['servo', 'mobile', 'third_party']
endswith = ['.java', '.rs', '.mm', '.nsi', '.nsh']
if skipfile(file, startswith, endswith, []):
continue
# Typically testing
startswith = ['testing', 'taskcluster']
endswith = ['.ini', '.list', '.html', '.xul', '.py', '.yml']
pattern = ['test']
if skipfile(file, startswith, endswith, pattern):
continue
# build/tooling
startswith = ['build', 'config']
endswith = ['.build', '.mozbuild', '.mn', '.rdf', '.rdf.in', '.mk',
'.dep', '.lock', '.sh', '.conf', 'package-manifest.in', 'MacOS-files.in']
pattern = ['configure', 'akefile', 'mozconfig']
if skipfile(file, startswith, endswith, pattern):
continue
# Extra files
startswith = ['build', 'config']
endswith = ['.css', '.svg', '.xml', '.xhtml', '.ico', '.jpg', '.png',
'.bmp', '.properties', '.dtd', '.mozilla', '.json', '.inc',
'.manifest', '.errors', '.yaml', '.rst', '.dic', '.glsl',
'.toml', '.d', 'TAG-INFO', '.idl', '.webidl', '.ipdl']
pattern = ['README']
if skipfile(file, startswith, endswith, pattern):
continue
# Missing from coverage for right now
startswith = []
endswith = ['.js', '.jsm']
pattern = []
# if skipfile(file, startswith, endswith, pattern):
# continue
# hacking out for current dataset:
startswith = []
endswith = []
pattern = ['gfx/harfbuzz', 'netwerk/streamconv/converters/parse-ftp']
if skipfile(file, startswith, endswith, pattern):
continue
# files we detect, use this to get ideas of patterns of other file types to reduce noise
startswith = []
endswith = ['.cpp', '.h', '.cc']
pattern = []
if skipfile(file, startswith, endswith, pattern):
continue
if file not in coverage_map:
missing.append(file)
if file not in all_missing:
all_missing.append(file)
else:
matched += 1
if missing:
print "%s: %s, %s" % (rev, matched, missing)
elif matched > 0 and matched != total_files:
print "%s: %s/%s" % (rev, matched, total_files)
all_missing.sort()
print len(all_missing)
if __name__ == "__main__":
main()