Files
TheTree_mock/docs/plans/original-completion-2026-10-02/execution/drive-offload-cold-r06-20261015/tree-offload-cold-r06.py
T

42 lines
3.4 KiB
Python

from pathlib import Path
import os,json,hashlib,tarfile,io,shutil,time,subprocess,sqlite3
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');B=R/'artifacts/original-completion-2026-10-02';D=R/'docs/plans/original-completion-2026-10-02/execution/drive-offload-cold-r06-20261015';T=Path('/private/tmp/tree-offload-cold-r06')
roots=['p23-03-native-os-49445d4-r13','p08-runtime-preview-8d52b20-target-r02/stage','p08-runtime-preview-78dc82d-targeted-r01/stage','p08-runtime-preview-12f04d6-target-impact-r03/stage']
def sha(p):
h=hashlib.sha256()
with p.open('rb')as f:
for b in iter(lambda:f.read(1024**2),b''):h.update(b)
return h.hexdigest()
def save(p,v):p.write_text(json.dumps(v,ensure_ascii=False,indent=2)+'\n')
def idle():
ps=subprocess.check_output(['ps','-axo','pid,command'],text=True);opened=subprocess.run(['lsof','-n','-F','n'],capture_output=True,text=True).stdout
for s in roots:
assert not any(str(B/s)in x for x in ps.splitlines());assert not any(x.startswith('n'+str(B/s)+'/')for x in opened.splitlines());assert not subprocess.check_output(['git','-C',str(R),'ls-files','--',str(B/s)],text=True).strip()
def inv():
rows=[]
for s in roots:
p=B/s;assert p.is_dir()and not p.is_symlink()
for x in [p]+sorted(p.rglob('*')):
st=x.lstat();assert not x.is_symlink()and(x.is_file()or x.is_dir()),str(x);v=dict(path=str(x.relative_to(B)),type='file'if x.is_file()else'directory',mode=st.st_mode&0o7777,mtime_ns=st.st_mtime_ns)
if x.is_file():v.update(bytes=st.st_size,sha256=sha(x),allocated=st.st_blocks*512)
rows.append(v)
return rows
if __name__=='__main__':
assert not D.exists()and not T.exists();D.mkdir();T.mkdir();idle();free=shutil.disk_usage(R).free;rows=inv();objs={x['sha256']:x for x in rows if x['type']=='file'};m=dict(base=str(B),roots=roots,members=rows,files=sum(x['type']=='file'for x in rows),logical_bytes=sum(x.get('bytes',0)for x in rows),unique_bytes=sum(x['bytes']for x in objs.values()),free_before=free,created=time.time(),scope='Superseded P23 49445d4 r13 diagnostic including its failed original12 observations, plus three older P08 runtime-preview stage copies; P23 held9a26 and P08 currentd369 and all P18 sources/proofs retained; no acceptance change',formal_credit=0);save(D/'MANIFEST.json',m);assert free>m['unique_bytes']+512*1024**2
a=T/'cold-r06.tar.gz'
with tarfile.open(a,'w:gz',compresslevel=6)as t:
for h,x in sorted(objs.items()):
assert shutil.disk_usage(R).free>1024**3;t.add(B/x['path'],arcname='objects/'+h,recursive=False)
v=(D/'MANIFEST.json').read_bytes();e=tarfile.TarInfo('MANIFEST.json');e.size=len(v);t.addfile(e,io.BytesIO(v))
seen=set()
with tarfile.open(a,'r|gz')as t:
for e in t:
assert e.isfile()and e.name not in seen;seen.add(e.name)
with t.extractfile(e)as f:
if e.name=='MANIFEST.json':assert f.read()==(D/'MANIFEST.json').read_bytes()
else:
h=e.name[8:];assert e.name.startswith('objects/')and h in objs and e.size==objs[h]['bytes'];v=hashlib.sha256()
for b in iter(lambda:f.read(1024**2),b''):v.update(b)
assert v.hexdigest()==h
assert seen=={'MANIFEST.json'}|{'objects/'+h for h in objs};save(D/'PREPARED.json',dict(archive=str(a),bytes=a.stat().st_size,sha256=sha(a),all_members_verified=True,unique_payloads=len(objs)));print(json.dumps(dict(files=m['files'],logical_bytes=m['logical_bytes'],unique_bytes=m['unique_bytes'],archive_bytes=a.stat().st_size)),flush=True)