|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +version="0.16.0" |
| 5 | +sha256="01feb8263fe7a450b0a9fed0fd54cf88947aaf00f86cc7da345f8b39a0e7bd30" |
| 6 | +archive_url="https://gitlab.gnome.org/GNOME/blueprint-compiler/-/archive/v${version}/blueprint-compiler-v${version}.tar.gz" |
| 7 | +prefix="${1:-${RUNNER_TEMP:-/tmp}/taskers-blueprint-compiler}" |
| 8 | + |
| 9 | +require_command() { |
| 10 | + local command_name="$1" |
| 11 | + if ! command -v "$command_name" >/dev/null 2>&1; then |
| 12 | + printf 'missing required command: %s\n' "$command_name" >&2 |
| 13 | + exit 1 |
| 14 | + fi |
| 15 | +} |
| 16 | + |
| 17 | +version_at_least() { |
| 18 | + python3 - "$1" "$2" <<'PY' |
| 19 | +import sys |
| 20 | +
|
| 21 | +def normalize(value: str) -> tuple[int, ...]: |
| 22 | + return tuple(int(part) for part in value.strip().split(".")) |
| 23 | +
|
| 24 | +current = normalize(sys.argv[1]) |
| 25 | +minimum = normalize(sys.argv[2]) |
| 26 | +sys.exit(0 if current >= minimum else 1) |
| 27 | +PY |
| 28 | +} |
| 29 | + |
| 30 | +installed_version() { |
| 31 | + local binary_path="$1" |
| 32 | + "$binary_path" --version | awk '{print $NF}' |
| 33 | +} |
| 34 | + |
| 35 | +require_command python3 |
| 36 | +require_command tar |
| 37 | +require_command meson |
| 38 | +require_command ninja |
| 39 | + |
| 40 | +existing_binary="$prefix/bin/blueprint-compiler" |
| 41 | +if [[ -x "$existing_binary" ]]; then |
| 42 | + current_version="$(installed_version "$existing_binary")" |
| 43 | + if version_at_least "$current_version" "$version"; then |
| 44 | + printf 'blueprint-compiler %s already installed at %s\n' "$current_version" "$prefix" |
| 45 | + exit 0 |
| 46 | + fi |
| 47 | +fi |
| 48 | + |
| 49 | +work_dir="$(mktemp -d "${TMPDIR:-/tmp}/taskers-blueprint.XXXXXX")" |
| 50 | +archive_path="$work_dir/blueprint-compiler-v${version}.tar.gz" |
| 51 | +source_dir="$work_dir/blueprint-compiler-v${version}" |
| 52 | +build_dir="$work_dir/build" |
| 53 | + |
| 54 | +cleanup() { |
| 55 | + rm -rf "$work_dir" |
| 56 | +} |
| 57 | +trap cleanup EXIT |
| 58 | + |
| 59 | +python3 - "$archive_url" "$archive_path" "$sha256" <<'PY' |
| 60 | +import hashlib |
| 61 | +import pathlib |
| 62 | +import sys |
| 63 | +import urllib.request |
| 64 | +
|
| 65 | +url, dest, expected = sys.argv[1:4] |
| 66 | +data = urllib.request.urlopen(url, timeout=60).read() |
| 67 | +digest = hashlib.sha256(data).hexdigest() |
| 68 | +if digest != expected: |
| 69 | + raise SystemExit(f"blueprint-compiler sha256 mismatch: expected {expected}, got {digest}") |
| 70 | +pathlib.Path(dest).write_bytes(data) |
| 71 | +PY |
| 72 | + |
| 73 | +tar -xf "$archive_path" -C "$work_dir" |
| 74 | +rm -rf "$prefix" |
| 75 | +meson setup "$build_dir" "$source_dir" --prefix "$prefix" |
| 76 | +meson install -C "$build_dir" |
| 77 | + |
| 78 | +current_version="$(installed_version "$prefix/bin/blueprint-compiler")" |
| 79 | +if ! version_at_least "$current_version" "$version"; then |
| 80 | + printf 'expected blueprint-compiler >= %s, got %s\n' "$version" "$current_version" >&2 |
| 81 | + exit 1 |
| 82 | +fi |
| 83 | + |
| 84 | +printf '%s\n' "$prefix" |
0 commit comments