blob: bb4a175ae95293f614051f6f6ac0ebd98bffda56 [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 os
from perf_insights import corpus_driver
from perf_insights.mre import file_handle
def _GetFilesIn(basedir):
data_files = []
for dirpath, dirnames, filenames in os.walk(basedir, followlinks=True):
new_dirnames = [d for d in dirnames if not d.startswith('.')]
del dirnames[:]
dirnames += new_dirnames
for f in filenames:
if f.startswith('.'):
continue
if f == 'README.md':
continue
full_f = os.path.join(dirpath, f)
rel_f = os.path.relpath(full_f, basedir)
data_files.append(rel_f)
data_files.sort()
return data_files
def _GetTagsForRelPath(relpath):
# Tags.
sub_dir = os.path.dirname(relpath)
if len(sub_dir) == 0:
return []
parts = sub_dir.split(os.sep)
return [p for p in parts if len(p) > 0]
def _GetMetadataForFilename(base_directory, filename):
relpath = os.path.relpath(filename, base_directory)
tags = _GetTagsForRelPath(relpath)
metadata = {'tags': tags}
# TODO(nduca): Add modification time to metadata.
return metadata
def _DefaultUrlResover(abspath):
return 'file:///%s' % abspath
class LocalDirectoryCorpusDriver(corpus_driver.CorpusDriver):
def __init__(self, trace_directory, url_resolver=_DefaultUrlResover):
self.directory = trace_directory
self.url_resolver = url_resolver
@staticmethod
def CheckAndCreateInitArguments(parser, args):
trace_dir = os.path.abspath(os.path.expanduser(args.trace_directory))
if not os.path.exists(trace_dir):
parser.error('Trace directory does not exist')
return None
return {'trace_directory': trace_dir}
@staticmethod
def AddArguments(parser):
parser.add_argument(
'--trace_directory',
help='Local directory containing traces to process.')
def GetTraceHandlesMatchingQuery(self, query):
trace_handles = []
files = _GetFilesIn(self.directory)
for rel_filename in files:
filename = os.path.join(self.directory, rel_filename)
metadata = _GetMetadataForFilename(self.directory, filename)
if not query.Eval(metadata, len(trace_handles)):
continue
url = self.url_resolver(filename)
if url is None:
url = _DefaultUrlResover(filename)
th = file_handle.URLFileHandle(url, 'file://' + filename)
trace_handles.append(th)
return trace_handles