From c62108fa0b50bafbf84177cfc3df9c86ab795146 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 10 Jun 2026 09:36:51 +0200 Subject: [PATCH] Fix current theme state migration --- default/hypr/bootstrap.lua | 26 +++++++++++++++++++++++ migrations/1781063758.sh | 41 +++++++++++++++++++++++++++++++++++++ test/cli | 24 ++++++++++++++++++++++ test/shell.d/config-test.sh | 18 ++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 migrations/1781063758.sh diff --git a/default/hypr/bootstrap.lua b/default/hypr/bootstrap.lua index 583af909..d454ba8c 100644 --- a/default/hypr/bootstrap.lua +++ b/default/hypr/bootstrap.lua @@ -1,6 +1,32 @@ -- Hyprland bootstrap for Omarchy's Lua module path. local home = os.getenv("HOME") +local reload_prefixes = { + "default.hypr", + "hypr", + "omarchy.current.theme", +} + +local function should_reload_module(module) + for _, prefix in ipairs(reload_prefixes) do + if module == prefix or module:sub(1, #prefix + 1) == prefix .. "." then + return true + end + end + + return false +end + +local modules_to_reload = {} +for module in pairs(package.loaded) do + if should_reload_module(module) then + table.insert(modules_to_reload, module) + end +end + +for _, module in ipairs(modules_to_reload) do + package.loaded[module] = nil +end -- Load generated state from ~/.local/state, user modules from ~/.config, and -- Omarchy defaults from $OMARCHY_PATH. diff --git a/migrations/1781063758.sh b/migrations/1781063758.sh new file mode 100644 index 00000000..2e37051d --- /dev/null +++ b/migrations/1781063758.sh @@ -0,0 +1,41 @@ +echo "Update Hyprland Lua entrypoint to load Omarchy bootstrap" + +hyprland_config="$HOME/.config/hypr/hyprland.lua" + +if [[ -f $hyprland_config ]] && ! grep -Fq '/default/hypr/bootstrap.lua' "$hyprland_config"; then + tmp=$(mktemp) + + awk ' + BEGIN { + replaced = 0 + } + + !replaced && $0 == "-- Load user modules from ~/.config and Omarchy defaults from $OMARCHY_PATH." { + comment = $0 + got_next = getline next_line + if (got_next > 0 && next_line == "package.path = os.getenv(\"HOME\")") { + print "-- Omarchy'\''s bootstrap keeps path setup out of this user config." + print "dofile((os.getenv(\"OMARCHY_PATH\") or \"/usr/share/omarchy\") .. \"/default/hypr/bootstrap.lua\")" + replaced = 1 + + while ((getline line) > 0) { + if (line ~ /^[[:space:]]*\.\. package\.path$/) { + break + } + } + + next + } + + print comment + if (got_next > 0) { + print next_line + } + next + } + + { print } + ' "$hyprland_config" >"$tmp" + + mv "$tmp" "$hyprland_config" +fi diff --git a/test/cli b/test/cli index 2269c9cf..8de0487f 100755 --- a/test/cli +++ b/test/cli @@ -423,6 +423,30 @@ for nvim_legacy_target in \ done pass "nvim theme migration relinks current theme" +HYPR_MIGRATION_TMPDIR=$(mktemp -d) +mkdir -p "$HYPR_MIGRATION_TMPDIR/.config/hypr" +cat >"$HYPR_MIGRATION_TMPDIR/.config/hypr/hyprland.lua" <<'LUA' +-- Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/Start/ + +-- Load user modules from ~/.config and Omarchy defaults from $OMARCHY_PATH. +package.path = os.getenv("HOME") + .. "/.config/?.lua;" + .. (os.getenv("OMARCHY_PATH") or (os.getenv("HOME") .. "/.local/share/omarchy")) + .. "/?.lua;" + .. package.path + +-- All Omarchy default setups +require("default.hypr.omarchy") + +-- Add any other personal Hyprland configuration below. +o.window("Example", { workspace = "1" }) +LUA +HOME="$HYPR_MIGRATION_TMPDIR" bash -euo pipefail "$ROOT/migrations/1781063758.sh" >/dev/null +grep -Fq 'dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua")' "$HYPR_MIGRATION_TMPDIR/.config/hypr/hyprland.lua" || fail "hyprland bootstrap migration adds bootstrap" +! grep -Fq 'package.path = os.getenv("HOME")' "$HYPR_MIGRATION_TMPDIR/.config/hypr/hyprland.lua" || fail "hyprland bootstrap migration removes legacy path block" +grep -Fq 'o.window("Example", { workspace = "1" })' "$HYPR_MIGRATION_TMPDIR/.config/hypr/hyprland.lua" || fail "hyprland bootstrap migration preserves custom config" +pass "hyprland bootstrap migration updates stale user entrypoint" + cp "$NEXT_THEME/colors.toml" "$CURRENT_THEME/colors.toml" cp "$NEXT_THEME/vscode-theme.json" "$CURRENT_THEME/vscode-theme.json" diff --git a/test/shell.d/config-test.sh b/test/shell.d/config-test.sh index 7c516646..9eade041 100755 --- a/test/shell.d/config-test.sh +++ b/test/shell.d/config-test.sh @@ -7,6 +7,7 @@ source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" export PATH="$ROOT/bin:$PATH" require_command jq +require_command lua require_command python3 jq empty "$ROOT/config/omarchy/shell.json" @@ -152,6 +153,23 @@ grep -F 'package.path = home' "$ROOT/default/hypr/bootstrap.lua" >/dev/null grep -F '/.local/state/?.lua;' "$ROOT/default/hypr/bootstrap.lua" >/dev/null pass "Hyprland user entrypoint keeps package and state path bootstrap in defaults" +OMARCHY_PATH="$ROOT" lua <<'LUA' +package.loaded["default.hypr.omarchy"] = true +package.loaded["default.hypr.require_optional"] = true +package.loaded["hypr.looknfeel"] = true +package.loaded["omarchy.current.theme.hyprland"] = true +package.loaded["unrelated.module"] = true + +dofile(os.getenv("OMARCHY_PATH") .. "/default/hypr/bootstrap.lua") + +assert(package.loaded["default.hypr.omarchy"] == nil) +assert(package.loaded["default.hypr.require_optional"] == nil) +assert(package.loaded["hypr.looknfeel"] == nil) +assert(package.loaded["omarchy.current.theme.hyprland"] == nil) +assert(package.loaded["unrelated.module"] == true) +LUA +pass "Hyprland bootstrap reloads cached Omarchy config modules" + TMPDIR=$(mktemp -d) mkdir -p "$TMPDIR/home/.config/omarchy"