from pathlib import Path, PurePosixPath
import shutil, tarfile

home = Path('/home/justrep-ssh')
web = home / 'www'
release = home / 'rec-map-notes-20260930'
backup = home / 'rec-map-notes-backup-20260930'
archive_path = home / 'rec-map-notes-20260930.tgz'
assert not release.exists(), f'Release path already exists: {release}'
assert not backup.exists(), f'Backup path already exists: {backup}'
release.mkdir(mode=0o700)
backup.mkdir(mode=0o700)
with tarfile.open(archive_path, 'r:gz') as archive:
    for member in archive.getmembers():
        path = PurePosixPath(member.name)
        assert not path.is_absolute() and '..' not in path.parts, f'Unsafe path: {member.name}'
        assert member.isfile() or member.isdir(), f'Unsupported archive entry: {member.name}'
    archive.extractall(release)
files = [path for path in release.rglob('*') if path.is_file()]
with tarfile.open(backup / 'overwritten-files.tar.gz', 'w:gz') as saved:
    for source in files:
        relative = source.relative_to(release)
        target = web / relative
        if target.is_file():
            saved.add(target, arcname=relative.as_posix())
for source in sorted(files, key=lambda path: path.suffix == '.html'):
    relative = source.relative_to(release)
    target = web / relative
    target.parent.mkdir(parents=True, exist_ok=True)
    temporary = target.with_name(target.name + '.rec-filter-next')
    shutil.copyfile(source, temporary)
    temporary.chmod(0o644)
    temporary.replace(target)
print(f'Published {len(files)} frontend files; backup: {backup / "overwritten-files.tar.gz"}')
