12# Build the Airwaves desktop app as a Flatpak and install it on a SteamOS3# (or any Flatpak) box for its user.4# scripts/flatpak.sh nas deck@steamdeck [server]5# The app is built from the committed HEAD (uncommitted changes are left6# out; the packaging in build/linux/flatpak comes from the working tree) on7# a Docker host, in ~/airwaves-flatpak with the flathub-infra GNOME image.8# INCLUDE_WORKTREE adds uncommitted changes: paths to take from the working9# tree ("frontend/dist main.go"), or 1 for every changed tracked file.10# A first install points the app at server (default: the build host's11# tailnet address) and adds it to Steam as a non-Steam game.12set -eu13usage='usage: flatpak.sh <build-host> <deck-host> [server]'14builder=${1:?$usage}15deck=${2:?$usage}16root=$(cd "$(dirname "$0")/.." && pwd)17app=dev.airwaves.Airwaves18gnome=$(sed -n "s/^runtime-version: *'*\([0-9.]*\)'*/\1/p" "$root/build/linux/flatpak/$app.yml")19stage=$(mktemp -d)20trap 'rm -rf "$stage"' EXIT2122echo "building $(git -C "$root" log -1 --format='%h %s') on GNOME $gnome"23mkdir -p "$stage/src"24git -C "$root" archive HEAD | tar -x -C "$stage/src"25if [ -n "${INCLUDE_WORKTREE:-}" ]; then26 paths=$INCLUDE_WORKTREE27 [ "$paths" = 1 ] && paths=$(git -C "$root" diff --name-only --diff-filter=d HEAD)28 echo "with uncommitted:" $paths29 # shellcheck disable=SC2086 # a list of paths30 (cd "$root" && tar -cf - $paths) | tar -x -C "$stage/src"31fi32rm -rf "$stage/src/build/linux/flatpak"33mkdir -p "$stage/src/build/linux"34cp -R "$root/build/linux/flatpak" "$stage/src/build/linux/"3536# Runs in the image as root, in ~/airwaves-flatpak. The Go SDK extension37# stays installed in ./flatpak between builds; the GNOME SDK is in the image.38cat > "$stage/build.sh" <<'EOF'39#!/bin/sh40set -eu41app=dev.airwaves.Airwaves42# Files are root's while building (flatpak insists on that for ./flatpak)43# and the host user's afterwards.44trap 'chown -R "$OWNER" /work' EXIT45export FLATPAK_USER_DIR=/work/flatpak46mkdir -p "$FLATPAK_USER_DIR"47chown -R 0:0 "$FLATPAK_USER_DIR"48flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo49sdk=$(flatpak info -m "org.gnome.Sdk//$GNOME" |50 sed -n '/^\[Extension org.freedesktop.Sdk.Extension\]/,/^\[/s/^version *= *//p')51flatpak install --user -y --noninteractive --or-update flathub "org.freedesktop.Sdk.Extension.golang//$sdk"52flatpak-builder --disable-rofiles-fuse --force-clean --state-dir=state --repo=repo \53 build "src/build/linux/flatpak/$app.yml"54flatpak build-update-repo --prune --prune-depth=1 repo >/dev/null55flatpak build-bundle --runtime-repo=https://dl.flathub.org/repo/flathub.flatpakrepo \56 repo "$app.flatpak" "$app"57ls -lh "$app.flatpak"58EOF5960ssh "$builder" 'mkdir -p ~/airwaves-flatpak'61rsync -a --delete "$stage/src/" "$builder:airwaves-flatpak/src/"62rsync -a "$stage/build.sh" "$builder:airwaves-flatpak/"63ssh "$builder" "cd ~/airwaves-flatpak && docker run --rm --privileged \64 -v \"\$PWD:/work\" -w /work -e OWNER=\$(id -u):\$(id -g) -e GNOME=$gnome \65 ghcr.io/flathub-infra/flatpak-github-actions:gnome-$gnome sh build.sh"66server=${3:-$(ssh "$builder" 'tailscale ip -4' | head -1)}6768scp -q "$builder:airwaves-flatpak/$app.flatpak" "$stage/"69scp -q "$stage/$app.flatpak" "$deck:/tmp/$app.flatpak"70ssh "$deck" sh -s -- "$gnome" "$server" <<'EOF'71set -eu72app=dev.airwaves.Airwaves73gnome=$1 server=$274bundle=/tmp/$app.flatpak75trap 'rm -f "$bundle"' EXIT76flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo77flatpak install --user -y --noninteractive --or-update flathub "org.gnome.Platform//$gnome"78# H.264 and AAC for WebKitGTK's GStreamer come from codecs-extra.79codecs=$(flatpak info --user -m "org.gnome.Platform//$gnome" |80 sed -n '/^\[Extension org.freedesktop.Platform.codecs-extra\]/,/^\[/s/^version *= *//p')81flatpak install --user -y --noninteractive --or-update flathub "org.freedesktop.Platform.codecs-extra//$codecs"82first=83flatpak info --user "$app" >/dev/null 2>&1 || first=184flatpak install --user -y --noninteractive --reinstall --bundle "$bundle"85flatpak info --user "$app" | sed -n 's/^ *\(Version\|Commit\|Installed\): */ \1: /p'8687cfg=$HOME/.var/app/$app/config/airwaves/settings.json88if [ ! -f "$cfg" ]; then89 mkdir -p "$(dirname "$cfg")"90 printf '{\n "server": "%s"\n}\n' "$server" > "$cfg"91 echo "wrote $cfg (server $server)"92fi93if [ -n "$first" ]; then94 if steamos-add-to-steam "$HOME/.local/share/flatpak/exports/share/applications/$app.desktop"; then95 echo "added to Steam"96 else97 echo "could not add to Steam; add it from Desktop Mode" >&298 fi99fi100EOF