update/navibeat
1#!/usr/bin/env nix-shell
2#!nix-shell -i bash -p curl -p jq -p nix -p nix-prefetch-git -p flutter347
3# shellcheck shell=bash
4set -euo pipefail
5
6REPO_URL="https://github.com/AfalpHy/sylvakru"
7
8SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
9PKG_FILE="$SCRIPT_DIR/default.nix"
10PKG_NAME="sylvakru"
11
12OLD_VERSION=$(sed -n 's/.*version = "\([^"]*\)";.*/\1/p' "$PKG_FILE" | head -1)
13NEW_VERSION=$(curl -fsSL "${REPO_URL}/releases.atom" | sed -n 's#.*releases/tag/v\([^"<]*\).*#\1#p' | head -1)
14
15if [ "$NEW_VERSION" = "$OLD_VERSION" ]; then
16 exit 0
17fi
18
19NEW_HASH=$(nix store prefetch-file --json --unpack "${REPO_URL}/archive/refs/tags/v${NEW_VERSION}.tar.gz" | jq -r .hash)
20
21TMPDIR=$(mktemp -d)
22trap 'rm -rf "$TMPDIR"' EXIT
23
24curl -fsSL "${REPO_URL}/archive/refs/tags/v${NEW_VERSION}.tar.gz" | tar xz -C "$TMPDIR" --strip-components=1
25chmod -R +w "$TMPDIR"
26
27cp "$SCRIPT_DIR/pubspec.lock.json" "$TMPDIR/pubspec.lock.json.old"
28
29(
30 cd "$TMPDIR"
31 # Relax the flutter pin to what nixpkgs provides (mirrors postPatch in default.nix).
32 sed -i 's/ flutter: 3\.47\.2/ flutter: ^3.47.0/' pubspec.yaml
33 flutter pub get >/dev/null
34)
35
36LOCKFILE_CHANGED=false
37if ! cmp -s "$TMPDIR/pubspec.lock.json.old" "$TMPDIR/pubspec.lock.json"; then
38 LOCKFILE_CHANGED=true
39 cp "$TMPDIR/pubspec.lock.json" "$SCRIPT_DIR/pubspec.lock.json"
40fi
41
42sed -i "s/version = \"$OLD_VERSION\";/version = \"$NEW_VERSION\";/" "$PKG_FILE"
43
44awk -v hash="$NEW_HASH" '
45 /src = fetchFromGitHub {/ { in_src = 1 }
46 in_src && /hash = "[^"]*"/ { sub(/hash = "[^"]*"/, "hash = \"" hash "\""); in_src = 0 }
47 { print }
48' "$PKG_FILE" >"$PKG_FILE.tmp" && mv "$PKG_FILE.tmp" "$PKG_FILE"
49
50if [ "$LOCKFILE_CHANGED" = true ]; then
51 # media-kit family shares one hash via the media-kit-hash binding.
52 MEDIA_KIT_URL=$(jq -r '.packages.media_kit.description.url' "$TMPDIR/pubspec.lock.json")
53 MEDIA_KIT_REV=$(jq -r '.packages.media_kit.description."resolved-ref"' "$TMPDIR/pubspec.lock.json")
54 for FAM in media_kit_libs_android_audio media_kit_libs_ios_audio media_kit_libs_macos_audio media_kit_libs_windows_audio; do
55 FAM_URL=$(jq -r ".packages.$FAM.description.url" "$TMPDIR/pubspec.lock.json")
56 FAM_REV=$(jq -r ".packages.$FAM.description.\"resolved-ref\"" "$TMPDIR/pubspec.lock.json")
57 if [ "$FAM_URL" != "$MEDIA_KIT_URL" ] || [ "$FAM_REV" != "$MEDIA_KIT_REV" ]; then
58 echo "media-kit family diverged; manual update required" >&2
59 exit 1
60 fi
61 done
62 MEDIA_KIT_HASH=$(nix-prefetch-git --url "$MEDIA_KIT_URL" --rev "$MEDIA_KIT_REV" --quiet 2>/dev/null | jq -r .sha256 | nix hash convert --hash-algo sha256 --to sri)
63 sed -i "s|media-kit-hash = \"sha256-[^\"]*\";|media-kit-hash = \"$MEDIA_KIT_HASH\";|" "$PKG_FILE"
64
65 while IFS=$'\t' read -r KEY URL REV; do
66 case "$KEY" in
67 media_kit | media_kit_libs_*)
68 continue
69 ;;
70 esac
71 HASH=$(nix-prefetch-git --url "$URL" --rev "$REV" --quiet 2>/dev/null | jq -r .sha256 | nix hash convert --hash-algo sha256 --to sri)
72 sed -i "s|\($KEY = \)\"sha256-[^\"]*\"|\1\"$HASH\"|" "$PKG_FILE"
73 done < <(jq -r '.packages | to_entries[] | select(.value.source == "git") | [.key, .value.description.url, .value.description."resolved-ref"] | @tsv' "$TMPDIR/pubspec.lock.json")
74
75 RIVE_VERSION=$(jq -r '.packages.rive_native.version // empty' "$TMPDIR/pubspec.lock.json")
76 if [ -n "$RIVE_VERSION" ]; then
77 RIVE_URL="https://rive-flutter-artifacts.rive.app/rive_native_versions/${RIVE_VERSION//+/%2B}/rive_native_artifacts_linux.zip"
78 RIVE_HASH=$(nix store prefetch-file --json --hash-algo sha512 "$RIVE_URL" | jq -r .hash)
79 sed -i \
80 -e "s|rive_native_versions/[^/]*/|rive_native_versions/${RIVE_VERSION//+/%2B}/|" \
81 -e "s|hash = \"sha512-[^\"]*\";|hash = \"$RIVE_HASH\";|" \
82 "$PKG_FILE"
83 fi
84fi
85
86echo "$PKG_NAME: $OLD_VERSION -> $NEW_VERSION"