1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00
samba-mirror/script/compare_cc_results.py
Noel Power 0e35d74193 script: Fix failing build_xc job
build_xc job uses compare_cc_results.py to compare cache
files, the cache files are stringified hash maps, the results
in python 3.4 don't compare well due to inconsistent order of
dict key/value pairs when the cache files are created. While
comparing the file contents works fine in python3.6 it fails
with python3.4. This patch detects problematic dict lines and
rewrites the value for comparison

Signed-off-by: Noel Power <noel.power@suse.com>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
2018-12-10 10:38:25 +01:00

67 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python
#
# Compare the results of native and cross-compiled configure tests
#
from __future__ import print_function
import sys
import difflib
exceptions = [
'BUILD_DIRECTORY', 'SELFTEST_PREFIX', 'defines',
'CROSS_COMPILE', 'CROSS_ANSWERS', 'CROSS_EXECUTE',
'LIBSOCKET_WRAPPER_SO_PATH',
'LIBNSS_WRAPPER_SO_PATH',
'LIBPAM_WRAPPER_SO_PATH',
'PAM_SET_ITEMS_SO_PATH',
'LIBUID_WRAPPER_SO_PATH',
'LIBRESOLV_WRAPPER_SO_PATH',
]
base_lines = list()
base_fname = ''
found_diff = False
for fname in sys.argv[1:]:
lines = list()
f = open(fname, 'r')
for line in f:
if line.startswith("cfg_files ="):
# waf writes configuration files as absolute paths
continue
if len(line.split('=', 1)) == 2:
key = line.split('=', 1)[0].strip()
value = line.split('=', 1)[1].strip()
if key in exceptions:
continue
# using waf with python 3.4 seems to randomly sort dict keys
# we can't modify the waf code but we can fake a dict value
# string representation as if it were sorted. python 3.6.5
# doesn't seem to suffer from this behaviour
if value.startswith('{'):
import ast
amap = ast.literal_eval(value)
fakeline = ""
for k in sorted(amap.keys()):
if not len(fakeline) == 0:
fakeline = fakeline + ", "
fakeline = fakeline + '\'' + k + '\': \'' + amap[k] + '\''
line = key + ' = {' + fakeline + '}'
lines.append(line)
f.close()
if base_fname:
diff = list(difflib.unified_diff(base_lines, lines, base_fname, fname))
if diff:
print('configuration files %s and %s do not match' % (base_fname, fname))
for l in diff:
sys.stdout.write(l)
found_diff = True
else:
base_fname = fname
base_lines = lines
if found_diff:
sys.exit(1)