Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Unified Diff: tools/determinism/compare_build_artifacts.py

Issue 2278493002: Show detailed difference on unexpected difference. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/determinism/compare_build_artifacts.py
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py
index 57bb236e8541f0335cd3c06733820837e0998e78..87e55731906ff6f910d5c32e3dfbdc06243b6731 100755
--- a/tools/determinism/compare_build_artifacts.py
+++ b/tools/determinism/compare_build_artifacts.py
@@ -9,6 +9,8 @@ import difflib
import json
import optparse
import os
+import re
+import subprocess
import struct
import sys
import time
@@ -495,6 +497,46 @@ def compare_files(first_filepath, second_filepath):
return diff_binary(first_filepath, second_filepath, file_len)
+def get_deps(build_dir, target):
+ """Returns list of object files needed to build target."""
+ NODE_PATTERN = re.compile(r'label="([a-zA-Z0-9_\\/.-]+)"')
+ CHECK_EXTS = ('.o', '.obj')
+ try:
+ out = subprocess.check_output(['ninja', '-C', build_dir,
M-A Ruel 2016/08/24 18:47:27 There's a problem as the directory was renamed, so
Yoshisato Yanagisawa 2016/08/25 08:47:29 I have never seen absolute object file path names
M-A Ruel 2016/08/25 15:46:26 zforman@ worked on making this work on linux but t
Yoshisato Yanagisawa 2016/08/29 05:44:49 I checked the code seems to work on Win.
+ '-t', 'graph', target])
+ except subprocess.CalledProcessError as e:
+ print >> sys.stderr, 'error to get graph for %s: %s' % (target, e)
+ return []
+ files = []
+ for line in out.splitlines():
+ matched = NODE_PATTERN.search(line)
+ if matched:
+ path = matched.group(1)
+ if not os.path.splitext(path)[1] in CHECK_EXTS:
+ continue
+ files.append(path)
+ return files
+
+
+def compare_deps(first_dir, second_dir, targets):
+ """Print difference of dependent files."""
+ for target in targets:
+ print 'Checking %s difference:' % target
+ first_deps = get_deps(first_dir, target)
+ second_deps = get_deps(second_dir, target)
+ deps = set(first_deps).union(set(second_deps))
M-A Ruel 2016/08/24 18:47:27 the difference should be empty ?
Yoshisato Yanagisawa 2016/08/25 08:47:29 I am not confident. However, I will simplify the
M-A Ruel 2016/08/25 15:46:26 I guess my question was more to print out the diff
Yoshisato Yanagisawa 2016/08/29 05:44:49 I think current code still help us to find this ki
+ for d in deps:
+ first_file = os.path.join(first_dir, d)
+ second_file = os.path.join(second_dir, d)
+ if not os.path.exists(first_file):
+ print '%s: not found' % first_file
+ continue
+ if not os.path.exists(second_file):
+ print '%s: not found' % second_file
+ continue
+ compare_files(first_file, second_file)
+
+
def compare_build_artifacts(first_dir, second_dir, target_platform,
recursive=False):
"""Compares the artifacts from two distinct builds."""
@@ -561,6 +603,11 @@ def compare_build_artifacts(first_dir, second_dir, target_platform,
for u in unexpected_equals:
print(' %s' % u)
+ if unexpected_diffs:
+ diffs_to_investigate = set(unexpected_diffs).difference(
+ set(missing_files))
+ compare_deps(first_dir, second_dir, diffs_to_investigate)
+
return int(bool(unexpected_diffs))
@@ -575,7 +622,7 @@ def main():
target = {
'darwin': 'mac', 'linux2': 'linux', 'win32': 'win'
}.get(sys.platform, sys.platform)
- parser.add_option('-t', '--target-platform', help='The target platform.'
+ parser.add_option('-t', '--target-platform', help='The target platform.',
default=target, choices=('android', 'mac', 'linux', 'win'))
options, _ = parser.parse_args()
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698