24 lines
1.3 KiB
Python
24 lines
1.3 KiB
Python
from pathlib import Path
|
|
import hashlib,json,shutil,ast
|
|
folder=Path(__file__).resolve().parent;payload=folder/'payload';target=Path('C:/wechat_rpa').resolve()
|
|
assert str(target).lower()=='c:\\wechat_rpa'
|
|
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
|
before={r['path']:r['before_sha256'] for r in json.loads((folder/'before.json').read_text())}
|
|
paths=[p for p in payload.rglob('*') if p.is_file()]
|
|
for p in paths:
|
|
name=p.relative_to(payload).as_posix();dest=target/name
|
|
assert dest.resolve().is_relative_to(target)
|
|
assert (sha(dest) if dest.exists() else None)==before.get(name),name
|
|
if p.suffix=='.py':ast.parse(p.read_text(encoding='utf-8'))
|
|
backup=target/'backups/dpi-adaptation-20260916';backup.mkdir(parents=True,exist_ok=False)
|
|
manifest=[]
|
|
for p in paths:
|
|
name=p.relative_to(payload).as_posix();dest=target/name
|
|
if dest.exists():
|
|
saved=backup/name;saved.parent.mkdir(parents=True,exist_ok=True);shutil.copyfile(dest,saved)
|
|
dest.parent.mkdir(parents=True,exist_ok=True);shutil.copyfile(p,dest)
|
|
assert sha(p)==sha(dest)
|
|
manifest.append({'path':name,'before_sha256':before.get(name),'sha256':sha(dest)})
|
|
(folder/'applied.json').write_text(json.dumps({'backup':str(backup),'manifest':manifest},indent=2),encoding='utf-8')
|
|
print('Applied',len(manifest),'files; backup:',backup)
|