33 lines
1.6 KiB
Python
33 lines
1.6 KiB
Python
"""Reconstruct this frozen consumer directly from verified public archives."""
|
|
from pathlib import Path
|
|
import argparse
|
|
import hashlib
|
|
import json
|
|
import subprocess
|
|
import tarfile
|
|
|
|
HERE = Path(__file__).resolve().parent
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--inputs', type=Path, required=True)
|
|
parser.add_argument('--workspace', type=Path, required=True)
|
|
args = parser.parse_args()
|
|
work = args.workspace.resolve()
|
|
assert work.is_relative_to('/tmp') and not work.exists()
|
|
manifest = json.loads((HERE / 'composed-source-inventory.json').read_text())
|
|
patch = (HERE / 'composed-forgejo-source.patch').read_bytes()
|
|
assert hashlib.sha256(patch).hexdigest() == manifest['patch_sha256']
|
|
archives = [('forgejo-v11.0.3.tar.gz', manifest['archive_sha256']),
|
|
('go1.24.3.tar.gz', '3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8')]
|
|
for name, digest in archives:
|
|
assert hashlib.sha256((args.inputs / name).read_bytes()).hexdigest() == digest
|
|
work.mkdir()
|
|
for name, _ in archives:
|
|
with tarfile.open(args.inputs / name) as tar:
|
|
tar.extractall(work, filter='data')
|
|
(work / 'forgejo').rename(work / 'source')
|
|
run = subprocess.run(['patch', '--fuzz=0', '-p1'], input=patch, cwd=work / 'source', capture_output=True)
|
|
assert run.returncode == 0, 'Pinned composite patch refused; workspace retained'
|
|
for row in manifest['files']:
|
|
assert hashlib.sha256((work / 'source' / row['path']).read_bytes()).hexdigest() == row['after_sha256'], row['path']
|
|
(work / 'home').mkdir()
|
|
print(json.dumps({'status': 'prepared', 'workspace': str(work), 'paths_verified': len(manifest['files']), 'native_changes': False}))
|