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

Unified Diff: scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py

Issue 695123002: Add specialized .isolated differ that prints unified diff. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 6 years, 1 month 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: scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
diff --git a/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py b/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
old mode 100644
new mode 100755
index 298797ff72665b5d5f6a57b10ef37f77b59dd3e2..3fd28b1b2722b9a0897b98c787d0c5c5544b777c
--- a/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
+++ b/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
@@ -2,8 +2,10 @@
# Copyright 2014 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.
+
"""Compare the artifacts from two builds."""
+import difflib
import json
import optparse
import os
@@ -33,14 +35,15 @@ def get_files_to_compare(build_dir):
def compare_files(first_filepath, second_filepath):
- """Compare two binaries and return the number of differences between them.
+ """Compares two binaries and return the number of differences between them.
- Returns -1 if the files have a different size.
+ Returns None if the files are equal, a string otherwise.
"""
- if os.stat(first_filepath).st_size != os.stat(second_filepath).st_size:
- return -1
+ file_len = os.stat(first_filepath).st_size
+ if file_len != os.stat(second_filepath).st_size:
+ return 'different size: %d != %d' % (
+ file_len, os.stat(second_filepath).st_size)
- # Read the files by chunks of 1MB.
chunk_size = 1024 * 1024
diffs = 0
with open(first_filepath, 'rb') as lhs:
@@ -51,8 +54,27 @@ def compare_files(first_filepath, second_filepath):
if not lhs_data:
break
diffs += sum(l != r for l, r in zip(lhs_data, rhs_data))
+ if not diffs:
+ return None
+
+ result = '%d out of %d bytes are different (%.2f%%)' % (
+ diffs, file_len, 100.0 * diffs / file_len)
+
+ if diffs and first_filepath.endswith('.isolated'):
+ # Unpack the files.
+ with open(first_filepath, 'rb') as f:
+ lhs = json.dumps(
+ json.load(f), indent=2, sort_keys=True,
+ separators=(',', ': ')).splitlines()
+ with open(second_filepath, 'rb') as f:
+ rhs = json.dumps(
+ json.load(f), indent=2, sort_keys=True,
+ separators=(',', ': ')).splitlines()
- return diffs
+ result += '\n' + '\n'.join(
+ line for line in difflib.unified_diff(lhs, rhs)
+ if not line.startswith(('---', '+++')))
+ return result
def compare_build_artifacts(first_dir, second_dir):
@@ -81,19 +103,11 @@ def compare_build_artifacts(first_dir, second_dir):
for f in sorted(first_list & second_list):
first_file = os.path.join(first_dir, f)
second_file = os.path.join(second_dir, f)
- files_diffs = compare_files(first_file, second_file)
- if not files_diffs:
+ result = compare_files(first_file, second_file)
+ if not result:
result = 'equal'
else:
- file_len = os.stat(first_file).st_size
- difference = ''
- if files_diffs == -1:
- difference = 'different size: %d != %d' % (file_len,
- os.stat(second_file).st_size)
- else:
- difference = '%d out of %d bytes are different (%.2f%%)' % (
- files_diffs, file_len, 100.0 * files_diffs / file_len)
- result = 'DIFFERENT: %s' % difference
+ result = 'DIFFERENT: %s' % result
res += 1
print('%-*s: %s' % (max_filepath_len, f, result))
@@ -105,8 +119,10 @@ def compare_build_artifacts(first_dir, second_dir):
def main():
parser = optparse.OptionParser(usage='%prog [options]')
- parser.add_option('--first-build-dir', help='The first build directory.')
- parser.add_option('--second-build-dir', help='The second build directory.')
+ parser.add_option(
+ '-f', '--first-build-dir', help='The first build directory.')
+ parser.add_option(
+ '-s', '--second-build-dir', help='The second build directory.')
options, _ = parser.parse_args()
if not options.first_build_dir:
« 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