#!/usr/bin/env bash # Обновляет пины RustDesk-апстрима в upstream.txt под указанный релиз-тег (или latest). # Тянет версии тулчейна из CI-конфигов САМОГО тега (flutter-build.yml + bridge.yml) — чтобы бамп # версии RustDesk не разъезжался с Flutter/vcpkg/LLVM/FRB/NDK, которые апстрим меняет между релизами. # # Usage: scripts/bump-upstream.sh [|latest] # без аргумента / latest — берёт последний стабильный релиз rustdesk/rustdesk. # После бампа: provision-windows.ps1 (если пины изменились) -> build-windows.ps1. set -euo pipefail REPO="rustdesk/rustdesk" ROOT="$(cd "$(dirname "$0")/.." && pwd)" UP="$ROOT/upstream.txt" TAG="${1:-latest}" api() { curl -fsSL ${GH_TOKEN:+-H "Authorization: Bearer $GH_TOKEN"} "$@"; } raw() { curl -fsSL "https://raw.githubusercontent.com/$REPO/$1"; } if [ "$TAG" = "latest" ]; then TAG="$(api "https://api.github.com/repos/$REPO/releases/latest" | grep -o '"tag_name": *"[^"]*"' | head -1 | sed -E 's/.*"tag_name": *"([^"]*)".*/\1/')" fi [ -n "$TAG" ] || { echo "не удалось определить тег" >&2; exit 1; } echo "Целевой тег RustDesk: $TAG" FB="$(raw "$TAG/.github/workflows/flutter-build.yml")" || { echo "нет flutter-build.yml в $TAG" >&2; exit 1; } BR="$(raw "$TAG/.github/workflows/bridge.yml")" || { echo "нет bridge.yml в $TAG" >&2; exit 1; } # Вытаскиваем ` KEY: "value" # comment` -> value (без кавычек и комментария). yenv() { printf '%s\n' "$1" | grep -E "^[[:space:]]*$2:[[:space:]]*" | head -1 \ | sed -E "s/^[[:space:]]*$2:[[:space:]]*//; s/#.*$//; s/^\"//; s/\"[[:space:]]*$//; s/[[:space:]]*$//" } RUST_VERSION="$(yenv "$FB" RUST_VERSION)" LLVM_VERSION="$(yenv "$FB" LLVM_VERSION)" FLUTTER_VERSION="$(yenv "$FB" FLUTTER_VERSION)" VCPKG_COMMIT_ID="$(yenv "$FB" VCPKG_COMMIT_ID)" NDK_VERSION="$(yenv "$FB" NDK_VERSION)" CARGO_NDK_VERSION="$(yenv "$FB" CARGO_NDK_VERSION)" ANDROID_FLUTTER_VERSION="$(yenv "$FB" ANDROID_FLUTTER_VERSION)" FRB_VERSION="$(yenv "$BR" FLUTTER_RUST_BRIDGE_VERSION)" CARGO_EXPAND_VERSION="$(yenv "$BR" CARGO_EXPAND_VERSION)" # Триплет не меняется апстримом — сохраняем текущий (или дефолт). VCPKG_TRIPLET="$(grep -E '^VCPKG_TRIPLET=' "$UP" 2>/dev/null | cut -d= -f2)"; VCPKG_TRIPLET="${VCPKG_TRIPLET:-x64-windows-static}" # Проверяем, что все пины вытащились (иначе апстрим переименовал переменную — не молча ломаемся). for v in RUST_VERSION LLVM_VERSION FLUTTER_VERSION VCPKG_COMMIT_ID NDK_VERSION CARGO_NDK_VERSION \ ANDROID_FLUTTER_VERSION FRB_VERSION CARGO_EXPAND_VERSION; do if [ -z "${!v}" ]; then echo "ОШИБКА: не удалось извлечь $v из CI-конфигов $TAG (апстрим переименовал?)." >&2; exit 1; fi done echo "=== было -> станет ===" show() { local old; old="$(grep -E "^$1=" "$UP" 2>/dev/null | cut -d= -f2-)"; printf ' %-24s %s -> %s\n' "$1" "${old:-—}" "$2"; } show RUSTDESK_TAG "$TAG" show RUST_VERSION "$RUST_VERSION"; show LLVM_VERSION "$LLVM_VERSION"; show FLUTTER_VERSION "$FLUTTER_VERSION" show VCPKG_COMMIT_ID "$VCPKG_COMMIT_ID"; show FRB_VERSION "$FRB_VERSION"; show CARGO_EXPAND_VERSION "$CARGO_EXPAND_VERSION" show NDK_VERSION "$NDK_VERSION"; show CARGO_NDK_VERSION "$CARGO_NDK_VERSION"; show ANDROID_FLUTTER_VERSION "$ANDROID_FLUTTER_VERSION" cat > "$UP" <|latest] -> provision-windows.ps1 -> build-windows.ps1. RUSTDESK_TAG=$TAG RUSTDESK_REPO=https://github.com/rustdesk/rustdesk.git # Тулчейн (Windows x64 flutter-сборка) RUST_VERSION=$RUST_VERSION LLVM_VERSION=$LLVM_VERSION FLUTTER_VERSION=$FLUTTER_VERSION VCPKG_COMMIT_ID=$VCPKG_COMMIT_ID VCPKG_TRIPLET=$VCPKG_TRIPLET # flutter_rust_bridge codegen (генерит src/bridge_generated.rs) FRB_VERSION=$FRB_VERSION CARGO_EXPAND_VERSION=$CARGO_EXPAND_VERSION # Android ANDROID_FLUTTER_VERSION=$ANDROID_FLUTTER_VERSION CARGO_NDK_VERSION=$CARGO_NDK_VERSION NDK_VERSION=$NDK_VERSION EOF echo echo "upstream.txt обновлён на $TAG." echo "Дальше: pwsh -File scripts/provision-windows.ps1 (доведёт тулчейн до пинов) -> scripts/build-windows.ps1"