This will allow for a faster flow then downloading manually. Though it will require user to supply a github token.
79 lines
3.2 KiB
Python
79 lines
3.2 KiB
Python
import glob
|
|
import os
|
|
import sys
|
|
import pprint
|
|
import json
|
|
|
|
from utils import execute, ArgParseImpl, important_print, mkdir_p
|
|
from image_diff import same_image, output_image_diff
|
|
from results import RESULT_OK, RESULT_FAILED, RESULT_MISSING
|
|
|
|
def _compare_goldens(base_dir, comparison_dir, out_dir=None):
|
|
all_files = glob.glob(os.path.join(base_dir, "./**/*.tif"), recursive=True)
|
|
test_dirs = set(os.path.abspath(os.path.dirname(f)).replace(os.path.abspath(base_dir) + '/', '') \
|
|
for f in all_files)
|
|
all_results = []
|
|
for test_dir in test_dirs:
|
|
results = []
|
|
output_test_dir = None if not out_dir else os.path.abspath(os.path.join(out_dir, test_dir))
|
|
if output_test_dir:
|
|
mkdir_p(output_test_dir)
|
|
base_test_dir = os.path.abspath(os.path.join(base_dir, test_dir))
|
|
comp_test_dir = os.path.abspath(os.path.join(comparison_dir, test_dir))
|
|
for golden_file in \
|
|
glob.glob(os.path.join(base_test_dir, "*.tif")):
|
|
base_fname = os.path.abspath(golden_file)
|
|
test_case = base_fname.replace(f'{base_test_dir}/', '')
|
|
comp_fname = os.path.join(comp_test_dir, test_case)
|
|
result = {
|
|
'name': test_case,
|
|
}
|
|
if not os.path.exists(comp_fname):
|
|
print(f'file name not found: {comp_fname}')
|
|
result['result'] = RESULT_MISSING
|
|
elif not same_image(base_fname, comp_fname):
|
|
result['result'] = RESULT_FAILED
|
|
if output_test_dir:
|
|
# just the file name
|
|
diff_fname = f"{test_case.replace('.tif', '_diff.tif')}"
|
|
output_image_diff(base_fname, comp_fname, os.path.join(output_test_dir, diff_fname))
|
|
result['diff'] = diff_fname
|
|
else:
|
|
result['result'] = RESULT_OK
|
|
results.append(result)
|
|
if output_test_dir:
|
|
output_fname = os.path.join(output_test_dir, "compare_results.json")
|
|
results_meta = {
|
|
'results': results,
|
|
'base_dir': os.path.relpath(output_fname, base_test_dir),
|
|
'comparison_dir': os.path.relpath(output_fname, comp_test_dir),
|
|
}
|
|
with open(output_fname, 'w') as f:
|
|
f.write(json.dumps(results_meta, indent=2))
|
|
important_print(f'Written comparison results for {test_dir} to \n {output_fname}')
|
|
all_results += results
|
|
return all_results
|
|
|
|
if __name__ == '__main__':
|
|
parser = ArgParseImpl()
|
|
parser.add_argument('--src', help='Directory of the base of the diff.', required=True)
|
|
parser.add_argument('--dest', help='Directory of the comparison of the diff.')
|
|
parser.add_argument('--out', help='Directory of output for the result of the diff.')
|
|
|
|
args, _ = parser.parse_known_args(sys.argv[1:])
|
|
|
|
dest = args.dest
|
|
if not dest:
|
|
print('Assume the default renderdiff output folder')
|
|
dest = os.path.join(os.getcwd(), './out/renderdiff')
|
|
assert os.path.exists(dest), f"Destination folder={dest} does not exist."
|
|
|
|
results = _compare_goldens(args.src, dest, out_dir=args.out)
|
|
|
|
failed = [f" {k['name']}" for k in results if k['result'] != RESULT_OK]
|
|
success_count = len(results) - len(failed)
|
|
important_print(f'Successfully compared {success_count} / {len(results)} images' +
|
|
('\nFailed:\n' + ('\n'.join(failed)) if len(failed) > 0 else ''))
|
|
if len(failed) > 0:
|
|
exit(1)
|