update/navibeat
 1#!/usr/bin/env nix-shell
 2#!nix-shell -i bash -p curl -p jq -p nix -p flutter341 -p python3 -p python3Packages.pyyaml
 3# shellcheck shell=bash
 4set -euo pipefail
 5
 6REPO_URL="https://github.com/dddevid/Musly"
 7
 8SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
 9PKG_FILE="$SCRIPT_DIR/default.nix"
10PKG_NAME="musly-player"
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	flutter pub get </dev/null >/dev/null
32)
33
34# flutter writes the YAML pubspec.lock; the package consumes a JSON one.
35python3 - "$TMPDIR/pubspec.lock" <<'PY'
36import json
37import sys
38import yaml
39
40with open(sys.argv[1]) as f:
41    data = yaml.safe_load(f)
42with open(sys.argv[1] + ".json", "w") as f:
43    json.dump(data, f, indent=2)
44PY
45
46if ! cmp -s "$TMPDIR/pubspec.lock.json.old" "$TMPDIR/pubspec.lock.json"; then
47	cp "$TMPDIR/pubspec.lock.json" "$SCRIPT_DIR/pubspec.lock.json"
48fi
49
50sed -i "s/version = \"$OLD_VERSION\";/version = \"$NEW_VERSION\";/" "$PKG_FILE"
51
52awk -v hash="$NEW_HASH" '
53  /src = fetchFromGitHub {/ { in_src = 1 }
54  in_src && /hash = "[^"]*"/ { sub(/hash = "[^"]*"/, "hash = \"" hash "\""); in_src = 0 }
55  { print }
56' "$PKG_FILE" >"$PKG_FILE.tmp" && mv "$PKG_FILE.tmp" "$PKG_FILE"
57
58echo "$PKG_NAME: $OLD_VERSION -> $NEW_VERSION"