Finish v4 upgrade cleanup
This commit is contained in:
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Overwrite the user config for fastfetch with the Omarchy default.
|
|
||||||
|
|
||||||
omarchy-refresh-config fastfetch/config.jsonc
|
|
||||||
+400
-44
@@ -146,6 +146,30 @@ run_as_user_session() {
|
|||||||
"$@"
|
"$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
package_installed_exact() {
|
||||||
|
local pkg="$1"
|
||||||
|
pacman -Qq "$pkg" 2>/dev/null | grep -Fxq "$pkg"
|
||||||
|
}
|
||||||
|
|
||||||
|
mark_packages_explicit() {
|
||||||
|
local pkg installed_pkg
|
||||||
|
local installed_packages=()
|
||||||
|
|
||||||
|
for pkg in "$@"; do
|
||||||
|
# pacman -Qq resolves installed providers too (for example nvim -> neovim),
|
||||||
|
# while package_installed_exact intentionally does not.
|
||||||
|
installed_pkg=$(pacman -Qq "$pkg" 2>/dev/null | head -n1 || true)
|
||||||
|
[[ -n $installed_pkg ]] && installed_packages+=("$installed_pkg")
|
||||||
|
done
|
||||||
|
|
||||||
|
((${#installed_packages[@]})) || return 0
|
||||||
|
mapfile -t installed_packages < <(printf '%s\n' "${installed_packages[@]}" | sort -u)
|
||||||
|
|
||||||
|
if ! as_root pacman -D --asexplicit "${installed_packages[@]}" >/dev/null; then
|
||||||
|
warn "Could not mark installed default packages as explicit; retired-package cleanup may leave extra dependencies installed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
target_hyprland_pid() {
|
target_hyprland_pid() {
|
||||||
pgrep -u "$target_uid" -x Hyprland 2>/dev/null | head -n1 || true
|
pgrep -u "$target_uid" -x Hyprland 2>/dev/null | head -n1 || true
|
||||||
}
|
}
|
||||||
@@ -416,6 +440,59 @@ remove_legacy_installer_package() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remove_legacy_limine_configs() {
|
||||||
|
# Mirrors the old 1762446739 migration: old Limine installs sometimes left
|
||||||
|
# alternate limine.conf files in paths Limine searches before /boot/limine.conf.
|
||||||
|
# If any are still present, Limine may ignore the package-managed default config.
|
||||||
|
local canonical_limine_config=/boot/limine.conf
|
||||||
|
local legacy_limine_configs=(
|
||||||
|
/boot/EFI/arch-limine/limine.conf
|
||||||
|
/boot/EFI/limine/limine.conf
|
||||||
|
/boot/EFI/BOOT/limine.conf
|
||||||
|
/boot/limine/limine.conf
|
||||||
|
)
|
||||||
|
local legacy_limine_config
|
||||||
|
local found_legacy_limine_configs=()
|
||||||
|
|
||||||
|
for legacy_limine_config in "${legacy_limine_configs[@]}"; do
|
||||||
|
if as_root test -f "$legacy_limine_config"; then
|
||||||
|
found_legacy_limine_configs+=("$legacy_limine_config")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
((${#found_legacy_limine_configs[@]})) || return 0
|
||||||
|
|
||||||
|
if ! as_root test -f "$canonical_limine_config"; then
|
||||||
|
fail "Legacy Limine configs exist (${found_legacy_limine_configs[*]}) but $canonical_limine_config does not. Do not reboot until the bootloader config is repaired."
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Removing legacy alternate Limine configs"
|
||||||
|
as_root rm -f "${found_legacy_limine_configs[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
normalize_limine_config() {
|
||||||
|
local machine_id legacy_uki
|
||||||
|
|
||||||
|
as_root test -f /boot/limine.conf || return 0
|
||||||
|
|
||||||
|
log "Normalizing Limine config"
|
||||||
|
# Mirrors old 1777570652: normalize British/American spelling, the old color
|
||||||
|
# index, and help colors that pre-4 installs may never have migrated.
|
||||||
|
as_root sed -i -E 's/^interface_branding_colou?r: 2$/interface_branding_color: 9ece6a/' /boot/limine.conf
|
||||||
|
as_root sed -i 's/^interface_branding_colour: /interface_branding_color: /' /boot/limine.conf
|
||||||
|
as_root sed -i -E '/^interface_help_colou?r(_bright)?:/d' /boot/limine.conf
|
||||||
|
as_root sed -i '/^interface_branding_color:/a interface_help_color_bright: 9ece6a' /boot/limine.conf
|
||||||
|
as_root sed -i '/^interface_branding_color:/a interface_help_color: 9ece6a' /boot/limine.conf
|
||||||
|
|
||||||
|
# Pre-4 custom-UKI installs used <machine-id>_linux.efi. Omarchy 4 uses the
|
||||||
|
# stable omarchy_linux.efi path generated by limine-entry-tool.
|
||||||
|
machine_id=$(as_root cat /etc/machine-id 2>/dev/null || true)
|
||||||
|
legacy_uki="/boot/EFI/Linux/${machine_id}_linux.efi"
|
||||||
|
if [[ -n $machine_id ]] && as_root test -f /boot/EFI/Linux/omarchy_linux.efi && as_root test -f "$legacy_uki"; then
|
||||||
|
as_root rm -f "$legacy_uki"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
remove_conflicting_legacy_packages() {
|
remove_conflicting_legacy_packages() {
|
||||||
# Remove legacy packages that are known to conflict with Omarchy 4 defaults
|
# Remove legacy packages that are known to conflict with Omarchy 4 defaults
|
||||||
# before the main package transaction. Broader retired-package cleanup runs
|
# before the main package transaction. Broader retired-package cleanup runs
|
||||||
@@ -435,7 +512,7 @@ remove_conflicting_legacy_packages() {
|
|||||||
|
|
||||||
local pkg
|
local pkg
|
||||||
for pkg in "${conflicting_packages[@]}"; do
|
for pkg in "${conflicting_packages[@]}"; do
|
||||||
if pacman -Q "$pkg" >/dev/null 2>&1; then
|
if package_installed_exact "$pkg"; then
|
||||||
# Some pre-4 meta packages depend on these retired/default packages. We
|
# Some pre-4 meta packages depend on these retired/default packages. We
|
||||||
# intentionally break those old dependency edges before installing the
|
# intentionally break those old dependency edges before installing the
|
||||||
# Omarchy 4 meta, otherwise pacman prompts to remove conflicts (for
|
# Omarchy 4 meta, otherwise pacman prompts to remove conflicts (for
|
||||||
@@ -446,6 +523,17 @@ remove_conflicting_legacy_packages() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
migrate_1password_beta_package() {
|
||||||
|
if ! package_installed_exact 1password-beta && ! package_installed_exact 1password-beta-bin; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Replacing 1Password Beta with stable 1Password"
|
||||||
|
if ! as_root pacman -S --noconfirm --ask 4 1password; then
|
||||||
|
warn "Could not replace 1Password Beta with stable 1Password; leaving the existing 1Password package installed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
install_omarchy_4_packages() {
|
install_omarchy_4_packages() {
|
||||||
# omarchy-limine and omarchy-dev-tools are no longer separate packages:
|
# omarchy-limine and omarchy-dev-tools are no longer separate packages:
|
||||||
# omarchy-limine's content (bootloader + snapper configs) folded into
|
# omarchy-limine's content (bootloader + snapper configs) folded into
|
||||||
@@ -457,19 +545,25 @@ install_omarchy_4_packages() {
|
|||||||
omarchy-settings
|
omarchy-settings
|
||||||
omarchy-nvim
|
omarchy-nvim
|
||||||
omarchy
|
omarchy
|
||||||
|
# checkupdates support for update tooling
|
||||||
|
fakeroot
|
||||||
|
pacman-contrib
|
||||||
)
|
)
|
||||||
|
local base_packages=()
|
||||||
|
|
||||||
log "Installing Omarchy 4 packages"
|
log "Installing Omarchy 4 packages"
|
||||||
# --noconfirm answers "no" to conflict-removal prompts. --ask 4 preselects
|
# --noconfirm answers "no" to conflict-removal prompts. --ask 4 preselects
|
||||||
# removing the conflicting package, which is required for legacy packages like
|
# removing the conflicting package, which is required for legacy packages like
|
||||||
# ttf-jetbrains-mono-nerd -> ttf-jetbrains-mono-nerd-basic.
|
# ttf-jetbrains-mono-nerd -> ttf-jetbrains-mono-nerd-basic.
|
||||||
as_root pacman -Syu --needed --noconfirm --ask 4 --overwrite='*' "${core_packages[@]}"
|
as_root env OMARCHY_UPDATE_PACMAN=1 pacman -Syu --needed --noconfirm --ask 4 --overwrite='*' "${core_packages[@]}"
|
||||||
|
mark_packages_explicit "${core_packages[@]}"
|
||||||
|
|
||||||
if [[ -f /usr/share/omarchy/install/omarchy-base.packages ]]; then
|
if [[ -f /usr/share/omarchy/install/omarchy-base.packages ]]; then
|
||||||
log "Installing Omarchy 4 default package set"
|
log "Installing Omarchy 4 default package set"
|
||||||
mapfile -t base_packages < <(sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' /usr/share/omarchy/install/omarchy-base.packages)
|
mapfile -t base_packages < <(sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' /usr/share/omarchy/install/omarchy-base.packages)
|
||||||
if (( ${#base_packages[@]} )); then
|
if (( ${#base_packages[@]} )); then
|
||||||
as_root pacman -S --needed --noconfirm --ask 4 --overwrite='*' "${base_packages[@]}"
|
as_root pacman -S --needed --noconfirm --ask 4 --overwrite='*' "${base_packages[@]}"
|
||||||
|
mark_packages_explicit "${base_packages[@]}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
warn "/usr/share/omarchy/install/omarchy-base.packages was not found; skipping default package set install."
|
warn "/usr/share/omarchy/install/omarchy-base.packages was not found; skipping default package set install."
|
||||||
@@ -488,13 +582,11 @@ install_omarchy_4_packages() {
|
|||||||
wireplumber
|
wireplumber
|
||||||
)
|
)
|
||||||
as_root pacman -S --needed --noconfirm --ask 4 --overwrite='*' "${audio_packages[@]}"
|
as_root pacman -S --needed --noconfirm --ask 4 --overwrite='*' "${audio_packages[@]}"
|
||||||
|
mark_packages_explicit "${audio_packages[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_retired_default_packages() {
|
remove_retired_default_packages() {
|
||||||
local retired_packages=(
|
local retired_packages=(
|
||||||
1password-beta
|
|
||||||
1password-cli
|
|
||||||
alacritty
|
|
||||||
asdcontrol-git
|
asdcontrol-git
|
||||||
blueberry
|
blueberry
|
||||||
bluetui
|
bluetui
|
||||||
@@ -517,7 +609,6 @@ remove_retired_default_packages() {
|
|||||||
elephant-websearch
|
elephant-websearch
|
||||||
fcitx5-configtool
|
fcitx5-configtool
|
||||||
gcc14
|
gcc14
|
||||||
github-cli
|
|
||||||
hypridle
|
hypridle
|
||||||
hyprlock
|
hyprlock
|
||||||
impala
|
impala
|
||||||
@@ -538,10 +629,9 @@ remove_retired_default_packages() {
|
|||||||
playerctl
|
playerctl
|
||||||
polkit-gnome
|
polkit-gnome
|
||||||
qt5-remoteobjects
|
qt5-remoteobjects
|
||||||
signal-desktop
|
|
||||||
spotify
|
|
||||||
swaybg
|
swaybg
|
||||||
swayosd
|
swayosd
|
||||||
|
walker-bin
|
||||||
ttf-jetbrains-mono
|
ttf-jetbrains-mono
|
||||||
ttf-jetbrains-mono-nerd
|
ttf-jetbrains-mono-nerd
|
||||||
vlc
|
vlc
|
||||||
@@ -559,7 +649,7 @@ remove_retired_default_packages() {
|
|||||||
local pkg
|
local pkg
|
||||||
local installed_retired=()
|
local installed_retired=()
|
||||||
for pkg in "${retired_packages[@]}"; do
|
for pkg in "${retired_packages[@]}"; do
|
||||||
if pacman -Q "$pkg" >/dev/null 2>&1; then
|
if package_installed_exact "$pkg"; then
|
||||||
installed_retired+=("$pkg")
|
installed_retired+=("$pkg")
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -594,7 +684,7 @@ remove_retired_default_packages() {
|
|||||||
read -r -a group_packages <<<"$group"
|
read -r -a group_packages <<<"$group"
|
||||||
installed_group=()
|
installed_group=()
|
||||||
for group_pkg in "${group_packages[@]}"; do
|
for group_pkg in "${group_packages[@]}"; do
|
||||||
if pacman -Q "$group_pkg" >/dev/null 2>&1; then
|
if package_installed_exact "$group_pkg"; then
|
||||||
installed_group+=("$group_pkg")
|
installed_group+=("$group_pkg")
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -608,7 +698,7 @@ remove_retired_default_packages() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
for pkg in "${installed_retired[@]}"; do
|
for pkg in "${installed_retired[@]}"; do
|
||||||
pacman -Q "$pkg" >/dev/null 2>&1 || continue
|
package_installed_exact "$pkg" || continue
|
||||||
|
|
||||||
if pacman -Rs --print "$pkg" >/dev/null 2>&1; then
|
if pacman -Rs --print "$pkg" >/dev/null 2>&1; then
|
||||||
as_root pacman -Rns --noconfirm --ask 4 "$pkg" || warn "Could not remove retired package '$pkg'; leaving it installed."
|
as_root pacman -Rns --noconfirm --ask 4 "$pkg" || warn "Could not remove retired package '$pkg'; leaving it installed."
|
||||||
@@ -643,18 +733,118 @@ if [[ -d $local_bin ]]; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
legacy_hypr_config_active() {
|
||||||
|
local hyprland_conf="$TARGET_HOME/.config/hypr/hyprland.conf"
|
||||||
|
[[ -f $hyprland_conf ]] || return 1
|
||||||
|
grep -q '\.local/share/omarchy/default/hypr' "$hyprland_conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
populate_legacy_hypr_defaults() {
|
||||||
|
local shim_hypr_dir="$1" backup="$2" tmp_dir clone_dir archive_dir
|
||||||
|
|
||||||
|
rm -rf "$shim_hypr_dir"
|
||||||
|
mkdir -p "$shim_hypr_dir"
|
||||||
|
tmp_dir=$(mktemp -d)
|
||||||
|
clone_dir="$tmp_dir/omarchy"
|
||||||
|
archive_dir="$tmp_dir/archive"
|
||||||
|
|
||||||
|
if command -v git >/dev/null 2>&1; then
|
||||||
|
if git clone --depth 1 --branch master --single-branch --filter=blob:none --sparse https://github.com/basecamp/omarchy.git "$clone_dir" >/dev/null 2>&1 && \
|
||||||
|
git -C "$clone_dir" sparse-checkout set default/hypr >/dev/null 2>&1 && \
|
||||||
|
[[ -d $clone_dir/default/hypr ]]; then
|
||||||
|
cp -a "$clone_dir/default/hypr/." "$shim_hypr_dir/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! find "$shim_hypr_dir" -type f -name '*.conf' -print -quit | grep -q .; then
|
||||||
|
if command -v curl >/dev/null 2>&1 && command -v tar >/dev/null 2>&1; then
|
||||||
|
mkdir -p "$archive_dir"
|
||||||
|
if curl -fsSL https://github.com/basecamp/omarchy/archive/refs/heads/master.tar.gz | tar -xz -C "$archive_dir"; then
|
||||||
|
if [[ -d $archive_dir/omarchy-master/default/hypr ]]; then
|
||||||
|
cp -a "$archive_dir/omarchy-master/default/hypr/." "$shim_hypr_dir/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! find "$shim_hypr_dir" -type f -name '*.conf' -print -quit | grep -q .; then
|
||||||
|
if [[ -n $backup && -d $backup/default/hypr ]]; then
|
||||||
|
cp -a "$backup/default/hypr/." "$shim_hypr_dir/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$tmp_dir"
|
||||||
|
find "$shim_hypr_dir" -type f -name '*.conf' -print -quit | grep -q .
|
||||||
|
}
|
||||||
|
|
||||||
|
create_live_omarchy_overlay() {
|
||||||
|
local backup="$1" compat_root shim_hypr_dir entry base cleanup_hook
|
||||||
|
|
||||||
|
compat_root="$TARGET_HOME/.local/state/omarchy/upgrade-to-4-live-omarchy"
|
||||||
|
shim_hypr_dir="$TARGET_HOME/.local/state/omarchy/upgrade-to-4-hypr-defaults"
|
||||||
|
|
||||||
|
populate_legacy_hypr_defaults "$shim_hypr_dir" "$backup" || return 1
|
||||||
|
|
||||||
|
rm -rf "$compat_root"
|
||||||
|
mkdir -p "$compat_root/default"
|
||||||
|
|
||||||
|
shopt -s dotglob nullglob
|
||||||
|
for entry in /usr/share/omarchy/* /usr/share/omarchy/.[!.]* /usr/share/omarchy/..?*; do
|
||||||
|
[[ -e $entry ]] || continue
|
||||||
|
base=$(basename "$entry")
|
||||||
|
[[ $base == default ]] && continue
|
||||||
|
ln -s "$entry" "$compat_root/$base"
|
||||||
|
done
|
||||||
|
for entry in /usr/share/omarchy/default/* /usr/share/omarchy/default/.[!.]* /usr/share/omarchy/default/..?*; do
|
||||||
|
[[ -e $entry ]] || continue
|
||||||
|
base=$(basename "$entry")
|
||||||
|
[[ $base == hypr ]] && continue
|
||||||
|
ln -s "$entry" "$compat_root/default/$base"
|
||||||
|
done
|
||||||
|
ln -s "$shim_hypr_dir" "$compat_root/default/hypr"
|
||||||
|
|
||||||
|
cleanup_hook="$TARGET_HOME/.config/omarchy/hooks/post-boot.d/cleanup-upgrade-to-4-live-shim"
|
||||||
|
mkdir -p "$(dirname "$cleanup_hook")"
|
||||||
|
cat >"$cleanup_hook" <<CLEANUP_HOOK
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
legacy_root="\$HOME/.local/share/omarchy"
|
||||||
|
compat_root="$compat_root"
|
||||||
|
shim_hypr_dir="$shim_hypr_dir"
|
||||||
|
if [[ -L \$legacy_root && \$(readlink "\$legacy_root") == "\$compat_root" ]]; then
|
||||||
|
ln -sfn /usr/share/omarchy "\$legacy_root"
|
||||||
|
fi
|
||||||
|
rm -rf "\$compat_root" "\$shim_hypr_dir"
|
||||||
|
rm -f "\$0"
|
||||||
|
CLEANUP_HOOK
|
||||||
|
chmod +x "$cleanup_hook"
|
||||||
|
|
||||||
|
printf '%s\n' "$compat_root"
|
||||||
|
}
|
||||||
|
|
||||||
# Existing terminals still have OMARCHY_PATH=$HOME/.local/share/omarchy and
|
# Existing terminals still have OMARCHY_PATH=$HOME/.local/share/omarchy and
|
||||||
# often have $OMARCHY_PATH/bin early in PATH. Make that stale path resolve to
|
# often have $OMARCHY_PATH/bin early in PATH. Make that stale path resolve to
|
||||||
# the package-backed tree for the rest of the live session, while backing up
|
# the package-backed tree for the rest of the live session, while backing up
|
||||||
# the old git checkout for inspection/rollback.
|
# the old git checkout for inspection/rollback. If the live Hyprland session is
|
||||||
|
# still using legacy ~/.config/hypr/*.conf files, keep those user files in place
|
||||||
|
# and provide a temporary default/hypr/*.conf shim so reloads do not explode.
|
||||||
if [[ -e /usr/share/omarchy ]]; then
|
if [[ -e /usr/share/omarchy ]]; then
|
||||||
mkdir -p "$TARGET_HOME/.local/share"
|
mkdir -p "$TARGET_HOME/.local/share"
|
||||||
|
backup=""
|
||||||
if [[ -L $legacy_root ]]; then
|
if [[ -L $legacy_root ]]; then
|
||||||
ln -sfn /usr/share/omarchy "$legacy_root"
|
rm -f "$legacy_root"
|
||||||
elif [[ -e $legacy_root ]]; then
|
elif [[ -e $legacy_root ]]; then
|
||||||
backup="$legacy_root.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
backup="$legacy_root.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
||||||
mv "$legacy_root" "$backup"
|
mv "$legacy_root" "$backup"
|
||||||
ln -sfn /usr/share/omarchy "$legacy_root"
|
fi
|
||||||
|
|
||||||
|
if legacy_hypr_config_active; then
|
||||||
|
if compat_root=$(create_live_omarchy_overlay "$backup"); then
|
||||||
|
ln -sfn "$compat_root" "$legacy_root"
|
||||||
|
else
|
||||||
|
echo "Warning: Could not prepare legacy Hyprland conf shim; linking ~/.local/share/omarchy directly to /usr/share/omarchy." >&2
|
||||||
|
ln -sfn /usr/share/omarchy "$legacy_root"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
ln -sfn /usr/share/omarchy "$legacy_root"
|
ln -sfn /usr/share/omarchy "$legacy_root"
|
||||||
fi
|
fi
|
||||||
@@ -873,20 +1063,6 @@ restore_hyprland_config_reload() {
|
|||||||
hyprland_config_reload_suppressed=0
|
hyprland_config_reload_suppressed=0
|
||||||
}
|
}
|
||||||
|
|
||||||
reload_hyprland_config_after_upgrade() {
|
|
||||||
log "Reloading Hyprland config with a full reset"
|
|
||||||
|
|
||||||
if run_hyprctl_session reload full-reset >/dev/null 2>&1; then
|
|
||||||
restore_hyprland_config_reload
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
warn "hyprctl reload full-reset failed; trying a regular Hyprland reload. If this session is still running an older Hyprland, reboot will complete the cutover."
|
|
||||||
if ! run_hyprctl_session reload >/dev/null 2>&1; then
|
|
||||||
warn "Could not reload the live Hyprland session; the new config will load after reboot."
|
|
||||||
fi
|
|
||||||
restore_hyprland_config_reload
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_system_service() {
|
enable_system_service() {
|
||||||
local unit="$1"
|
local unit="$1"
|
||||||
@@ -910,6 +1086,26 @@ apply_firewall_defaults() {
|
|||||||
enable_system_service ufw.service
|
enable_system_service ufw.service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root_filesystem_encrypted() {
|
||||||
|
local root_source root_type
|
||||||
|
|
||||||
|
root_source=$(findmnt -n -o SOURCE / 2>/dev/null || true)
|
||||||
|
[[ $root_source == /dev/mapper/* ]] && return 0
|
||||||
|
|
||||||
|
if [[ -n $root_source ]]; then
|
||||||
|
root_type=$(lsblk -no TYPE "$root_source" 2>/dev/null | head -n1 || true)
|
||||||
|
[[ $root_type == crypt ]] && return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
as_root bash -c '[[ -s /etc/crypttab ]] && grep -qvE "^[[:space:]]*(#|$)" /etc/crypttab' >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
should_enable_sddm_autologin() {
|
||||||
|
as_root test -f /etc/sddm.conf.d/autologin.conf && return 0
|
||||||
|
as_root systemctl is-enabled omarchy-seamless-login.service >/dev/null 2>&1 && return 0
|
||||||
|
root_filesystem_encrypted
|
||||||
|
}
|
||||||
|
|
||||||
apply_system_transition() {
|
apply_system_transition() {
|
||||||
log "Applying Omarchy 4 system transition"
|
log "Applying Omarchy 4 system transition"
|
||||||
[[ -d /usr/share/omarchy ]] || fail "/usr/share/omarchy was not installed."
|
[[ -d /usr/share/omarchy ]] || fail "/usr/share/omarchy was not installed."
|
||||||
@@ -952,6 +1148,11 @@ EOF
|
|||||||
"bip": "172.17.0.1/16"
|
"bip": "172.17.0.1/16"
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
as_root ln -sfn ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
||||||
|
|
||||||
|
# Fresh Omarchy socket-activates Docker. Disable the old always-on service if
|
||||||
|
# an upgraded install had enabled it, but do not stop running containers mid-upgrade.
|
||||||
|
as_root systemctl disable docker.service >/dev/null 2>&1 || true
|
||||||
|
|
||||||
enable_system_service cups.service
|
enable_system_service cups.service
|
||||||
enable_system_service cups-browsed.service
|
enable_system_service cups-browsed.service
|
||||||
@@ -960,6 +1161,7 @@ EOF
|
|||||||
enable_system_service docker.socket
|
enable_system_service docker.socket
|
||||||
enable_system_service systemd-resolved.service
|
enable_system_service systemd-resolved.service
|
||||||
enable_system_service NetworkManager.service
|
enable_system_service NetworkManager.service
|
||||||
|
enable_system_service bluetooth.service
|
||||||
enable_system_service power-profiles-daemon.service
|
enable_system_service power-profiles-daemon.service
|
||||||
enable_system_service sddm.service
|
enable_system_service sddm.service
|
||||||
|
|
||||||
@@ -984,15 +1186,19 @@ RememberLastUser=true
|
|||||||
RememberLastSession=true
|
RememberLastSession=true
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if as_root test -f /etc/sddm.conf.d/autologin.conf; then
|
local autologin_user
|
||||||
local autologin_user
|
if should_enable_sddm_autologin; then
|
||||||
autologin_user=$(as_root awk -F= '/^User=/ { print $2; exit }' /etc/sddm.conf.d/autologin.conf 2>/dev/null || true)
|
if as_root test -f /etc/sddm.conf.d/autologin.conf; then
|
||||||
[[ -n $autologin_user ]] || autologin_user="$target_user"
|
autologin_user=$(as_root awk -F= '/^User=/ { print $2; exit }' /etc/sddm.conf.d/autologin.conf 2>/dev/null || true)
|
||||||
|
fi
|
||||||
|
[[ -n ${autologin_user:-} ]] || autologin_user="$target_user"
|
||||||
cat <<EOF | as_root tee /etc/sddm.conf.d/autologin.conf >/dev/null
|
cat <<EOF | as_root tee /etc/sddm.conf.d/autologin.conf >/dev/null
|
||||||
[Autologin]
|
[Autologin]
|
||||||
User=$autologin_user
|
User=$autologin_user
|
||||||
Session=omarchy.desktop
|
Session=omarchy.desktop
|
||||||
EOF
|
EOF
|
||||||
|
else
|
||||||
|
as_root rm -f /etc/sddm.conf.d/autologin.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
as_root install -d -m 0755 -o sddm -g sddm /var/lib/sddm 2>/dev/null || as_root install -d -m 0755 /var/lib/sddm
|
as_root install -d -m 0755 -o sddm -g sddm /var/lib/sddm 2>/dev/null || as_root install -d -m 0755 /var/lib/sddm
|
||||||
@@ -1077,17 +1283,7 @@ refresh chromium-flags.conf 3d52925a48ac3704f9427ecec70310d9c89be5442c41ece18312
|
|||||||
refresh chromium-flags.conf 4bc8710615d2151464e9bd6d1123fbfbb8f56dea4cf0568320bc7b50d24ad205
|
refresh chromium-flags.conf 4bc8710615d2151464e9bd6d1123fbfbb8f56dea4cf0568320bc7b50d24ad205
|
||||||
refresh chromium-flags.conf 1df1a5282f9525bfbb97a697c8169c08c1adb2b5a4de5ae94d84df7b4a78f2fc
|
refresh chromium-flags.conf 1df1a5282f9525bfbb97a697c8169c08c1adb2b5a4de5ae94d84df7b4a78f2fc
|
||||||
refresh chromium-flags.conf 0408c524892830f5cf43e94c389b897cbc093ede312f49a4627bfabf692653c2
|
refresh chromium-flags.conf 0408c524892830f5cf43e94c389b897cbc093ede312f49a4627bfabf692653c2
|
||||||
refresh fastfetch/config.jsonc 6adebf87d93902fb4bc68824a8e7c71e482846af23fea199e489c5496f791590
|
|
||||||
refresh fastfetch/config.jsonc fe61d9f7cfac800adb7bd21f75f1bfcca266c609b6efa02a6e25303ac192e86e
|
|
||||||
refresh fastfetch/config.jsonc 62fa26fa5fb8e11d31c5ec9f3a53b9b6b1124b29134b19329a092878ff624581
|
|
||||||
refresh fastfetch/config.jsonc 22565532d139ab8c2ddb21dcfe56460dc9f2f8a712b8d29f125c1c8b29beca37
|
|
||||||
refresh fastfetch/config.jsonc b65cb9ca36eed45929bfc35443762b14957d3847f6bed361a338224a87450e3a
|
|
||||||
refresh fastfetch/config.jsonc 3d153225131d3031b99b2e1a07e84d22cd0e51fcae1e701b08f6b6a558bc7a9c
|
|
||||||
refresh fastfetch/config.jsonc 404d0273c380cfdad4a037fa87202fc1d96be178c867e8a9d27b0a772f6e2fa1
|
|
||||||
refresh fastfetch/config.jsonc 4a98ff77ed46109d08ef7301249ea6823d1abba6c39c0871680feebf96620bf2
|
|
||||||
refresh fastfetch/config.jsonc c827c3a24f64c418d309244a8a967def0c522d824addf65d8ee0741afbc970bd
|
|
||||||
refresh fastfetch/config.jsonc c909b43ba000887cd418d9eaf98c1c9c5ba938aa27f9246cf8fa5662946c4e87
|
|
||||||
refresh fastfetch/config.jsonc b2e5757851f0703edb8bcfc4b51a00bf5e303c1df26b8c63e6b7df6be4ead4ed
|
|
||||||
refresh fcitx5/conf/clipboard.conf 2d53b40811ee7ceb71c7db0422a3ed733647f389379a57dbf2915d522dff4193
|
refresh fcitx5/conf/clipboard.conf 2d53b40811ee7ceb71c7db0422a3ed733647f389379a57dbf2915d522dff4193
|
||||||
refresh fcitx5/conf/xcb.conf f5cf059182c4361fa7b16d5149f20a09eb1e0915f4463ba60dae626b86df7d9c
|
refresh fcitx5/conf/xcb.conf f5cf059182c4361fa7b16d5149f20a09eb1e0915f4463ba60dae626b86df7d9c
|
||||||
refresh foot/foot.ini 52e30647172522459b2179af714c19b62a35fe11bc23c49839fda5dca3253e84
|
refresh foot/foot.ini 52e30647172522459b2179af714c19b62a35fe11bc23c49839fda5dca3253e84
|
||||||
@@ -1147,6 +1343,7 @@ refresh xournalpp/settings.xml 1c1a9efbf1b6dc7813bf3440fd5bf8409fc283e8d0192ca29
|
|||||||
# (hash mismatch) are kept active as backups.
|
# (hash mismatch) are kept active as backups.
|
||||||
# Legacy ~/.config path -> package-owned destination (where the file now lives):
|
# Legacy ~/.config path -> package-owned destination (where the file now lives):
|
||||||
# environment.d/fcitx.conf -> /usr/lib/environment.d/10-omarchy-fcitx.conf
|
# environment.d/fcitx.conf -> /usr/lib/environment.d/10-omarchy-fcitx.conf
|
||||||
|
# fastfetch/config.jsonc -> /etc/fastfetch/config.jsonc
|
||||||
# fontconfig/fonts.conf -> /usr/share/fontconfig/conf.avail/30-omarchy.conf
|
# fontconfig/fonts.conf -> /usr/share/fontconfig/conf.avail/30-omarchy.conf
|
||||||
# mimeapps.list -> /usr/share/applications/mimeapps.list
|
# mimeapps.list -> /usr/share/applications/mimeapps.list
|
||||||
# omarchy.ttf -> /usr/share/fonts/omarchy/omarchy.ttf
|
# omarchy.ttf -> /usr/share/fonts/omarchy/omarchy.ttf
|
||||||
@@ -1158,6 +1355,24 @@ refresh xournalpp/settings.xml 1c1a9efbf1b6dc7813bf3440fd5bf8409fc283e8d0192ca29
|
|||||||
# xdg-terminals.list -> /usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list
|
# xdg-terminals.list -> /usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list
|
||||||
retire environment.d/fcitx.conf faacbd703a8f797013968b235fec6289a9c921d3ec7b7f8b4e1cd24392f68b9c
|
retire environment.d/fcitx.conf faacbd703a8f797013968b235fec6289a9c921d3ec7b7f8b4e1cd24392f68b9c
|
||||||
retire environment.d/fcitx.conf 8b077b6ea2594dc1d4b57592a3bc62703df4959e86b93ea0fc488b6686309095
|
retire environment.d/fcitx.conf 8b077b6ea2594dc1d4b57592a3bc62703df4959e86b93ea0fc488b6686309095
|
||||||
|
retire fastfetch/config.jsonc 6adebf87d93902fb4bc68824a8e7c71e482846af23fea199e489c5496f791590
|
||||||
|
retire fastfetch/config.jsonc fe61d9f7cfac800adb7bd21f75f1bfcca266c609b6efa02a6e25303ac192e86e
|
||||||
|
retire fastfetch/config.jsonc 62fa26fa5fb8e11d31c5ec9f3a53b9b6b1124b29134b19329a092878ff624581
|
||||||
|
retire fastfetch/config.jsonc abb336459df8dea8f84df1dd54a2f223adec558df3de39cce84ca83f88acc02f
|
||||||
|
retire fastfetch/config.jsonc f1c9a999a4f31a215b10474eeac8894ce6da220d680c30d2aab7b3c1b7a539a6
|
||||||
|
retire fastfetch/config.jsonc 97aefdea2103d6c73e063bf0d11ad26da8fe60630305ac4eb2970cfc50cb0d91
|
||||||
|
retire fastfetch/config.jsonc 22565532d139ab8c2ddb21dcfe56460dc9f2f8a712b8d29f125c1c8b29beca37
|
||||||
|
retire fastfetch/config.jsonc b65cb9ca36eed45929bfc35443762b14957d3847f6bed361a338224a87450e3a
|
||||||
|
retire fastfetch/config.jsonc 3d153225131d3031b99b2e1a07e84d22cd0e51fcae1e701b08f6b6a558bc7a9c
|
||||||
|
retire fastfetch/config.jsonc 404d0273c380cfdad4a037fa87202fc1d96be178c867e8a9d27b0a772f6e2fa1
|
||||||
|
retire fastfetch/config.jsonc 4a98ff77ed46109d08ef7301249ea6823d1abba6c39c0871680feebf96620bf2
|
||||||
|
retire fastfetch/config.jsonc 2cc59c562e51ed3a58a784a17414ad40699253d0a9522eb7ce01faf6d7cff7c2
|
||||||
|
retire fastfetch/config.jsonc 07027778c12914c7077022cc835de4ac6c38af90aed539a871b13c7c89603e87
|
||||||
|
retire fastfetch/config.jsonc 0bc8cb0a24ec07e786cccbad446fd80b72520e7effd9bff8cfa27b7361211f4b
|
||||||
|
retire fastfetch/config.jsonc c827c3a24f64c418d309244a8a967def0c522d824addf65d8ee0741afbc970bd
|
||||||
|
retire fastfetch/config.jsonc c909b43ba000887cd418d9eaf98c1c9c5ba938aa27f9246cf8fa5662946c4e87
|
||||||
|
retire fastfetch/config.jsonc b2e5757851f0703edb8bcfc4b51a00bf5e303c1df26b8c63e6b7df6be4ead4ed
|
||||||
|
retire fastfetch/config.jsonc 1a0a085e7a80036f415148da21f772e99898de7e70768ec7b7613f8cc620700c
|
||||||
retire fontconfig/fonts.conf 7db33b0f8673f71f42604255cad222194294cd401315fecde6b83151eecebe91
|
retire fontconfig/fonts.conf 7db33b0f8673f71f42604255cad222194294cd401315fecde6b83151eecebe91
|
||||||
retire fontconfig/fonts.conf f35b5b4bd0d8d3926f5d9a49ca791fc66b00793786420508d4a4c41ae9ccbefc
|
retire fontconfig/fonts.conf f35b5b4bd0d8d3926f5d9a49ca791fc66b00793786420508d4a4c41ae9ccbefc
|
||||||
retire fontconfig/fonts.conf 6dec98b539388b95ecfdb3c7ab951001c712820eb0581002832cb7bfdde1a654
|
retire fontconfig/fonts.conf 6dec98b539388b95ecfdb3c7ab951001c712820eb0581002832cb7bfdde1a654
|
||||||
@@ -1453,6 +1668,46 @@ copy_missing_config_defaults "$root/config" "$HOME/.config"
|
|||||||
copy_always_config_defaults
|
copy_always_config_defaults
|
||||||
repair_chromium_copy_url_extension_flags
|
repair_chromium_copy_url_extension_flags
|
||||||
|
|
||||||
|
# Carry over user-added backgrounds from the legacy git checkout backup, then
|
||||||
|
# remove old symlinks that pointed ~/.config/omarchy/themes/* back into the
|
||||||
|
# pre-4 checkout. Omarchy 4 reads stock themes from /usr/share/omarchy/themes.
|
||||||
|
legacy_omarchy_backup="$HOME/.local/share/omarchy.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
||||||
|
if [[ -d $legacy_omarchy_backup/themes && -d $legacy_omarchy_backup/.git ]]; then
|
||||||
|
(
|
||||||
|
cd "$legacy_omarchy_backup"
|
||||||
|
mapfile -t tracked_backgrounds < <(git ls-files --cached 'themes/*/backgrounds/*' 2>/dev/null)
|
||||||
|
for theme_dir in themes/*/; do
|
||||||
|
[[ -d $theme_dir/backgrounds ]] || continue
|
||||||
|
theme_name=$(basename "$theme_dir")
|
||||||
|
for bg_file in "$theme_dir"/backgrounds/*; do
|
||||||
|
[[ -f $bg_file ]] || continue
|
||||||
|
is_tracked=0
|
||||||
|
for tracked in "${tracked_backgrounds[@]}"; do
|
||||||
|
[[ $tracked == "$bg_file" ]] && { is_tracked=1; break; }
|
||||||
|
done
|
||||||
|
if (( ! is_tracked )); then
|
||||||
|
mkdir -p "$HOME/.config/omarchy/backgrounds/$theme_name"
|
||||||
|
mv "$bg_file" "$HOME/.config/omarchy/backgrounds/$theme_name/"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
if [[ -d $HOME/.config/omarchy/themes ]]; then
|
||||||
|
find "$HOME/.config/omarchy/themes" -mindepth 1 -maxdepth 1 -type l -delete
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Retire legacy UI configs replaced by omarchy-shell. Hyprland .conf files are
|
||||||
|
# intentionally left in place for users to reference/port after the upgrade.
|
||||||
|
for rel in waybar swayosd mako walker; do
|
||||||
|
file="$HOME/.config/$rel"
|
||||||
|
if [[ -e $file || -L $file ]]; then
|
||||||
|
backup="$file.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
||||||
|
rm -rf "$backup"
|
||||||
|
mv "$file" "$backup"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
for rel in "${retired_config_files[@]}"; do
|
for rel in "${retired_config_files[@]}"; do
|
||||||
file="$HOME/.config/$rel"
|
file="$HOME/.config/$rel"
|
||||||
backup="$file.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
backup="$file.omarchy-upgrade-to-4.$BACKUP_SUFFIX.bak"
|
||||||
@@ -1490,6 +1745,11 @@ mkdir -p "$HOME/.local/state/omarchy/toggles/hypr"
|
|||||||
if [[ -f $root/default/hypr/toggles/flags.lua ]]; then
|
if [[ -f $root/default/hypr/toggles/flags.lua ]]; then
|
||||||
cp "$root/default/hypr/toggles/flags.lua" "$HOME/.local/state/omarchy/toggles/hypr/"
|
cp "$root/default/hypr/toggles/flags.lua" "$HOME/.local/state/omarchy/toggles/hypr/"
|
||||||
fi
|
fi
|
||||||
|
# Legacy Hyprland .conf entry points source ~/.local/state/omarchy/toggles/hypr/*.conf.
|
||||||
|
# Keep an empty match around for the live pre-reboot session; v4 Lua ignores it.
|
||||||
|
if [[ -f $HOME/.config/hypr/hyprland.conf ]]; then
|
||||||
|
: >"$HOME/.local/state/omarchy/toggles/hypr/flags.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p "$HOME/.local/share/nautilus-python/extensions"
|
mkdir -p "$HOME/.local/share/nautilus-python/extensions"
|
||||||
for extension in localsend.py transcode.py; do
|
for extension in localsend.py transcode.py; do
|
||||||
@@ -1709,18 +1969,114 @@ touch "$state_dir/finalize-user.done"
|
|||||||
USER_SETUP
|
USER_SETUP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_legacy_theme_hyprland_conf() {
|
||||||
|
run_as_user env HOME="$target_home" bash <<'THEME_COMPAT'
|
||||||
|
set -euo pipefail
|
||||||
|
hyprland_conf="$HOME/.config/hypr/hyprland.conf"
|
||||||
|
[[ -f $hyprland_conf ]] || exit 0
|
||||||
|
grep -q 'current/theme/hyprland.conf' "$hyprland_conf" || exit 0
|
||||||
|
|
||||||
|
theme_dir="$HOME/.config/omarchy/current/theme"
|
||||||
|
colors="$theme_dir/colors.toml"
|
||||||
|
target="$theme_dir/hyprland.conf"
|
||||||
|
mkdir -p "$theme_dir"
|
||||||
|
accent="7aa2f7"
|
||||||
|
if [[ -f $colors ]]; then
|
||||||
|
parsed=$(awk -F= '/^[[:space:]]*accent[[:space:]]*=/ { gsub(/[[:space:]"#]/, "", $2); print $2; exit }' "$colors")
|
||||||
|
[[ -n ${parsed:-} ]] && accent="$parsed"
|
||||||
|
fi
|
||||||
|
{
|
||||||
|
printf '$activeBorderColor = rgb(%s)\n\n' "$accent"
|
||||||
|
cat <<'EOF'
|
||||||
|
general {
|
||||||
|
col.active_border = $activeBorderColor
|
||||||
|
}
|
||||||
|
|
||||||
|
group {
|
||||||
|
col.border_active = $activeBorderColor
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
} >"$target"
|
||||||
|
THEME_COMPAT
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh_current_theme_after_upgrade() {
|
||||||
|
local theme_name runtime_dir
|
||||||
|
|
||||||
|
theme_name=$(run_as_user env HOME="$target_home" bash -c '
|
||||||
|
set -euo pipefail
|
||||||
|
theme_name_path="$HOME/.config/omarchy/current/theme.name"
|
||||||
|
current_theme_path="$HOME/.config/omarchy/current/theme"
|
||||||
|
|
||||||
|
if [[ -f $theme_name_path ]]; then
|
||||||
|
read -r theme_name <"$theme_name_path" || true
|
||||||
|
printf "%s" "${theme_name:-}"
|
||||||
|
elif [[ -L $current_theme_path ]]; then
|
||||||
|
basename -- "$(readlink "$current_theme_path")"
|
||||||
|
else
|
||||||
|
printf ""
|
||||||
|
fi
|
||||||
|
')
|
||||||
|
theme_name=${theme_name//$'\r'/}
|
||||||
|
theme_name=${theme_name//$'\n'/}
|
||||||
|
[[ -n $theme_name ]] || theme_name="Tokyo Night"
|
||||||
|
|
||||||
|
log "Refreshing current theme with Omarchy 4 templates ($theme_name)"
|
||||||
|
|
||||||
|
runtime_dir="$target_runtime_dir"
|
||||||
|
[[ -d $runtime_dir ]] || runtime_dir=/tmp
|
||||||
|
|
||||||
|
if ! run_as_user env \
|
||||||
|
HOME="$target_home" \
|
||||||
|
USER="$target_user" \
|
||||||
|
LOGNAME="$target_user" \
|
||||||
|
XDG_RUNTIME_DIR="$runtime_dir" \
|
||||||
|
DBUS_SESSION_BUS_ADDRESS="unix:path=$runtime_dir/bus" \
|
||||||
|
XDG_CURRENT_DESKTOP=Hyprland \
|
||||||
|
XDG_SESSION_DESKTOP=Hyprland \
|
||||||
|
XDG_SESSION_TYPE=wayland \
|
||||||
|
DESKTOP_SESSION=hyprland \
|
||||||
|
OMARCHY_PATH=/usr/share/omarchy \
|
||||||
|
OMARCHY_THEME_HEADLESS=1 \
|
||||||
|
PATH="$package_path" \
|
||||||
|
omarchy-theme-set "$theme_name"; then
|
||||||
|
warn "Could not refresh current theme '$theme_name'. Run 'omarchy theme set \"$theme_name\"' after reboot if theme-dependent app config looks stale."
|
||||||
|
fi
|
||||||
|
|
||||||
|
write_legacy_theme_hyprland_conf
|
||||||
|
|
||||||
|
# Headless theme refresh intentionally skips omarchy-theme-set's live post
|
||||||
|
# hooks because one of them runs `hyprctl reload`. Still poke terminal
|
||||||
|
# emulators so the active upgrade terminal picks up generated theme files.
|
||||||
|
run_as_user env \
|
||||||
|
HOME="$target_home" \
|
||||||
|
USER="$target_user" \
|
||||||
|
LOGNAME="$target_user" \
|
||||||
|
OMARCHY_PATH=/usr/share/omarchy \
|
||||||
|
PATH="$package_path" \
|
||||||
|
omarchy-restart-terminal >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
|
||||||
configure_pacman_channel
|
configure_pacman_channel
|
||||||
install_keyrings
|
install_keyrings
|
||||||
remove_legacy_installer_package
|
remove_legacy_installer_package
|
||||||
|
remove_legacy_limine_configs
|
||||||
remove_conflicting_legacy_packages
|
remove_conflicting_legacy_packages
|
||||||
install_omarchy_4_packages
|
install_omarchy_4_packages
|
||||||
|
normalize_limine_config
|
||||||
|
migrate_1password_beta_package
|
||||||
cleanup_legacy_user_paths
|
cleanup_legacy_user_paths
|
||||||
apply_system_transition
|
apply_system_transition
|
||||||
suppress_hyprland_config_reload
|
suppress_hyprland_config_reload
|
||||||
apply_user_transition
|
apply_user_transition
|
||||||
cleanup_retired_services
|
cleanup_retired_services
|
||||||
remove_retired_default_packages
|
remove_retired_default_packages
|
||||||
reload_hyprland_config_after_upgrade
|
refresh_current_theme_after_upgrade
|
||||||
|
# Do not force-reload Hyprland in the live upgraded session. The legacy
|
||||||
|
# default/hypr and theme hyprland.conf shims above exist specifically so the
|
||||||
|
# pre-reboot session can keep running safely; the reboot performs the real
|
||||||
|
# Omarchy 4 Lua-config cutover.
|
||||||
|
restore_hyprland_config_reload
|
||||||
if start_omarchy_shell_session; then
|
if start_omarchy_shell_session; then
|
||||||
stop_retired_session_processes
|
stop_retired_session_processes
|
||||||
else
|
else
|
||||||
|
|||||||
+19
-1
@@ -2,4 +2,22 @@
|
|||||||
|
|
||||||
# omarchy:summary=Print the installed Omarchy version
|
# omarchy:summary=Print the installed Omarchy version
|
||||||
|
|
||||||
cat $OMARCHY_PATH/version
|
omarchy_path=${OMARCHY_PATH:-/usr/share/omarchy}
|
||||||
|
omarchy_path=${omarchy_path%/}
|
||||||
|
|
||||||
|
if [[ $omarchy_path != "/usr/share/omarchy" ]]; then
|
||||||
|
hash=$(git -C "$omarchy_path" rev-parse --short HEAD 2>/dev/null || true)
|
||||||
|
|
||||||
|
if [[ -n $hash ]]; then
|
||||||
|
echo "dev ($hash)"
|
||||||
|
else
|
||||||
|
echo "dev"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=$(pacman -Q omarchy 2>/dev/null | awk '{ print $2 }')
|
||||||
|
[[ -n $version ]] || exit 1
|
||||||
|
|
||||||
|
echo "$version"
|
||||||
|
|||||||
Executable
+18
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# omarchy:summary=Print the active Omarchy dev-link git branch
|
||||||
|
# omarchy:hidden=true
|
||||||
|
|
||||||
|
omarchy_path=${OMARCHY_PATH:-/usr/share/omarchy}
|
||||||
|
omarchy_path=${omarchy_path%/}
|
||||||
|
|
||||||
|
[[ $omarchy_path != "/usr/share/omarchy" ]] || exit 1
|
||||||
|
|
||||||
|
branch=$(git -C "$omarchy_path" branch --show-current 2>/dev/null || true)
|
||||||
|
if [[ -z $branch ]]; then
|
||||||
|
hash=$(git -C "$omarchy_path" rev-parse --short HEAD 2>/dev/null || true)
|
||||||
|
[[ -n $hash ]] || exit 1
|
||||||
|
branch="detached@$hash"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$branch"
|
||||||
@@ -178,7 +178,7 @@ changes. For more invasive changes (new plugin, packaged update):
|
|||||||
| App | Location |
|
| App | Location |
|
||||||
|-----|----------|
|
|-----|----------|
|
||||||
| btop | `~/.config/btop/btop.conf` |
|
| btop | `~/.config/btop/btop.conf` |
|
||||||
| fastfetch | `~/.config/fastfetch/config.jsonc` |
|
| fastfetch | `/etc/fastfetch/config.jsonc` default; `~/.config/fastfetch/config.jsonc` user override |
|
||||||
| lazygit | `~/.config/lazygit/config.yml` |
|
| lazygit | `~/.config/lazygit/config.yml` |
|
||||||
| starship | `~/.config/starship.toml` |
|
| starship | `~/.config/starship.toml` |
|
||||||
| git | `~/.config/git/config` |
|
| git | `~/.config/git/config` |
|
||||||
|
|||||||
+5
-2
@@ -67,6 +67,7 @@ version ──► omarchy /usr/share/omarchy
|
|||||||
|
|
||||||
config/** ──► omarchy-settings /etc/skel/.config/** (seeds new users)
|
config/** ──► omarchy-settings /etc/skel/.config/** (seeds new users)
|
||||||
/usr/share/omarchy/config/** (resync source)
|
/usr/share/omarchy/config/** (resync source)
|
||||||
|
etc/fastfetch/config.jsonc ──► omarchy-settings /etc/fastfetch/config.jsonc
|
||||||
|
|
||||||
applications/*.desktop ──► omarchy-settings /etc/skel/.local/share/applications/
|
applications/*.desktop ──► omarchy-settings /etc/skel/.local/share/applications/
|
||||||
/usr/share/omarchy/applications/
|
/usr/share/omarchy/applications/
|
||||||
@@ -267,8 +268,10 @@ brand-new user, so this one copy resyncs `.bashrc`, `.config/**`,
|
|||||||
branding files, and the shipped migration markers in a single pass.
|
branding files, and the shipped migration markers in a single pass.
|
||||||
|
|
||||||
Then it runs `omarchy-refresh-limine`, `omarchy-refresh-plymouth`, and the
|
Then it runs `omarchy-refresh-limine`, `omarchy-refresh-plymouth`, and the
|
||||||
nvim refresh. Destructive: existing user files at these paths are clobbered
|
nvim refresh. Destructive: existing user files copied from `/etc/skel` are
|
||||||
without backup.
|
clobbered without backup. Fastfetch is package-owned at
|
||||||
|
`/etc/fastfetch/config.jsonc`; delete `~/.config/fastfetch/config.jsonc` to
|
||||||
|
return to the packaged default.
|
||||||
|
|
||||||
## Quick reference: where does X live?
|
## Quick reference: where does X live?
|
||||||
|
|
||||||
|
|||||||
+4
-7
@@ -4,13 +4,6 @@ Omarchy migrations are one-time repair scripts for existing installs. They are
|
|||||||
used when a package update needs to change state that pacman cannot safely own by
|
used when a package update needs to change state that pacman cannot safely own by
|
||||||
itself.
|
itself.
|
||||||
|
|
||||||
They are for both humans and agents:
|
|
||||||
|
|
||||||
- Users should know when migrations run, where state is stored, and how to retry
|
|
||||||
or inspect pending work.
|
|
||||||
- Agents should know which migration scope to use, how to write safe migration
|
|
||||||
scripts, and what should **not** be a migration.
|
|
||||||
|
|
||||||
## The two migration scopes
|
## The two migration scopes
|
||||||
|
|
||||||
Omarchy migrations are split by execution context:
|
Omarchy migrations are split by execution context:
|
||||||
@@ -32,6 +25,8 @@ Use system migrations for machine-wide state, for example:
|
|||||||
- hardware quirks
|
- hardware quirks
|
||||||
- package-owned layout transitions
|
- package-owned layout transitions
|
||||||
|
|
||||||
|
Note that it's not necessary to write a migration for any file that will be package-owned.
|
||||||
|
|
||||||
State lives in:
|
State lives in:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
@@ -177,6 +172,8 @@ Migrations are plain shell files:
|
|||||||
- no shebang
|
- no shebang
|
||||||
- start with an `echo` describing the migration
|
- start with an `echo` describing the migration
|
||||||
- use `$OMARCHY_PATH` for Omarchy-owned files
|
- use `$OMARCHY_PATH` for Omarchy-owned files
|
||||||
|
- should be idempotent
|
||||||
|
- should be as simple as possible to accomplish the task
|
||||||
|
|
||||||
Example system migration:
|
Example system migration:
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,13 @@
|
|||||||
"type": "command",
|
"type": "command",
|
||||||
"key": "\ue900 OS",
|
"key": "\ue900 OS",
|
||||||
"keyColor": "blue",
|
"keyColor": "blue",
|
||||||
"text": "version=$(omarchy-version); echo \"Omarchy $version\""
|
"text": "version=$(omarchy-version) && echo \"Omarchy $version\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"key": "│ ├",
|
||||||
|
"keyColor": "blue",
|
||||||
|
"text": "omarchy-version-branch"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
@@ -103,6 +103,7 @@ package_defaults = [
|
|||||||
("default/fontconfig/conf.avail/30-omarchy.conf", "/usr/share/fontconfig/conf.avail/30-omarchy.conf", "fontconfig/fonts.conf"),
|
("default/fontconfig/conf.avail/30-omarchy.conf", "/usr/share/fontconfig/conf.avail/30-omarchy.conf", "fontconfig/fonts.conf"),
|
||||||
("default/xdg-terminal-exec/hyprland-xdg-terminals.list", "/usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list", "xdg-terminals.list"),
|
("default/xdg-terminal-exec/hyprland-xdg-terminals.list", "/usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list", "xdg-terminals.list"),
|
||||||
("default/applications/mimeapps.list", "/usr/share/applications/mimeapps.list", "mimeapps.list"),
|
("default/applications/mimeapps.list", "/usr/share/applications/mimeapps.list", "mimeapps.list"),
|
||||||
|
("etc/fastfetch/config.jsonc", "/etc/fastfetch/config.jsonc", "fastfetch/config.jsonc"),
|
||||||
("default/systemd/user/bt-agent.service", "/usr/lib/systemd/user/bt-agent.service", "systemd/user/bt-agent.service"),
|
("default/systemd/user/bt-agent.service", "/usr/lib/systemd/user/bt-agent.service", "systemd/user/bt-agent.service"),
|
||||||
("default/systemd/user/omarchy-sleep-lock.service", "/usr/lib/systemd/user/omarchy-sleep-lock.service", "systemd/user/omarchy-sleep-lock.service"),
|
("default/systemd/user/omarchy-sleep-lock.service", "/usr/lib/systemd/user/omarchy-sleep-lock.service", "systemd/user/omarchy-sleep-lock.service"),
|
||||||
("default/systemd/user/omarchy-recover-internal-monitor.service", "/usr/lib/systemd/user/omarchy-recover-internal-monitor.service", "systemd/user/omarchy-recover-internal-monitor.service"),
|
("default/systemd/user/omarchy-recover-internal-monitor.service", "/usr/lib/systemd/user/omarchy-recover-internal-monitor.service", "systemd/user/omarchy-recover-internal-monitor.service"),
|
||||||
|
|||||||
Reference in New Issue
Block a user