refactor(hyprlua): move hypr-usr/ into hypr/usr/ and wire sysupdate sync
Device-specific Lua configs (monitors, binds, input, etc.) previously lived
in a top-level hypr-usr/ sibling to hypr/. They now live inside hypr/usr/
so all hypr-related configs sit under one directory tree.
- git mv hypr-usr/ → hypr/usr/
- hyprland.lua: require() calls updated to require("usr.*")
- input.lua: require("input-device-exceptions") → require("usr.input-device-exceptions")
- hyprpaper.conf + monitorhandler.sh + wallpaper-picker: wallpaper.conf path
updated from ~/.config/wallpaper.conf → ~/.config/hypr/usr/wallpaper.conf
- monitorhandler.sh: fix stale desktopenvs/hyprland/ → desktopenvs/hyprlua/
- binds.lua: edit-binds keybind path corrected to ~/.config/hypr/usr/binds.lua
- helpmenu.sh: update binds.lua source path
- updater.conf: SOURCE_BASE fixed (hyprland→hyprlua), config hypr except usr,
remove flat hypr-usr entry
- update-configs.sh: add "except <subdirs>" support for the config type
- hyprlua.sh installer: remove now-redundant hypr-usr copy lines
- migrate-hyprland-to-hyprlua.sh: deploy from hypr/usr/ instead of hypr-usr/
- sysupdate.sh: add CONFIG SYNC section with _migrate_hypr_usr() which moves
old flat-layout files into usr/ (case 1) or copies fresh from dotfiles when
no local config exists (case 2); fallback copy preserves hypr/usr/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main^2
parent
9638fd337a
commit
7fd0e37061
|
|
@ -3,6 +3,14 @@
|
||||||
#
|
#
|
||||||
# Config: ~/.config/config-updater/updater.conf
|
# Config: ~/.config/config-updater/updater.conf
|
||||||
# Manifest: ~/.config/config-updater/manifest
|
# Manifest: ~/.config/config-updater/manifest
|
||||||
|
#
|
||||||
|
# Syntax in updater.conf:
|
||||||
|
# config <name> [except <sub1> <sub2> ...]
|
||||||
|
# copy SOURCE_BASE/<name> to ~/.config/<name>, optionally skipping subdirs
|
||||||
|
# flat <name>
|
||||||
|
# copy contents of SOURCE_BASE/<name> directly into ~/.config/
|
||||||
|
# ignore <name>
|
||||||
|
# present in source but intentionally not managed here
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
|
@ -23,6 +31,7 @@ die() { err "$*"; exit 1; }
|
||||||
# ── parse updater.conf ────────────────────────────────────────────────────────
|
# ── parse updater.conf ────────────────────────────────────────────────────────
|
||||||
SOURCE_BASE=""
|
SOURCE_BASE=""
|
||||||
declare -A ENTRY_TYPE # name → config | flat | ignore
|
declare -A ENTRY_TYPE # name → config | flat | ignore
|
||||||
|
declare -A ENTRY_EXCL # name → space-separated list of excluded subdirs
|
||||||
|
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
line="${line%%#*}"
|
line="${line%%#*}"
|
||||||
|
|
@ -36,10 +45,19 @@ while IFS= read -r line; do
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
read -r type name _rest <<< "$line"
|
read -r type name rest <<< "$line"
|
||||||
[[ -z "${name:-}" ]] && continue
|
[[ -z "${name:-}" ]] && continue
|
||||||
|
|
||||||
case "$type" in
|
case "$type" in
|
||||||
config|flat|ignore) ENTRY_TYPE["$name"]="$type" ;;
|
config|flat|ignore)
|
||||||
|
ENTRY_TYPE["$name"]="$type"
|
||||||
|
# Parse optional "except sub1 sub2 ..."
|
||||||
|
if [[ "${rest:-}" =~ ^except[[:space:]]+(.+)$ ]]; then
|
||||||
|
ENTRY_EXCL["$name"]="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
ENTRY_EXCL["$name"]=""
|
||||||
|
fi
|
||||||
|
;;
|
||||||
*) warn "Unknown type '$type' for '$name' — skipping" ;;
|
*) warn "Unknown type '$type' for '$name' — skipping" ;;
|
||||||
esac
|
esac
|
||||||
done < "$CONF_FILE"
|
done < "$CONF_FILE"
|
||||||
|
|
@ -91,11 +109,35 @@ for name in "${!ENTRY_TYPE[@]}"; do
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
excl="${ENTRY_EXCL[$name]:-}"
|
||||||
|
|
||||||
case "$type" in
|
case "$type" in
|
||||||
config)
|
config)
|
||||||
rm -rf "${TARGET:?}/${name}"
|
if [[ -z "$excl" ]]; then
|
||||||
cp -r "$src" "$TARGET/$name"
|
rm -rf "${TARGET:?}/${name}"
|
||||||
ok "config $name"
|
cp -r "$src" "$TARGET/$name"
|
||||||
|
ok "config $name"
|
||||||
|
else
|
||||||
|
# Copy all top-level items of $src except excluded subdirs
|
||||||
|
mkdir -p "${TARGET}/${name}"
|
||||||
|
item_errors=0
|
||||||
|
while IFS= read -r -d '' item; do
|
||||||
|
item_name="$(basename "$item")"
|
||||||
|
skip_item=false
|
||||||
|
for e in $excl; do
|
||||||
|
[[ "$item_name" == "$e" ]] && skip_item=true && break
|
||||||
|
done
|
||||||
|
[[ "$skip_item" == true ]] && continue
|
||||||
|
rm -rf "${TARGET:?}/${name}/${item_name}"
|
||||||
|
cp -r "$item" "${TARGET}/${name}/" || (( item_errors++ )) || true
|
||||||
|
done < <(find "$src" -maxdepth 1 -mindepth 1 -print0 | sort -z)
|
||||||
|
if (( item_errors > 0 )); then
|
||||||
|
err "config $name (${item_errors} error(s))"
|
||||||
|
(( errors++ )) || true
|
||||||
|
else
|
||||||
|
ok "config $name (excl: $excl)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
flat)
|
flat)
|
||||||
[[ -d "$src" ]] || {
|
[[ -d "$src" ]] || {
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,14 @@
|
||||||
# (for installation-specific files that live at the ~/.config root)
|
# (for installation-specific files that live at the ~/.config root)
|
||||||
# ignore <name> present in source but intentionally not managed here
|
# ignore <name> present in source but intentionally not managed here
|
||||||
|
|
||||||
SOURCE_BASE = ~/Dotfiles/desktopenvs/hyprland
|
SOURCE_BASE = ~/Dotfiles/desktopenvs/hyprlua
|
||||||
|
|
||||||
# ── deployed as ~/.config/<name> ─────────────────────────────────────────────
|
# ── deployed as ~/.config/<name> ─────────────────────────────────────────────
|
||||||
config alacritty
|
config alacritty
|
||||||
config btop
|
config btop
|
||||||
config dunst
|
config dunst
|
||||||
config gtk-3.0
|
config gtk-3.0
|
||||||
config hypr
|
config hypr except usr
|
||||||
config kitty
|
config kitty
|
||||||
config mimeapps.list
|
config mimeapps.list
|
||||||
config nwg-dock-hyprland
|
config nwg-dock-hyprland
|
||||||
|
|
@ -27,9 +27,6 @@ config walker
|
||||||
config wofi
|
config wofi
|
||||||
config xfce4
|
config xfce4
|
||||||
|
|
||||||
# ── flat: directory contents copied directly into ~/.config/ ──────────────────
|
|
||||||
flat hypr-usr # installation-specific: binds, monitors, autostart, etc.
|
|
||||||
|
|
||||||
# ── intentionally not managed here ───────────────────────────────────────────
|
# ── intentionally not managed here ───────────────────────────────────────────
|
||||||
ignore config-updater # the updater itself
|
ignore config-updater # the updater itself
|
||||||
ignore CRT # referenced from dotfiles path directly in binds.conf
|
ignore CRT # referenced from dotfiles path directly in binds.conf
|
||||||
|
|
@ -40,3 +37,7 @@ ignore greetd-tuigreet # deployed to /etc/greetd/ at install time
|
||||||
ignore spicetify # managed separately (spicetify handles its own config)
|
ignore spicetify # managed separately (spicetify handles its own config)
|
||||||
ignore Vencord # managed separately
|
ignore Vencord # managed separately
|
||||||
ignore waybar # present but inactive; eww bar is used instead
|
ignore waybar # present but inactive; eww bar is used instead
|
||||||
|
# hypr/usr/ contains device-specific lua files (monitors, binds, input, etc.).
|
||||||
|
# They are excluded from automated syncs to preserve per-device customisations.
|
||||||
|
# Deploy manually on a new device:
|
||||||
|
# cp -r ~/Dotfiles/desktopenvs/hyprlua/hypr/usr/ ~/.config/hypr/
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
-- Hyprland Lua config — https://wiki.hypr.land/Configuring/Start/
|
-- Hyprland Lua config — https://wiki.hypr.land/Configuring/Start/
|
||||||
-- User-side files are required from ~/.config/hypr/ alongside this file.
|
-- Device-specific files live in ~/.config/hypr/usr/ (deployed from hypr/usr/).
|
||||||
|
|
||||||
require("monitors")
|
require("usr.monitors")
|
||||||
require("envvars")
|
require("usr.envvars")
|
||||||
require("input")
|
require("usr.input")
|
||||||
require("binds")
|
require("usr.binds")
|
||||||
require("windowrules")
|
require("usr.windowrules")
|
||||||
require("autostart")
|
require("usr.autostart")
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
---- MY PROGRAMS ---
|
---- MY PROGRAMS ---
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@ wallpaper {
|
||||||
}
|
}
|
||||||
|
|
||||||
# per-monitor state, written by ~/.config/scripts/wallpaper-picker
|
# per-monitor state, written by ~/.config/scripts/wallpaper-picker
|
||||||
source = ~/.config/wallpaper.conf
|
source = ~/.config/hypr/usr/wallpaper.conf
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ hl.bind(mainMod .. " + W", hl.dsp.exec_cmd("[tag +centered-L] kitt
|
||||||
hl.bind(mainMod .. " + CTRL + R", hl.dsp.exec_cmd("[tag +centered-L] kitty -e ~/.config/scripts/amssh"))
|
hl.bind(mainMod .. " + CTRL + R", hl.dsp.exec_cmd("[tag +centered-L] kitty -e ~/.config/scripts/amssh"))
|
||||||
hl.bind(mainMod .. " + F1", hl.dsp.exec_cmd("[tag +centered] kitty ~/.config/scripts/helpmenu.sh"))
|
hl.bind(mainMod .. " + F1", hl.dsp.exec_cmd("[tag +centered] kitty ~/.config/scripts/helpmenu.sh"))
|
||||||
hl.bind(mainMod .. " + CTRL + T", hl.dsp.exec_cmd("[tag +centered-S] kitty bash ~/.config/scripts/timer-pick"))
|
hl.bind(mainMod .. " + CTRL + T", hl.dsp.exec_cmd("[tag +centered-S] kitty bash ~/.config/scripts/timer-pick"))
|
||||||
hl.bind(mainMod .. " + SHIFT + F1", hl.dsp.exec_cmd("[tag +centered-L] kitty nvim ~/.config/binds.lua"))
|
hl.bind(mainMod .. " + SHIFT + F1", hl.dsp.exec_cmd("[tag +centered-L] kitty nvim ~/.config/hypr/usr/binds.lua"))
|
||||||
|
|
||||||
hl.bind(mainMod .. " + CTRL + P", hl.dsp.exec_cmd("~/.config/scripts/screenrec.sh"))
|
hl.bind(mainMod .. " + CTRL + P", hl.dsp.exec_cmd("~/.config/scripts/screenrec.sh"))
|
||||||
|
|
||||||
|
|
@ -15,4 +15,4 @@ hl.config({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
require("input-device-exceptions")
|
require("usr.input-device-exceptions")
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
cat ~/Dotfiles/desktopenvs/hyprlua/hypr-usr/binds.lua | less
|
cat ~/Dotfiles/desktopenvs/hyprlua/hypr/usr/binds.lua | less
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
hyprpaper -c ~/.config/wallpaper.conf
|
hyprpaper -c ~/.config/hypr/usr/wallpaper.conf
|
||||||
~/Dotfiles/desktopenvs/hyprland/scripts/ewwstart.sh
|
~/Dotfiles/desktopenvs/hyprlua/scripts/ewwstart.sh
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ set -u
|
||||||
|
|
||||||
VERBOSE=0
|
VERBOSE=0
|
||||||
DIR=""
|
DIR=""
|
||||||
STATE_FILE="${HOME}/.config/wallpaper.conf"
|
STATE_FILE="${HOME}/.config/hypr/usr/wallpaper.conf"
|
||||||
HYPRLOCK_BG_FILE="${HOME}/.config/hypr/hyprlock-backgrounds.conf"
|
HYPRLOCK_BG_FILE="${HOME}/.config/hypr/hyprlock-backgrounds.conf"
|
||||||
FIT_MODE="cover"
|
FIT_MODE="cover"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,8 +99,8 @@ done
|
||||||
|
|
||||||
# ── swap hypr-usr (the part that actually differs) ────────────────────────────
|
# ── swap hypr-usr (the part that actually differs) ────────────────────────────
|
||||||
# hyprland: *.conf files live at ~/.config/ root (sourced by hyprland.conf)
|
# hyprland: *.conf files live at ~/.config/ root (sourced by hyprland.conf)
|
||||||
# hyprlua: *.lua files live at ~/.config/hypr/ (required by hyprland.lua)
|
# hyprlua: device-specific files live at ~/.config/hypr/usr/
|
||||||
# wallpaper.conf stays at ~/.config/ root (hyprpaper still reads it)
|
# (required via require("usr.*") in hyprland.lua)
|
||||||
|
|
||||||
printf '\n'
|
printf '\n'
|
||||||
|
|
||||||
|
|
@ -108,20 +108,17 @@ printf '\n'
|
||||||
for f in "${HYPR_USR_CONFS[@]}"; do
|
for f in "${HYPR_USR_CONFS[@]}"; do
|
||||||
[[ -f "$TARGET/$f" ]] && run "rm '$TARGET/$f'" && note "removed ~/.config/$f"
|
[[ -f "$TARGET/$f" ]] && run "rm '$TARGET/$f'" && note "removed ~/.config/$f"
|
||||||
done
|
done
|
||||||
|
# Remove wallpaper.conf from ~/.config/ root if present (old location)
|
||||||
|
[[ -f "$TARGET/wallpaper.conf" ]] && run "rm '$TARGET/wallpaper.conf'" && note "removed ~/.config/wallpaper.conf"
|
||||||
|
|
||||||
# Deploy new .lua files into ~/.config/hypr/
|
# Deploy device-specific files into ~/.config/hypr/usr/
|
||||||
if [[ -d "$SRC/hypr-usr" ]]; then
|
if [[ -d "$SRC/hypr/usr" ]]; then
|
||||||
run "mkdir -p '$TARGET/hypr'"
|
run "mkdir -p '$TARGET/hypr/usr'"
|
||||||
for lua in "$SRC/hypr-usr"/*.lua; do
|
for f in "$SRC/hypr/usr"/*; do
|
||||||
[[ -e "$lua" ]] || continue
|
[[ -e "$f" ]] || continue
|
||||||
run "cp '$lua' '$TARGET/hypr/'"
|
run "cp '$f' '$TARGET/hypr/usr/'"
|
||||||
ok "hypr-usr $(basename "$lua") → ~/.config/hypr/"
|
ok "hypr/usr $(basename "$f") → ~/.config/hypr/usr/"
|
||||||
done
|
done
|
||||||
# wallpaper.conf stays at ~/.config/ root
|
|
||||||
if [[ -f "$SRC/hypr-usr/wallpaper.conf" ]]; then
|
|
||||||
run "cp '$SRC/hypr-usr/wallpaper.conf' '$TARGET/'"
|
|
||||||
ok "hypr-usr wallpaper.conf → ~/.config/"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── update config-updater ─────────────────────────────────────────────────────
|
# ── update config-updater ─────────────────────────────────────────────────────
|
||||||
|
|
|
||||||
|
|
@ -103,11 +103,8 @@ for cfg in "${CONFIGS[@]}"; do
|
||||||
rm -rf ~/.config/"$cfg"
|
rm -rf ~/.config/"$cfg"
|
||||||
cp -r ~/Dotfiles/desktopenvs/hyprlua/"$cfg" ~/.config/
|
cp -r ~/Dotfiles/desktopenvs/hyprlua/"$cfg" ~/.config/
|
||||||
done
|
done
|
||||||
|
# hypr/usr/ (device-specific) is already inside hypr/ and copied above.
|
||||||
# User-side Lua files live inside ~/.config/hypr/ so require() finds them
|
# Customise ~/.config/hypr/usr/ per device after install.
|
||||||
cp ~/Dotfiles/desktopenvs/hyprlua/hypr-usr/*.lua ~/.config/hypr/
|
|
||||||
# wallpaper.conf stays at ~/.config/ for hyprpaper
|
|
||||||
cp ~/Dotfiles/desktopenvs/hyprlua/hypr-usr/wallpaper.conf ~/.config/
|
|
||||||
|
|
||||||
cp ~/Dotfiles/colors.conf ~/.config/colors.conf
|
cp ~/Dotfiles/colors.conf ~/.config/colors.conf
|
||||||
|
|
||||||
|
|
|
||||||
173
sysupdate.sh
173
sysupdate.sh
|
|
@ -14,6 +14,7 @@ set -uo pipefail
|
||||||
readonly STATE_FILE="/updatestate"
|
readonly STATE_FILE="/updatestate"
|
||||||
readonly SCRIPT_PREFIX="/updatescript"
|
readonly SCRIPT_PREFIX="/updatescript"
|
||||||
readonly NEWS_FEED="https://archlinux.org/feeds/news/"
|
readonly NEWS_FEED="https://archlinux.org/feeds/news/"
|
||||||
|
DOTFILES="${DOTFILES:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
|
||||||
|
|
||||||
AI_MODE=false
|
AI_MODE=false
|
||||||
for _arg in "$@"; do [[ "$_arg" == "--AI" ]] && AI_MODE=true; done
|
for _arg in "$@"; do [[ "$_arg" == "--AI" ]] && AI_MODE=true; done
|
||||||
|
|
@ -485,6 +486,169 @@ PROMPT_EOF
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
# CONFIG SYNC
|
||||||
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
# Items always skipped in the direct-copy fallback (managed by separate
|
||||||
|
# installers, or intentionally not auto-synced). hypr/usr/ (device-specific)
|
||||||
|
# is handled separately inside the copy loop rather than via this list.
|
||||||
|
declare -a _CFG_SKIP=(
|
||||||
|
config-updater # meta: the updater script itself
|
||||||
|
CRT eww eww-nobattery eww-touch greetd-tuigreet spicetify Vencord waybar
|
||||||
|
)
|
||||||
|
|
||||||
|
# Resolve the dotfiles DE source directory for the current machine.
|
||||||
|
# Priority: installed updater.conf SOURCE_BASE → running session detection.
|
||||||
|
_de_source_dir() {
|
||||||
|
local conf="${XDG_CONFIG_HOME:-$HOME/.config}/config-updater/updater.conf"
|
||||||
|
if [[ -f "$conf" ]]; then
|
||||||
|
local src
|
||||||
|
src=$(awk -F'[[:space:]]*=[[:space:]]*' '/^SOURCE_BASE/{print $2; exit}' "$conf")
|
||||||
|
src="${src/#\~/$HOME}"
|
||||||
|
[[ -d "${src:-}" ]] && printf '%s' "$src" && return
|
||||||
|
fi
|
||||||
|
if pgrep -x Hyprland &>/dev/null || [[ -n "${HYPRLAND_INSTANCE_SIGNATURE:-}" ]]; then
|
||||||
|
printf '%s' "$DOTFILES/desktopenvs/hyprlua"
|
||||||
|
elif pgrep -x niri &>/dev/null || [[ -n "${NIRI_SOCKET:-}" ]]; then
|
||||||
|
printf '%s' "$DOTFILES/desktopenvs/niri"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Detect and offer to migrate the old hyprlua flat layout:
|
||||||
|
# old: ~/.config/hypr/monitors.lua etc. (pre-usr/ era)
|
||||||
|
# new: ~/.config/hypr/usr/monitors.lua
|
||||||
|
_migrate_hypr_usr() {
|
||||||
|
local target="${XDG_CONFIG_HOME:-$HOME/.config}"
|
||||||
|
local hypr_dir="$target/hypr"
|
||||||
|
local usr_dir="$hypr_dir/usr"
|
||||||
|
|
||||||
|
# Already in the right place — nothing to do
|
||||||
|
[[ -d "$usr_dir" ]] && return 0
|
||||||
|
|
||||||
|
# ── Case 1: old flat layout — lua files at ~/.config/hypr/ root ──────────
|
||||||
|
if [[ -d "$hypr_dir" ]]; then
|
||||||
|
local -a old_files=()
|
||||||
|
for f in monitors.lua envvars.lua input.lua binds.lua windowrules.lua \
|
||||||
|
autostart.lua input-device-exceptions.lua; do
|
||||||
|
[[ -f "$hypr_dir/$f" ]] && old_files+=("$f")
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#old_files[@]} -gt 0 ]]; then
|
||||||
|
echo
|
||||||
|
warn "Old hyprlua layout: device-specific files at ${BO}~/.config/hypr/${RS} root."
|
||||||
|
warn "New location: ${BO}~/.config/hypr/usr/${RS}"
|
||||||
|
echo
|
||||||
|
if ! ask "Migrate now?"; then
|
||||||
|
warn "Skipped — hyprland.lua will fail to start until migrated."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
mkdir -p "$usr_dir"
|
||||||
|
for f in "${old_files[@]}"; do
|
||||||
|
mv "$hypr_dir/$f" "$usr_dir/"
|
||||||
|
ok "moved hypr/$f → hypr/usr/$f"
|
||||||
|
done
|
||||||
|
if [[ -f "$target/wallpaper.conf" && ! -f "$usr_dir/wallpaper.conf" ]]; then
|
||||||
|
mv "$target/wallpaper.conf" "$usr_dir/wallpaper.conf"
|
||||||
|
ok "moved wallpaper.conf → hypr/usr/wallpaper.conf"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
ok "Migration complete — device configs now at ${BO}~/.config/hypr/usr/${RS}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Case 2: no usr/ and no old files — copy template from dotfiles ───────
|
||||||
|
local de_dir; de_dir=$(_de_source_dir)
|
||||||
|
local src_usr="${de_dir:+$de_dir/hypr/usr}"
|
||||||
|
if [[ -n "${src_usr:-}" && -d "$src_usr" ]]; then
|
||||||
|
mkdir -p "$usr_dir"
|
||||||
|
cp -r "$src_usr/." "$usr_dir/"
|
||||||
|
ok "Copied ${BO}hypr/usr/${RS} from dotfiles ${DI}(no local config found)${RS}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sync_configs() {
|
||||||
|
section "Config Sync"
|
||||||
|
|
||||||
|
# ── Migration: old flat layout → hypr/usr/ ───────────────────────────────
|
||||||
|
_migrate_hypr_usr
|
||||||
|
|
||||||
|
# ── Preferred: use the installed update-configs.sh ───────────────────────
|
||||||
|
local cfg_script
|
||||||
|
for cfg_script in "$HOME/update-configs.sh" \
|
||||||
|
"${XDG_CONFIG_HOME:-$HOME/.config}/config-updater/update-configs.sh"; do
|
||||||
|
[[ -x "$cfg_script" ]] && break || cfg_script=""
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "${cfg_script:-}" ]]; then
|
||||||
|
log "Using installed config-updater (${DI}${cfg_script}${RS})"
|
||||||
|
echo
|
||||||
|
if "$cfg_script"; then
|
||||||
|
echo
|
||||||
|
ok "Config sync complete"
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
warn "Config sync completed with errors"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Fallback: direct copy from dotfiles ──────────────────────────────────
|
||||||
|
local de_dir; de_dir=$(_de_source_dir)
|
||||||
|
if [[ -z "${de_dir:-}" || ! -d "$de_dir" ]]; then
|
||||||
|
warn "Cannot determine DE source directory — config sync skipped"
|
||||||
|
warn "Hint: deploy config-updater or ensure a supported DE session is running"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local target="${XDG_CONFIG_HOME:-$HOME/.config}"
|
||||||
|
log "Source → ${BO}${de_dir}${RS}"
|
||||||
|
log "Target → ${BO}${target}${RS}"
|
||||||
|
warn "${BO}hypr/usr/${RS} preserved (device-specific — customise manually)"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local synced=0 errs=0
|
||||||
|
while IFS= read -r -d '' item; do
|
||||||
|
local name; name="$(basename "$item")"
|
||||||
|
local skip=false
|
||||||
|
for s in "${_CFG_SKIP[@]}"; do [[ "$name" == "$s" ]] && skip=true && break; done
|
||||||
|
[[ "$skip" == true ]] && continue
|
||||||
|
|
||||||
|
if [[ "$name" == "hypr" ]]; then
|
||||||
|
# Copy hypr/ contents but preserve ~/.config/hypr/usr/
|
||||||
|
mkdir -p "$target/hypr"
|
||||||
|
local hypr_ok=true
|
||||||
|
while IFS= read -r -d '' hitem; do
|
||||||
|
local hname; hname="$(basename "$hitem")"
|
||||||
|
[[ "$hname" == "usr" ]] && continue
|
||||||
|
rm -rf "${target}/hypr/${hname}" && cp -r "$hitem" "$target/hypr/" \
|
||||||
|
|| hypr_ok=false
|
||||||
|
done < <(find "$item" -maxdepth 1 -mindepth 1 -print0 | sort -z)
|
||||||
|
if $hypr_ok; then
|
||||||
|
ok "synced hypr ${DI}(usr/ preserved)${RS}"
|
||||||
|
(( synced++ )) || true
|
||||||
|
else
|
||||||
|
err "failed hypr"
|
||||||
|
(( errs++ )) || true
|
||||||
|
fi
|
||||||
|
elif rm -rf "${target:?}/${name}" && cp -r "$item" "$target/"; then
|
||||||
|
ok "synced ${name}"
|
||||||
|
(( synced++ )) || true
|
||||||
|
else
|
||||||
|
err "failed ${name}"
|
||||||
|
(( errs++ )) || true
|
||||||
|
fi
|
||||||
|
done < <(find "$de_dir" -maxdepth 1 -mindepth 1 -not -name '.*' -print0 | sort -z)
|
||||||
|
|
||||||
|
echo
|
||||||
|
if (( errs > 0 )); then
|
||||||
|
warn "Config sync: ${synced} synced, ${errs} error(s)"
|
||||||
|
else
|
||||||
|
ok "Config sync: ${BO}${synced}${RS} config(s) synced"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
# MAIN
|
# MAIN
|
||||||
# ═══════════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
@ -526,6 +690,10 @@ main() {
|
||||||
echo
|
echo
|
||||||
ok "${BO}System is up to date.${RS}"
|
ok "${BO}System is up to date.${RS}"
|
||||||
write_state
|
write_state
|
||||||
|
echo
|
||||||
|
if ask "Sync dotfiles configs to ~/.config?"; then
|
||||||
|
sync_configs
|
||||||
|
fi
|
||||||
rm -f "$_NEWS_PY"
|
rm -f "$_NEWS_PY"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
@ -678,6 +846,11 @@ main() {
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
# ── Config sync ──────────────────────────────────────────────────────────
|
||||||
|
if ask "Sync dotfiles configs to ~/.config?"; then
|
||||||
|
sync_configs
|
||||||
|
fi
|
||||||
|
|
||||||
rm -f "$_NEWS_PY"
|
rm -f "$_NEWS_PY"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue