zapret2-youtube-discord/scripts/build_release.sh
loop-uh 7d5aec1bc7
All checks were successful
Проверка восстановленного репозитория / validate (push) Successful in 4s
Выпуск Zapret2 для Windows / release (push) Successful in 7s
Восстановить полный Zapret2 и перенести выпуск в Forgejo
2026-08-07 17:10:02 +03:00

115 lines
4.1 KiB
Shell

#!/usr/bin/env bash
set -euo pipefail
repo_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
version=${1:-}
if [[ ! "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then
echo "Использование: $0 vX.Y.Z" >&2
exit 2
fi
dist_dir="$repo_root/dist"
if [[ "$dist_dir" != "$repo_root/dist" || "$dist_dir" == "/dist" ]]; then
echo "Небезопасный путь каталога сборки: $dist_dir" >&2
exit 2
fi
temp_root=$(mktemp -d "${TMPDIR:-/tmp}/zapret2-release.XXXXXXXX")
trap 'rm -rf -- "$temp_root"' EXIT
stage_dir="$temp_root/stage"
tools_dir="$temp_root/tools"
verify_dir="$temp_root/verify"
mkdir -p "$stage_dir" "$tools_dir" "$verify_dir"
while IFS= read -r -d '' relative; do
case "$relative" in
.forgejo/*|.github/*|scripts/*|.gitattributes|.gitignore)
continue
;;
esac
mkdir -p "$stage_dir/$(dirname -- "$relative")"
cp -p -- "$repo_root/$relative" "$stage_dir/$relative"
done < <(git -C "$repo_root" ls-files -z)
# Windows-скрипты и списки должны иметь CRLF независимо от настроек checkout.
python3 - "$stage_dir" <<'PY'
from pathlib import Path
import sys
root = Path(sys.argv[1])
suffixes = {".bat", ".cmd", ".lua", ".md", ".ps1", ".txt", ".vbs"}
for path in root.rglob("*"):
if not path.is_file() or path.suffix.lower() not in suffixes:
continue
data = path.read_bytes().replace(b"\r\n", b"\n").replace(b"\r", b"\n")
path.write_bytes(data.replace(b"\n", b"\r\n"))
PY
source_date_epoch=${SOURCE_DATE_EPOCH:-$(git -C "$repo_root" show -s --format=%ct HEAD)}
find "$stage_dir" -exec touch -d "@$source_date_epoch" -- {} +
sevenzip_version=26.02
sevenzip_linux_url="https://github.com/ip7z/7zip/releases/download/${sevenzip_version}/7z2602-linux-x64.tar.xz"
sevenzip_sdk_url="https://github.com/ip7z/7zip/releases/download/${sevenzip_version}/lzma2602.7z"
sevenzip_linux_sha256=41aaba7b1235304ab5aa0624530c67ae829496cd29e875925271efdccc28c03e
sevenzip_sdk_sha256=2878c85f5f43a4a4e0952b1fd4e5fe097c1c143997a8047c7e1e788892aa9357
curl --fail --location --retry 3 --silent --show-error \
--output "$tools_dir/7z-linux.tar.xz" "$sevenzip_linux_url"
curl --fail --location --retry 3 --silent --show-error \
--output "$tools_dir/lzma-sdk.7z" "$sevenzip_sdk_url"
printf '%s %s\n' "$sevenzip_linux_sha256" "$tools_dir/7z-linux.tar.xz" | sha256sum --check --status
printf '%s %s\n' "$sevenzip_sdk_sha256" "$tools_dir/lzma-sdk.7z" | sha256sum --check --status
tar -xJf "$tools_dir/7z-linux.tar.xz" -C "$tools_dir"
chmod +x "$tools_dir/7zz"
"$tools_dir/7zz" x -y -o"$tools_dir/sdk" "$tools_dir/lzma-sdk.7z" bin/7zSD.sfx >/dev/null
archive_name="zapret2-youtube-discord-${version}"
archive_path="$temp_root/$archive_name.7z"
sfx_path="$temp_root/$archive_name.exe"
(
cd "$stage_dir"
"$tools_dir/7zz" a -t7z -mx=9 -mmt=on "$archive_path" ./* >/dev/null
)
python3 - "$temp_root/sfx-config.txt" "$version" "$archive_name" <<'PY'
from pathlib import Path
import sys
config_path, version, archive_name = sys.argv[1:]
config = f''' ;!@Install@!UTF-8!
Title="Zapret2 YouTube Discord {version}"
BeginPrompt="Распаковать Zapret2 YouTube Discord {version}?"
ExtractPathText="Папка для распаковки:"
ExtractPathDefault="%USERPROFILE%\\Desktop\\{archive_name}"
ExtractDialogText="Распаковка Zapret2..."
;!@InstallEnd@!
'''.lstrip()
Path(config_path).write_bytes(config.encode("utf-8"))
PY
cat "$tools_dir/sdk/bin/7zSD.sfx" "$temp_root/sfx-config.txt" "$archive_path" > "$sfx_path"
chmod 0644 "$archive_path" "$sfx_path"
"$tools_dir/7zz" t "$archive_path" >/dev/null
"$tools_dir/7zz" t "$sfx_path" >/dev/null
"$tools_dir/7zz" x -y -o"$verify_dir" "$sfx_path" >/dev/null
diff -qr "$stage_dir" "$verify_dir" >/dev/null
rm -rf -- "$dist_dir"
mkdir -p "$dist_dir"
mv "$archive_path" "$sfx_path" "$dist_dir/"
(
cd "$dist_dir"
sha256sum "$archive_name.7z" "$archive_name.exe" > SHA256SUMS.txt
sha256sum --check --status SHA256SUMS.txt
)
chmod 0644 "$dist_dir/SHA256SUMS.txt"
echo "Сборка завершена:"
ls -lh "$dist_dir/$archive_name.7z" "$dist_dir/$archive_name.exe" "$dist_dir/SHA256SUMS.txt"
cat "$dist_dir/SHA256SUMS.txt"