36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
"""Create a portable source ZIP, excluding all user data and credentials."""
|
|
import stat
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
FILES = ['run.py', 'README.md', '.gitignore', '.gitattributes', 'start-mac.command', 'start-windows.cmd']
|
|
DIRS = ['wechat_tool', 'scripts', 'examples', 'tests', 'docs']
|
|
|
|
|
|
def main():
|
|
out = ROOT / 'dist' / 'zhiwei-wechat-analysis-v0.2.zip'
|
|
out.parent.mkdir(exist_ok=True)
|
|
paths = [ROOT / p for p in FILES]
|
|
for directory in DIRS:
|
|
paths.extend(p for p in (ROOT / directory).rglob('*') if p.is_file() and '__pycache__' not in p.parts and p.suffix != '.pyc')
|
|
with zipfile.ZipFile(out, 'w', compression=zipfile.ZIP_DEFLATED) as archive:
|
|
for path in sorted(paths):
|
|
name = 'zhiwei-wechat-analysis/' + path.relative_to(ROOT).as_posix()
|
|
info = zipfile.ZipInfo(name)
|
|
info.create_system = 3
|
|
mode = 0o755 if path.name == 'start-mac.command' else 0o644
|
|
info.external_attr = (stat.S_IFREG | mode) << 16
|
|
info.compress_type = zipfile.ZIP_DEFLATED
|
|
# Match .gitattributes even when packaging without a Git checkout.
|
|
# All files selected above are text; binary artifacts are excluded.
|
|
data = path.read_bytes().replace(b'\r\n', b'\n').replace(b'\r', b'\n')
|
|
if path.suffix in ('.cmd', '.bat'):
|
|
data = data.replace(b'\n', b'\r\n')
|
|
archive.writestr(info, data)
|
|
print(out)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|