from pathlib import Path
import hashlib,json,shutil,re
R=Path('/mnt/data/work4110/site');E=R/'доказательства/редакция-4.11.0';I=Path('/mnt/data/work4110/inputs'); dest=E/'сохранённые-исходники'
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
current={}
for p in sorted(R.rglob('*')):
 if p.is_file() and p.suffix not in ['.zip','.pyc'] and p.relative_to(R).as_posix() not in ['МАНИФЕСТ-ВЫПУСКА.json','ПОДПИСЬ-МАНИФЕСТА.txt','ПУБЛИЧНЫЙ-КЛЮЧ.txt','СОСТАВ-ПАКЕТА.md','ЖУРНАЛ-КАЧЕСТВА.md','docs/ЖУРНАЛ-КАЧЕСТВА.md']:current.setdefault(sha(p),p.relative_to(R).as_posix())
rows=[];copied=0
for inp in sorted(I.iterdir()):
 if '4.10.0' not in inp.name:continue
 for p in sorted(inp.rglob('*')):
  if not p.is_file() or p.suffix=='.pyc' or '__pycache__' in p.parts:continue
  h=sha(p)
  if h not in current:
   d=dest/(h+'.txt');d.parent.mkdir(exist_ok=True,parents=True);shutil.copyfile(p,d);current[h]=d.relative_to(R).as_posix();copied+=1
  rows.append({'набор':inp.name,'исходный_путь':p.relative_to(inp).as_posix(),'байты':p.stat().st_size,'SHA256':h,'путь_сохранённых_байтов':current[h]})
(E/'сохранённые-байты-наборов-4.10.0.json').write_text(json.dumps({'редакция':'4.11.0-wip','записи':rows,'добавленных_точных_объектов':copied,'граница':'Пути архивных представлений .txt не объявляются прежними исполняемыми HTML или действующими исходниками; исходные имена и точные байты связаны отдельно. Ничего не удалено ради уменьшения размера.'},ensure_ascii=False,indent=2)+'\n')
print(len(rows),'исходных записей,',copied,'архивных объектов')
