Index: tools/isolate/trace_inputs.py |
diff --git a/tools/isolate/trace_inputs.py b/tools/isolate/trace_inputs.py |
index 97a3928a1fe0c580906e35a209507aa277bcbbb9..587079b783e265a468f70b11645602c25faccc71 100755 |
--- a/tools/isolate/trace_inputs.py |
+++ b/tools/isolate/trace_inputs.py |
@@ -42,7 +42,7 @@ class Strace(object): |
@staticmethod |
def gen_trace(cmd, cwd, logname): |
"""Runs strace on an executable.""" |
- silent = not isEnabledFor(logging.DEBUG) |
+ silent = not isEnabledFor(logging.INFO) |
stdout = stderr = None |
if silent: |
stdout = subprocess.PIPE |
@@ -55,8 +55,10 @@ class Strace(object): |
if p.returncode != 0: |
print 'Failure: %d' % p.returncode |
# pylint: disable=E1103 |
- print ''.join(out.splitlines(True)[-100:]) |
- print ''.join(err.splitlines(True)[-100:]) |
+ if out: |
+ print ''.join(out.splitlines(True)[-100:]) |
+ if err: |
+ print ''.join(err.splitlines(True)[-100:]) |
return p.returncode |
@staticmethod |
@@ -156,7 +158,7 @@ class Dtrace(object): |
@classmethod |
def gen_trace(cls, cmd, cwd, logname): |
"""Runs dtrace on an executable.""" |
- silent = not isEnabledFor(logging.DEBUG) |
+ silent = not isEnabledFor(logging.INFO) |
print 'Running: %s' % cmd |
signal = 'Go!' |
logging.debug('Our pid: %d' % os.getpid()) |
@@ -286,11 +288,15 @@ def extract_directories(files, root): |
return sorted(files) |
-def trace_inputs(log, cmd, api): |
+def trace_inputs(log, cmd, api, gyp_proj_dir, product_dir): |
"""Tries to load the logs if available. If not, trace the test.""" |
+ def print_if(txt): |
+ if not gyp_proj_dir: |
+ print(txt) |
+ |
logname = os.path.join(BASE_DIR, os.path.basename(log)) |
if not os.path.isfile(logname): |
- print 'Tracing... %s' % cmd |
+ print_if('Tracing... %s' % cmd) |
returncode = api.gen_trace(cmd, ROOT_DIR, logname) |
if returncode: |
return returncode |
@@ -299,24 +305,48 @@ def trace_inputs(log, cmd, api): |
"""Strips ignored paths.""" |
return f.startswith(api.IGNORED) or f.endswith('.pyc') |
- print 'Loading traces... %s' % logname |
+ print_if('Loading traces... %s' % logname) |
files, non_existent = api.parse_log(logname, blacklist) |
- print('Total: %d' % len(files)) |
- print('Non existent: %d' % len(non_existent)) |
+ |
+ print_if('Total: %d' % len(files)) |
+ print_if('Non existent: %d' % len(non_existent)) |
for f in non_existent: |
- print(' %s' % f) |
+ print_if(' %s' % f) |
expected, unexpected = relevant_files(files, ROOT_DIR + '/') |
if unexpected: |
- print('Unexpected: %d' % len(unexpected)) |
+ print_if('Unexpected: %d' % len(unexpected)) |
for f in unexpected: |
- print(' %s' % f) |
+ print_if(' %s' % f) |
simplified = extract_directories(expected, ROOT_DIR) |
- print('Interesting: %d reduced to %d' % (len(expected), len(simplified))) |
+ print_if('Interesting: %d reduced to %d' % (len(expected), len(simplified))) |
for f in simplified: |
- print(' %s' % f) |
- |
+ print_if(' %s' % f) |
+ |
+ if gyp_proj_dir: |
+ def fix(f): |
+ if f.startswith(product_dir): |
+ return '<(PRODUCT_DIR)%s' % f[len(product_dir):] |
+ elif f.startswith(gyp_proj_dir): |
+ return f[len(gyp_proj_dir)+1:] |
+ else: |
+ return '<(DEPTH)/%s' % f |
+ corrected = [fix(f) for f in simplified] |
+ files = [f for f in corrected if not f.endswith('/')] |
+ dirs = [f for f in corrected if f.endswith('/')] |
+ # Constructs the python code manually. |
+ print( |
+ '{\n' |
+ ' \'variables\': {\n' |
+ ' \'isolate_files\': [\n') + ( |
+ ''.join(' \'%s\',\n' % f for f in files)) + ( |
+ ' ],\n' |
+ ' \'isolate_dirs\': [\n') + ( |
+ ''.join(' \'%s\',\n' % f for f in dirs)) + ( |
+ ' ],\n' |
+ ' },\n' |
+ '},') |
return 0 |
@@ -327,6 +357,14 @@ def main(): |
parser.add_option( |
'-v', '--verbose', action='count', default=0, help='Use multiple times') |
parser.add_option('-l', '--log', help='Log file') |
+ parser.add_option( |
+ '-g', '--gyp', |
+ help='When specified, outputs the inputs files in a way compatible for ' |
+ 'gyp processing. Should be set to the relative path containing the ' |
+ 'gyp file, e.g. \'chrome\' or \'net\'') |
+ parser.add_option( |
+ '-p', '--product-dir', default='out/Release', |
+ help='Directory for PRODUCT_DIR') |
options, args = parser.parse_args() |
level = [logging.ERROR, logging.INFO, logging.DEBUG][min(2, options.verbose)] |
@@ -347,7 +385,7 @@ def main(): |
print >> sys.stderr, 'Unsupported platform' |
return 1 |
- return trace_inputs(options.log, args, api) |
+ return trace_inputs(options.log, args, api, options.gyp, options.product_dir) |
if __name__ == '__main__': |