#!/bin/bash # Builds the todo Flutter app and installs it as an Arch Linux package via pacman. # Run from anywhere — uses the directory of this script as the repo root. # Requires: flutter, base-devel (provides makepkg), sudo for pacman. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # The desktop app is a Flutter *web* build served by a small local wrapper. # Flutter's Linux embedder only reaches ~20fps at 4K on this hardware, while # the same Dart code in Chrome sustains ~144fps — see # docs/desktop-performance-findings.md for the measurements. WEB_DIR="$SCRIPT_DIR/build/web" WRAPPER_BUNDLE="$SCRIPT_DIR/build/cli/bundle" WORK_DIR="$(mktemp -d)" cleanup() { rm -rf "$WORK_DIR"; } trap cleanup EXIT # Parse version from pubspec.yaml (strip build number: 1.0.0+1 → 1.0.0) PKGVER="$(grep '^version:' "$SCRIPT_DIR/pubspec.yaml" | sed 's/^version:[[:space:]]*//' | sed 's/+.*//')" echo "==> Building todo $PKGVER (Flutter web release)..." cd "$SCRIPT_DIR" flutter build web --release echo "==> Compiling the desktop wrapper..." # AOT-compiled so the installed package needs no Dart SDK at run time. # `dart build cli`, not `dart compile exe`: the package pulls in dependencies # with native build hooks (sqlite3, objective_c), which `dart compile` refuses # to handle even though the wrapper itself uses none of them. # --target is required since bin/ also holds the todo_note CLI: with two # entry points `dart build cli` refuses to guess and the install aborts. rm -rf "$SCRIPT_DIR/build/cli" dart build cli -t "$SCRIPT_DIR/bin/todo_desktop.dart" -o "$SCRIPT_DIR/build/cli" echo "==> Generating PKGBUILD..." # pkgname is 'todo-flutter', NOT 'todo': the AUR already ships an unrelated # package literally named 'todo' (a todo.txt CLI). Sharing the name made pacman # treat them as one package — `yay -Sua` kept trying to "upgrade" this app to # the AUR tool. conflicts/replaces let a clean upgrade supersede any stray # 'todo' still installed under the old name. cat > "$WORK_DIR/PKGBUILD" < "\$pkgdir/usr/bin/todo" <<'WRAPPER' #!/bin/bash exec /opt/todo/bin/todo_desktop "\$@" WRAPPER chmod 755 "\$pkgdir/usr/bin/todo" } EOF # Remove any package still installed under the old 'todo' name (this app's # prior builds, or the unrelated AUR 'todo' CLI). Both own /usr/bin/todo and # would cause a file conflict when todo-flutter installs. -Rdd skips dep checks # so an installed todo-debug can't block removal. for stale in todo todo-debug; do if pacman -Qq "$stale" &>/dev/null; then echo "==> Removing stale '$stale' package (name-collision cleanup)..." sudo pacman -Rdd --noconfirm "$stale" fi done echo "==> Installing package via makepkg..." cd "$WORK_DIR" makepkg -sif --noconfirm # Remove stale wrappers that shadow /usr/bin/todo from the package. # ~/.local/bin and /usr/local/bin both precede /usr/bin in PATH. if [[ -f "$HOME/.local/bin/todo" ]]; then echo "==> Removing old ~/.local/bin/todo..." rm "$HOME/.local/bin/todo" fi if [[ -f "/usr/local/bin/todo" ]]; then echo "==> Removing old /usr/local/bin/todo (requires sudo)..." sudo rm "/usr/local/bin/todo" fi echo "==> Done. 'todo' now runs version $PKGVER installed via pacman."