mirror of
https://github.com/SteamFramelyHomebrew/framely.git
synced 2026-10-18 09:01:31 +02:00
61 lines
3.4 KiB
Python
61 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Package the native installer, including platform application icons."""
|
|
import os
|
|
import pathlib
|
|
import plistlib
|
|
import shutil
|
|
import subprocess
|
|
import tarfile
|
|
import tomllib
|
|
import zipfile
|
|
|
|
root = pathlib.Path(__file__).resolve().parents[1]
|
|
platform = os.environ['INSTALLER_PLATFORM']
|
|
version = tomllib.loads((root / 'installer/Cargo.toml').read_text())['package']['version']
|
|
exe = 'framely-installer.exe' if platform.startswith('windows') else 'framely-installer'
|
|
target = pathlib.Path(os.environ.get('CARGO_TARGET_DIR', str(root / 'installer/target')))
|
|
binary = target / os.environ.get('INSTALLER_BUILD_PROFILE', 'release') / exe
|
|
out = root / 'installer/dist'
|
|
out.mkdir(parents=True, exist_ok=True)
|
|
with __import__('tempfile').TemporaryDirectory() as temp:
|
|
stage = pathlib.Path(temp)
|
|
if platform.startswith('macos'):
|
|
bundle = stage / 'Framely Installer.app/Contents'
|
|
(bundle / 'MacOS').mkdir(parents=True)
|
|
(bundle / 'Resources').mkdir()
|
|
iconset = pathlib.Path(temp) / 'Framely.iconset'
|
|
iconset.mkdir()
|
|
for size in (16, 32, 128, 256, 512):
|
|
for scale in (1, 2):
|
|
suffix = '@2x' if scale == 2 else ''
|
|
shutil.copy2(root / f'assets/branding/icons/{size * scale}.png', iconset / f'icon_{size}x{size}{suffix}.png')
|
|
subprocess.run(['iconutil', '-c', 'icns', '-o', str(bundle / 'Resources/Framely.icns'), str(iconset)], check=True)
|
|
shutil.rmtree(iconset)
|
|
shutil.copy2(binary, bundle / 'MacOS/framely-installer')
|
|
(bundle / 'MacOS/framely-installer').chmod(0o755)
|
|
with (bundle / 'Info.plist').open('wb') as output:
|
|
plistlib.dump({'CFBundleName': 'Framely Installer', 'CFBundleDisplayName': 'Framely Installer', 'CFBundleIdentifier': 'org.framely.installer', 'CFBundleExecutable': 'framely-installer', 'CFBundleIconFile': 'Framely.icns', 'CFBundlePackageType': 'APPL', 'CFBundleVersion': version, 'CFBundleShortVersionString': version, 'NSHighResolutionCapable': True, 'LSMinimumSystemVersion': '11.0'}, output)
|
|
else:
|
|
shutil.copy2(binary, stage / exe)
|
|
if not platform.startswith('windows'):
|
|
(stage / exe).chmod(0o755)
|
|
desktop_script = (root / 'installer/install-desktop-entry.sh').read_text()
|
|
marker = 'icon = None # Embedded by tools/package-installer.py.'
|
|
if desktop_script.count(marker) != 1:
|
|
raise ValueError('Desktop registration script is missing its icon marker')
|
|
icon = (root / 'assets/branding/framely-app-icon.svg').read_bytes()
|
|
(stage / 'install-desktop-entry.sh').write_text(desktop_script.replace(marker, f'icon = {icon!r}'))
|
|
(stage / 'install-desktop-entry.sh').chmod(0o755)
|
|
shutil.copy2(root / 'installer/README.md', stage / 'README.md')
|
|
shutil.copy2(root / 'installer/README.zh-CN.md', stage / 'README.zh-CN.md')
|
|
shutil.copy2(root / 'LICENSE', stage / 'LICENSE')
|
|
name = f'framely-installer-{version}-{platform}'
|
|
if platform.startswith('linux'):
|
|
with tarfile.open(out / (name + '.tar.gz'), 'w:gz') as archive:
|
|
for path in stage.iterdir():
|
|
archive.add(path, arcname=name + '/' + path.name)
|
|
else:
|
|
with zipfile.ZipFile(out / (name + '.zip'), 'w', zipfile.ZIP_DEFLATED) as archive:
|
|
for path in stage.rglob('*'):
|
|
archive.write(path, path.relative_to(stage))
|