Graduately/installers/maturita-installer-macos.command
pepaskopec-blip 737e27deb0 Publish builds to a branch instead of to releases.
Releases and version numbers are gone. CI now rebuilds all three platforms
on every change to main and commits the packages to the `builds` branch,
so what anyone downloads is the current state of the repository. The
branch is rewritten from scratch each time rather than added to, so the
repository keeps one copy of the packages instead of a ~70 MB set per
commit.

Without tags there is no version to compare, so a build carries the
commit it was made from and the branch carries a VERSION file naming the
same commit. The updater fetches those few bytes and treats any
difference as being behind; commits are not ordered, and the branch only
ever holds the current build.

The installers fetch from the branch over raw.githubusercontent.com for
the same reason.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 15:40:47 +02:00

75 lines
2.3 KiB
Bash
Executable file

#!/bin/sh
# maturita.c installer for macOS.
#
# Carries no application of its own: it downloads the current build straight
# from the repository's `builds` branch, which CI rewrites whenever main
# changes. This file therefore never goes stale.
#
# Double-click the file to run it. The app updates itself from then on.
set -eu
REPO="pepaskopec-blip/maturita.c"
BRANCH="builds"
ASSET="maturita-macos-arm64.zip"
URL="https://raw.githubusercontent.com/$REPO/$BRANCH/$ASSET"
say() { printf '%s\n' "$*"; }
die() { printf '\nError: %s\n' "$*" >&2; printf 'Press Return to close. '; read -r _; exit 1; }
say "Installing maturita.C"
say "---------------------"
# Only Apple Silicon builds are published; Rosetta cannot run an arm64 app.
arch=$(uname -m)
if [ "$arch" != "arm64" ]; then
die "this build is for Apple Silicon Macs, but this one reports '$arch'.
Build from source instead: https://github.com/$REPO"
fi
command -v curl >/dev/null 2>&1 || die "curl was not found."
# Prefer the shared folder, fall back to the user's own when it is locked down.
if [ -w /Applications ]; then
dest_dir="/Applications"
else
dest_dir="$HOME/Applications"
mkdir -p "$dest_dir"
fi
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT INT TERM
say "Downloading the latest release..."
curl -fL --progress-bar -o "$tmp/$ASSET" "$URL" ||
die "the download failed. Check your internet connection."
say "Unpacking..."
mkdir -p "$tmp/new"
# ditto keeps bundle symlinks and permissions intact, unlike plain unzip.
ditto -x -k "$tmp/$ASSET" "$tmp/new" || die "the archive could not be unpacked."
app=$(find "$tmp/new" -maxdepth 1 -name '*.app' -print -quit)
[ -n "$app" ] || die "the archive did not contain an application."
name=$(basename "$app")
say "Installing to $dest_dir/$name"
rm -rf "$dest_dir/$name.old"
if [ -e "$dest_dir/$name" ]; then
mv "$dest_dir/$name" "$dest_dir/$name.old"
fi
if mv "$app" "$dest_dir/$name"; then
rm -rf "$dest_dir/$name.old"
else
# Put the previous copy back rather than leaving nothing installed.
[ -e "$dest_dir/$name.old" ] && mv "$dest_dir/$name.old" "$dest_dir/$name"
die "could not write to $dest_dir."
fi
# The download carries a quarantine flag, and the app is not signed, so
# without this macOS refuses to open it.
xattr -cr "$dest_dir/$name" 2>/dev/null || true
say ""
say "Done. Starting the app..."
open "$dest_dir/$name"