Files
plezy/scripts/refresh_apple_spm.sh
T
edde746 adef523894 chore(build): add a SwiftPM refresh script for stale MPVKit pins
After set_mpvkit_revision.sh moves the MPVKit pin, macOS builds die in the
SwiftPM integration migration with "could not find the commit <sha>": Flutter
runs the macOS Xcode steps with -skipPackageUpdates, and its one fetch-capable
step only ever runs for iOS, so the local mirror never learns the new revision.

scripts/refresh_apple_spm.sh runs a single -resolvePackageDependencies per
platform to update the mirror without touching the tracked locks, with --reset
for an internally inconsistent SourcePackages directory. The header of
set_mpvkit_revision.sh now points at it.
2026-08-24 06:12:06 +02:00

123 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Re-resolve Plezy's Apple SwiftPM dependencies so a moved pin is actually fetched.
#
# Why this exists: the locks name a revision, but nothing in a normal Flutter
# build ever fetches it. `flutter run/build -d macos` runs its Xcode steps with
# `-skipPackageUpdates`, which forbids contacting the remote, and the one
# fetch-capable step Flutter does perform (`prefetchSwiftPackages`) is started
# for at most one Darwin platform per invocation -- iOS wins, because a single
# `_swiftPackageFetchProcess` field in flutter_tools guards it. So on a checkout
# whose build/macos/SourcePackages predates the pin, every macOS build dies in
# the SwiftPM integration migration with:
#
# could not find the commit <sha> in https://github.com/edde746/MPVKit
#
# even though the commit is perfectly reachable upstream. The mirror is stale,
# the fetch is forbidden, and nothing self-heals. One `-resolvePackageDependencies`
# without those flags updates the mirror, materializes the checkout, and leaves
# the tracked locks untouched.
#
# Run this after scripts/set_mpvkit_revision.sh, or after pulling someone else's
# pin bump, whenever a macOS build reports a commit it cannot find.
#
# Usage:
# scripts/refresh_apple_spm.sh [--reset] [ios|macos ...]
#
# Defaults to every supported platform. tvOS is deliberately absent: it is not
# built through Flutter, and Xcode resolves it with fetching enabled anyway.
#
# --reset deletes the platform's SourcePackages directory first. Needed only when
# that directory is internally inconsistent -- a workspace-state.json naming a
# checkout that no longer exists makes SwiftPM refuse to resolve at all. Binary
# artifacts re-hydrate from ~/Library/Caches/org.swift.swiftpm, so a reset costs
# seconds, not a re-download.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$ROOT"
SUPPORTED=(ios macos)
RESET=0
PLATFORMS=()
for arg in "$@"; do
case "$arg" in
--reset)
RESET=1
;;
-h | --help)
# Print the header block itself, so help can never drift from the comments.
awk 'NR > 1 && /^#/ { sub(/^# ?/, ""); print; next } NR > 1 { exit }' "${BASH_SOURCE[0]}"
exit 0
;;
-*)
echo "error: unknown option '$arg'" >&2
exit 2
;;
*)
valid=0
for platform in "${SUPPORTED[@]}"; do
[ "$arg" = "$platform" ] && valid=1
done
if [ "$valid" -eq 0 ]; then
echo "error: unsupported platform '$arg' (expected: ${SUPPORTED[*]})" >&2
exit 2
fi
PLATFORMS+=("$arg")
;;
esac
done
if [ "${#PLATFORMS[@]}" -eq 0 ]; then
PLATFORMS=("${SUPPORTED[@]}")
fi
if ! command -v xcodebuild >/dev/null 2>&1; then
echo "error: xcodebuild not found; this script only runs on a macOS host with Xcode" >&2
exit 1
fi
FAILED=0
for platform in "${PLATFORMS[@]}"; do
project="$platform/Runner.xcodeproj"
if [ ! -d "$project" ]; then
echo "skip $platform (no $project)"
continue
fi
# The graph includes Flutter's generated local packages; without them xcodebuild
# fails on a missing manifest rather than on anything to do with the pin.
if [ ! -d "$platform/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" ]; then
echo "error: $platform/Flutter/ephemeral/Packages is missing; run 'flutter pub get' first" >&2
FAILED=1
continue
fi
cloned_dir="$ROOT/build/$platform/SourcePackages"
if [ "$RESET" -eq 1 ] && [ -d "$cloned_dir" ]; then
rm -rf "$cloned_dir"
echo "reset $cloned_dir"
fi
log="$(mktemp)"
if (cd "$platform" && xcodebuild -project Runner.xcodeproj -resolvePackageDependencies \
-clonedSourcePackagesDirPath "$cloned_dir" >"$log" 2>&1); then
echo "resolved $platform"
# Only the lines that say what moved; the rest is a list of local plugin packages.
grep -E '^(Fetching|Updating|Cloning|Creating working copy|Checking out) ' "$log" | sed 's/^/ /' || true
else
echo "FAILED $platform" >&2
cat "$log" >&2
if [ "$RESET" -eq 0 ]; then
echo "hint: rerun as 'scripts/refresh_apple_spm.sh --reset $platform' if $cloned_dir is inconsistent" >&2
fi
FAILED=1
fi
rm -f "$log"
done
if [ "$FAILED" -ne 0 ]; then
exit 1
fi