blob: 374c92055f6a95281fb5c943ccea04c873fad2e5 [file] [log] [blame]
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import sys
import traceback
import perf_insights
from perf_insights import local_directory_corpus_driver
from perf_insights import get_trace_handles_query
from perf_insights import map_single_trace
from perf_insights import json_map_results
def Main(args):
parser = argparse.ArgumentParser(
description='Local bulk trace processing')
parser.add_argument('trace_directory')
parser.add_argument('corpus_query_string')
parser.add_argument('map_file')
parser.add_argument('-o', '--output-file')
parser.add_argument('-s', '--stop-on-error',
action='store_true')
args = parser.parse_args(args)
if not os.path.exists(args.trace_directory):
args.error('trace_directory does not exist')
if not os.path.exists(args.map_file):
args.error('map does not exist')
corpus_driver = local_directory_corpus_driver.LocalDirectoryCorpusDriver(
os.path.abspath(os.path.expanduser(args.trace_directory)))
query = get_trace_handles_query.GetTraceHandlesQuery.FromString(
args.corpus_query_string)
if args.output_file:
ofile = open(args.output_file, 'w')
else:
ofile = sys.stdout
map_results = json_map_results.JSONMapResults(ofile)
try:
_Run(map_results, corpus_driver, query, args.map_file,
stop_on_error=args.stop_on_error)
finally:
if ofile != sys.stdout:
ofile.close()
if map_results.had_failures:
return 255
return 0
def _Run(map_results, corpus_driver, query, map_file,
stop_on_error=False):
trace_handles = corpus_driver.GetTraceHandlesMatchingQuery(query)
map_results.WillMapTraces()
failure_to_dump = None
for trace_handle in trace_handles:
map_results.WillMapSingleTrace(trace_handle)
result_value = map_single_trace.MapSingleTrace(
trace_handle,
os.path.abspath(map_file))
map_results.DidMapSingleTrace(trace_handle, result_value)
if stop_on_error and result_value['type'] == 'failure':
failure_to_dump = (trace_handle, result_value)
break
map_results.DidMapTraces()
if failure_to_dump:
sys.stderr.write('\n\nWhile mapping %s:\n' %
failure_to_dump[0].run_info.display_name)
sys.stderr.write(failure_to_dump[1]['stack_str'])
sys.stderr.write('\n')