blob: 47400d9181e13c7b2ae688fda1177c43dca68ca0 [file] [log] [blame]
#!/usr/bin/python
import json
import optparse
import os
import sys
from webkitpy.common.host import Host
def main(argv):
parser = optparse.OptionParser(usage='%prog [times_ms.json]')
parser.add_option('-f', '--forward', action='store', type='int',
help='group times by first N directories of test')
parser.add_option('-b', '--backward', action='store', type='int',
help='group times by last N directories of test')
epilog = """
You can print out aggregate times per directory using the -f and -b
flags. The value passed to each flag indicates the "depth" of the flag,
similar to positive and negative arguments to python arrays.
For example, given fast/forms/week/week-input-type.html, -f 1
truncates to 'fast', -f 2 and -b 2 truncates to 'fast/forms', and -b 1
truncates to fast/forms/week . -f 0 truncates to '', which can be used
to produce a single total time for the run."""
parser.epilog = '\n'.join(s.lstrip() for s in epilog.splitlines())
options, args = parser.parse_args(argv)
host = Host()
if args and args[0]:
times_ms_path = args[0]
else:
times_ms_path = host.filesystem.join(host.port_factory.get().results_directory(), 'times_ms.json')
with open(times_ms_path, 'r') as fp:
times_trie = json.load(fp)
times = convert_trie_to_flat_paths(times_trie)
def key_for(path):
if options.forward is not None:
return os.sep.join(path.split(os.sep)[:-1][:options.forward])
if options.backward is not None:
return os.sep.join(path.split(os.sep)[:-options.backward])
return path
times_by_key = {}
for test_name in times:
key = key_for(test_name)
if key in times_by_key:
times_by_key[key] += times[test_name]
else:
times_by_key[key] = times[test_name]
for key in sorted(times_by_key):
print "%s %d" % (key, times_by_key[key])
def convert_trie_to_flat_paths(trie, prefix=None):
# Cloned from webkitpy.layout_tests.layout_package.json_results_generator
# so that this code can stand alone.
result = {}
for name, data in trie.iteritems():
if prefix:
name = prefix + "/" + name
if isinstance(data, int):
result[name] = data
else:
result.update(convert_trie_to_flat_paths(data, name))
return result
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))