18 lines
1.9 KiB
Python
18 lines
1.9 KiB
Python
from pathlib import Path
|
|
import json,hashlib,os
|
|
r=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');e=r/'docs/plans/original-completion-2026-10-02/execution/p18-01-resume-20261015';b=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/.runtime/P18-01-CODE/build');a=b/'p18-relationship-evidence';h=b/'p18-relationship-evidence-historical-265ce30-r06';m=b/'p18-merged-native-evidence-265ce30-r01';pre=json.loads((e/'CURRENT_MAIN_265_REUSE_PREFLIGHT_R02.json').read_text());assert pre['all_preliminary_checks_passed'] and a.is_dir() and m.is_dir() and not h.exists()
|
|
def inventory(root):
|
|
rows=[]
|
|
for p in sorted(root.rglob('*')):
|
|
assert not p.is_symlink();s=p.stat();row={'path':str(p.relative_to(root)),'type':'directory' if p.is_dir() else 'file','mode':s.st_mode&0o777,'mtime_ns':s.st_mtime_ns}
|
|
if p.is_file():
|
|
with p.open('rb') as f:row.update(bytes=s.st_size,sha256=hashlib.file_digest(f,'sha256').hexdigest())
|
|
rows.append(row)
|
|
return rows
|
|
def digest(rows):return hashlib.sha256(json.dumps(rows,sort_keys=True,separators=(',',':')).encode()).hexdigest()
|
|
old=inventory(a);merged=inventory(m);a.rename(h)
|
|
try:m.rename(a)
|
|
except BaseException:h.rename(a);raise
|
|
assert inventory(h)==old and inventory(a)==merged
|
|
record={'submitted':pre['submitted'],'current_main_base_at_applicability':pre['main_base'],'composition_tree':pre['composition_tree'],'historical_frozen_preserved':str(h),'registered_canonical_now':str(a),'former_merged_path':str(m),'old_members':len(old),'merged_members':len(merged),'old_aggregate_before_and_after':digest(old),'merged_aggregate_before_and_after':digest(merged),'all_bytes_modes_mtimes_preserved':True,'raw_receipts_rewritten':False,'native_runs':0,'ordinary_verifier_pending':True,'formal_original_credit':0};(e/'PRESERVED_265_MERGED_PROOF_PROMOTION_R02.json').write_text(json.dumps(record,indent=2)+'\n');print(json.dumps(record))
|