Files
plezy/scripts/format_native.sh
T
edde746 200d896bea build: switch every platform's libmpv supply chain to the unified mpv-build repo
Plezy consumed mpv through four unrelated supply chains: an MPVKit fork
via SwiftPM for the Apple platforms, a libmpv-android fork's AAR for
Android, an in-CI from-source build for Linux, and an unpinned
sourceforge mpv-dev 7z for Windows. All four now consume the same
per-commit, content-addressed binaries from
https://github.com/edde746/mpv-build, pinned to one commit and built
from one set of pinned sources (mpv v0.41.0 on Apple/Android/Windows,
ffmpeg n8.0.1, our libass fork).

- Apple: the SwiftPM package moves from edde746/MPVKit to
  edde746/mpv-build across the ios/macos/tvos projects;
  scripts/set_mpvkit_revision.sh becomes set_native_revision.sh, writes
  every pin site plus the new repo-root mpv-build.lock.json, and
  tvos/scripts/wire_mpv.rb derives the package repo from the locks.
- Android: the mpv Kotlin API and JNI glue move in-app under
  android/libmpv (repackaged com.edde746.plezy.libmpv, exports renamed,
  shrinker rules covered), and the module downloads per-ABI native
  tarballs (lib/*.so incl. libc++_shared.so + include/) driven entirely
  by mpv-build.lock.json, with a PLEZY_LOCAL_MPV_DIR escape hatch for
  locally built artifacts. The fork AAR and its Maven coordinates are
  gone.
- Linux: CI downloads the prebuilt self-relocating libmpv prefix
  (lock-driven, sha256-verified) instead of compiling mpv/ffmpeg/dav1d/
  libplacebo/shaderc from source; linux/packaging/build-libmpv.sh and
  its test are deleted and native-inputs.json shrinks to the simdutf
  entry the CMake builds still fetch.
- Windows: both arches FetchContent the mpv-build dev zips with
  URL_HASH enforcement, replacing the checksum-less sourceforge
  download and its ARM64 7-Zip special case; guard scripts updated.

The lock plus the Apple pin sites all point at mpv-build commit
d7c3d559, whose manifest was verified asset-by-asset against the
published release digests (17/17 match). Verified locally: wire and
pin-script suites green, runtime-input checks green, all four Android
ABI tarballs downloaded/verified/extracted through the real Gradle
tasks, the Windows FetchContent block exercised end to end through
cmake, the Linux asset hash and layout checked against the workflow
contract, and xcodebuild resolved the flipped SwiftPM graph with
SwiftPM validating every binary checksum.
2026-09-02 11:31:47 +02:00

275 lines
7.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$ROOT"
MODE="check"
case "${1:---check}" in
--check) MODE="check" ;;
--fix|--write) MODE="fix" ;;
-h|--help)
echo "Usage: scripts/format_native.sh [--check|--fix]"
exit 0
;;
*)
echo "Unknown argument: $1" >&2
echo "Usage: scripts/format_native.sh [--check|--fix]" >&2
exit 2
;;
esac
KTLINT_VERSION="1.5.0"
KTLINT_SHA256="a16be01dcc480aab2f55f444b620142152f66e31564b3b9376506d624c28a2ad"
KTLINT_URL="https://github.com/ktlint/ktlint/releases/download/$KTLINT_VERSION/ktlint"
KTLINT_BIN="$ROOT/.dart_tool/native-format/ktlint-$KTLINT_VERSION"
KTLINT_TMP=""
JAVA_BIN_DIR=""
cleanup() {
if [ -n "$KTLINT_TMP" ]; then
rm -f -- "$KTLINT_TMP"
fi
}
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
has_command() {
command -v "$1" >/dev/null 2>&1
}
run_clang_format() {
if has_command xcrun && xcrun --find clang-format >/dev/null 2>&1; then
xcrun clang-format "$@"
elif has_command clang-format; then
clang-format "$@"
else
echo "clang-format not found. Install clang-format or Xcode command line tools." >&2
return 127
fi
}
run_swift_format() {
if has_command xcrun && xcrun --find swift-format >/dev/null 2>&1; then
xcrun swift-format "$@"
elif has_command swift-format; then
swift-format "$@"
elif has_command swift && swift format --help >/dev/null 2>&1; then
swift format "$@"
else
echo "swift-format not found. Install Swift 6+, swift-format, or Xcode 16+." >&2
return 127
fi
}
java_diagnostic() {
echo "A working JDK 17+ is required for Kotlin formatting. Set JAVA_HOME to a JDK 17+ installation or put java on PATH." >&2
}
resolve_java() {
local candidate output version major
if [ -n "${JAVA_HOME:-}" ]; then
candidate="$JAVA_HOME/bin/java"
else
candidate="$(command -v java 2>/dev/null || true)"
fi
if [ -z "$candidate" ] || [ ! -x "$candidate" ]; then
java_diagnostic
return 127
fi
if [[ "$candidate" != /* ]]; then
candidate="$PWD/$candidate"
fi
if ! output="$("$candidate" -version 2>&1)"; then
java_diagnostic
return 127
fi
if [[ "$output" =~ version[[:space:]]+\"([^\"]+)\" ]]; then
version="${BASH_REMATCH[1]}"
else
java_diagnostic
return 127
fi
if [[ "$version" =~ ^1\.([0-9]+)([._-]|$) ]]; then
major="${BASH_REMATCH[1]}"
elif [[ "$version" =~ ^([0-9]+)([._-]|$) ]]; then
major="${BASH_REMATCH[1]}"
else
java_diagnostic
return 127
fi
if ((major < 17)); then
java_diagnostic
return 127
fi
JAVA_BIN_DIR="${candidate%/*}"
}
sha256_file() {
local output
if has_command shasum; then
output="$(shasum -a 256 "$1")" || {
echo "Failed to calculate the ktlint SHA-256 digest with shasum." >&2
return 2
}
elif has_command sha256sum; then
output="$(sha256sum "$1")" || {
echo "Failed to calculate the ktlint SHA-256 digest with sha256sum." >&2
return 2
}
else
echo "A SHA-256 tool is required to verify ktlint (shasum or sha256sum)." >&2
return 127
fi
printf '%s\n' "${output%%[[:space:]]*}"
}
verify_ktlint() {
local digest
digest="$(sha256_file "$1")" || return $?
[[ "$digest" =~ ^[0-9a-f]{64}$ ]] && [ "$digest" = "$KTLINT_SHA256" ]
}
ensure_ktlint() {
local status
if ! has_command shasum && ! has_command sha256sum; then
echo "A SHA-256 tool is required to verify ktlint (shasum or sha256sum)." >&2
return 127
fi
if [ -f "$KTLINT_BIN" ]; then
if verify_ktlint "$KTLINT_BIN"; then
chmod +x "$KTLINT_BIN"
return 0
else
status=$?
if [ "$status" -ne 1 ]; then
return "$status"
fi
fi
fi
if ! has_command curl; then
echo "curl not found. Install curl to download ktlint." >&2
return 127
fi
mkdir -p "$(dirname "$KTLINT_BIN")"
KTLINT_TMP="$(mktemp "$(dirname "$KTLINT_BIN")/.ktlint-$KTLINT_VERSION.XXXXXX")"
if ! curl -fsSL "$KTLINT_URL" -o "$KTLINT_TMP"; then
echo "Failed to download ktlint $KTLINT_VERSION." >&2
return 1
fi
if verify_ktlint "$KTLINT_TMP"; then
:
else
status=$?
if [ "$status" -eq 1 ]; then
echo "Downloaded ktlint $KTLINT_VERSION failed SHA-256 verification." >&2
fi
return "$status"
fi
chmod +x "$KTLINT_TMP"
mv -f "$KTLINT_TMP" "$KTLINT_BIN"
KTLINT_TMP=""
}
run_ktlint() {
PATH="$JAVA_BIN_DIR:$PATH" "$KTLINT_BIN" "$@"
}
append_native_files() {
while IFS= read -r -d '' file; do
case "$file" in
android/app/src/main/cpp/include/*) continue ;;
android/libmpv/src/main/cpp/include/*) continue ;;
android/app/src/main/java/io/flutter/plugins/*) continue ;;
ios/Flutter/*|macos/Flutter/*|tvos/Flutter/*) continue ;;
linux/flutter/*|windows/flutter/*) continue ;;
tvos/Runner/Plugins/*) continue ;;
*/GeneratedPluginRegistrant.*|*/generated_plugin_registrant.*) continue ;;
esac
case "$file" in
*.kt|*.kts) ktlint_files+=("$file") ;;
*.swift) swift_files+=("$file") ;;
*.c|*.cc|*.cpp|*.h|*.hpp|*.m|*.mm) clang_files+=("$file") ;;
esac
done < <(git ls-files -z -- "$@")
}
ktlint_files=()
swift_files=()
clang_files=()
append_native_files \
'android/**/*.kt' 'android/**/*.kts' \
'ios/**/*.swift' 'macos/**/*.swift' 'tvos/**/*.swift' 'shared/**/*.swift' \
'android/**/*.[ch]' 'android/**/*.cc' 'android/**/*.cpp' 'android/**/*.hpp' \
'ios/**/*.[hm]' 'ios/**/*.mm' \
'macos/**/*.[hm]' 'macos/**/*.mm' \
'tvos/**/*.[hm]' 'tvos/**/*.mm' \
'linux/**/*.[ch]' 'linux/**/*.cc' 'linux/**/*.cpp' 'linux/**/*.hpp' \
'windows/**/*.[ch]' 'windows/**/*.cc' 'windows/**/*.cpp' 'windows/**/*.hpp' \
'shared/**/*.[ch]' 'shared/**/*.cc' 'shared/**/*.cpp' 'shared/**/*.hpp'
FAILED=0
if [ "${#ktlint_files[@]}" -gt 0 ]; then
resolve_java
ensure_ktlint
if [ "$MODE" = "fix" ]; then
run_ktlint -F "${ktlint_files[@]}"
else
run_ktlint "${ktlint_files[@]}" || FAILED=1
fi
else
echo "No Kotlin files found."
fi
if [ "${#swift_files[@]}" -gt 0 ]; then
if [ "$MODE" = "fix" ]; then
run_swift_format format --configuration "$ROOT/.swift-format" --in-place "${swift_files[@]}"
else
swift_failed=0
for file in "${swift_files[@]}"; do
tmp="$(mktemp)"
run_swift_format format --configuration "$ROOT/.swift-format" "$file" >"$tmp"
if ! cmp -s "$file" "$tmp"; then
if [ "$swift_failed" -eq 0 ]; then
echo "Swift files need formatting:"
fi
echo " $file"
swift_failed=1
fi
rm -f "$tmp"
done
if [ "$swift_failed" -ne 0 ]; then
FAILED=1
fi
fi
else
echo "No Swift files found."
fi
if [ "${#clang_files[@]}" -gt 0 ]; then
if [ "$MODE" = "fix" ]; then
run_clang_format -i "${clang_files[@]}"
else
run_clang_format --dry-run --Werror "${clang_files[@]}" || FAILED=1
fi
else
echo "No C/C++/Obj-C files found."
fi
if [ "$FAILED" -ne 0 ]; then
echo "Native formatting issues found. Run: scripts/format_native.sh --fix" >&2
exit 1
fi
if [ "$MODE" = "check" ]; then
echo "Native formatting passed."
else
echo "Native formatting applied."
fi