#!/bin/bash # omarchy:summary=Run pending Omarchy migrations. # omarchy:args=[--pending] set -euo pipefail mode="run" usage() { echo "Usage: omarchy-migrate [--pending]" } while (($#)); do case "$1" in --pending|--check) mode="pending" shift ;; -h|--help) usage exit 0 ;; *) echo "Unknown option: $1" >&2 exit 1 ;; esac done OMARCHY_PATH="${OMARCHY_PATH:-/usr/share/omarchy}" STATE_DIR="${OMARCHY_MIGRATION_STATE:-$HOME/.local/state/omarchy/migrations}" MIGRATIONS_DIR="$OMARCHY_PATH/migrations" migration_entries() { [[ -d $MIGRATIONS_DIR ]] || return 0 local file filename for file in "$MIGRATIONS_DIR"/*.sh; do [[ -f $file ]] || continue filename=$(basename "$file") printf '%s\t%s\t%s\n' "$filename" "$file" "$STATE_DIR/$filename" done } pending_migrations() { local name file marker while IFS=$'\t' read -r name file marker; do [[ -n $name ]] || continue if [[ ! -f $marker ]]; then printf '%s\n' "$name" fi done < <(migration_entries) } if [[ $mode == "pending" ]]; then pending_output=$(pending_migrations) if [[ -n $pending_output ]]; then printf '%s\n' "$pending_output" exit 0 else exit 1 fi fi wait_for_pacman_transaction() { local lock_file=/var/lib/pacman/db.lck [[ -e $lock_file ]] || return 0 echo "Waiting for pacman transaction to finish before running Omarchy migrations..." for _ in {1..900}; do [[ -e $lock_file ]] || return 0 sleep 1 done echo "Pacman transaction is still running; Omarchy migrations will retry on next login." exit 0 } wait_for_pacman_transaction mkdir -p "$STATE_DIR" [[ -d $MIGRATIONS_DIR ]] || exit 0 while IFS=$'\t' read -r name file marker; do [[ -n $name ]] || continue if [[ ! -f $marker ]]; then echo -e "\e[32m\nRunning migration (${name%.sh})\e[0m" OMARCHY_PATH="$OMARCHY_PATH" bash -euo pipefail "$file" mkdir -p "$(dirname "$marker")" touch "$marker" fi done < <(migration_entries) # Clear a login-time notification the user left sitting there and then resolved # by running migrations some other way. The substring matches both the current # and legacy notification titles. omarchy-notification-dismiss "Omarchy Migrations" >/dev/null 2>&1 || true