31 lines
1.3 KiB
Python
Executable File
31 lines
1.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Compare complete independently restored builds; retain mismatches as evidence."""
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
from release_artifacts import compare
|
|
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument('first', type=Path)
|
|
parser.add_argument('second', type=Path)
|
|
parser.add_argument('--report', required=True, type=Path)
|
|
args = parser.parse_args()
|
|
try:
|
|
if args.first.resolve() == args.second.resolve():
|
|
raise ValueError('Specify two independently restored build trees')
|
|
if args.report.exists() or args.report.is_symlink():
|
|
raise ValueError('Report output already exists')
|
|
report = compare(args.first, args.second)
|
|
with args.report.open('x') as stream:
|
|
stream.write(json.dumps(report, indent=2) + '\n')
|
|
for item in report['artifacts']:
|
|
print(('PASS' if item['identical'] else 'MISMATCH') + ': ' + item['name'])
|
|
if report['status'] != 'passed':
|
|
raise ValueError(f'Builds differ; inspect {args.report}')
|
|
print(f'PASS: all {len(report["artifacts"])} artifacts are byte-identical: {args.report}')
|
|
print('NOTE: this comparison establishes matching bytes; retain each isolated build log as execution evidence')
|
|
except (OSError, ValueError, KeyError) as error:
|
|
sys.exit(f'ERROR: {error}')
|