#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$ROOT_DIR" git restore -q bootstrap/cache/packages.php bootstrap/cache/services.php 2>/dev/null || true DIRTY="$(git status --porcelain)" DIRTY_FILTERED="$(echo "$DIRTY" | grep -vE '^( M|M ) (bootstrap/cache/(packages|services)\.php|package-lock\.json)$' || true)" if [[ -n "$DIRTY_FILTERED" ]]; then echo "Working tree is dirty. Please commit or stash changes before updating." echo "$DIRTY_FILTERED" exit 1 fi if echo "$DIRTY" | grep -qE 'package-lock\.json'; then echo "Warning: package-lock.json is modified. Continuing anyway." fi echo "Fetching latest refs..." git fetch --prune --tags echo "Checking out stable branch..." git checkout stable echo "Pulling latest stable..." git pull --ff-only resolve_php_bin() { if [[ -n "${PHP_BIN:-}" ]]; then echo "$PHP_BIN" return fi if command -v keyhelp-php84 >/dev/null 2>&1; then echo "keyhelp-php84" return fi if command -v php >/dev/null 2>&1; then echo "php" return fi echo "php" } PHP_BIN="$(resolve_php_bin)" echo "Resolved PHP binary: $PHP_BIN" if command -v "$PHP_BIN" >/dev/null 2>&1; then echo "PHP version ($PHP_BIN): $($PHP_BIN -v | head -n 1)" else echo "PHP binary '$PHP_BIN' not found in PATH." fi echo "Installing PHP dependencies..." COMPOSER_BIN="$(command -v composer || true)" if [[ -z "$COMPOSER_BIN" ]]; then echo "Composer not found in PATH." exit 1 fi $PHP_BIN "$COMPOSER_BIN" install --no-dev --optimize-autoloader if [[ -x "artisan" ]]; then CONFIGURED_PHP="$($PHP_BIN artisan tinker --execute="echo \\App\\Models\\Setting::where('key','system.php_binary')->value('value') ?? '';" 2>/dev/null || true)" if [[ -n "$CONFIGURED_PHP" ]]; then if command -v "$CONFIGURED_PHP" >/dev/null 2>&1; then PHP_BIN="$CONFIGURED_PHP" elif [[ -x "$CONFIGURED_PHP" ]]; then PHP_BIN="$CONFIGURED_PHP" fi fi fi echo "Final PHP binary: $PHP_BIN" if command -v "$PHP_BIN" >/dev/null 2>&1; then echo "Final PHP version ($PHP_BIN): $($PHP_BIN -v | head -n 1)" fi echo "Installing JS dependencies..." npm install echo "Building assets..." npm run build echo "Running migrations..." $PHP_BIN artisan migrate --force echo "Syncing version/build to settings..." VERSION="$($PHP_BIN -r '$c=json_decode(file_get_contents("composer.json"), true); echo $c["version"] ?? "";')" BUILD="$($PHP_BIN -r '$c=json_decode(file_get_contents("composer.json"), true); echo $c["build"] ?? "";')" if [[ -n "$VERSION" || -n "$BUILD" ]]; then $PHP_BIN -r ' require "vendor/autoload.php"; $app = require "bootstrap/app.php"; $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); if (getenv("SPEEDBB_VERSION")) { \App\Models\Setting::updateOrCreate(["key" => "version"], ["value" => getenv("SPEEDBB_VERSION")]); } if (getenv("SPEEDBB_BUILD")) { \App\Models\Setting::updateOrCreate(["key" => "build"], ["value" => getenv("SPEEDBB_BUILD")]); } ' \ SPEEDBB_VERSION="$VERSION" \ SPEEDBB_BUILD="$BUILD" fi echo "Update complete."