Add omarchy-dev-{link,unlink,status,pkg-test} commands
The four dev-tools commands that complete the developer-ergonomics story for the package refactor: - omarchy-dev-link <path>: writes /etc/omarchy.conf so OMARCHY_PATH resolves to <path> in all new shells, the Hyprland session env, and systemd --user. Updates the live session via hyprctl setenv + systemctl --user import-environment, restarts omarchy-shell, and reloads Hyprland so the changes are visible immediately. Affects every tree resolved via $OMARCHY_PATH: bin/, default/, shell/, themes/, applications/, config/. - omarchy-dev-unlink: removes /etc/omarchy.conf and reverses the live session updates back to /usr/share/omarchy. - omarchy-dev-status: reports current dev-link state (configured path, current shell, hyprland session env). - omarchy-dev-pkg-test [pkg] [checkout]: builds and installs a package from the checkout via OMARCHY_SRC + makepkg -si --skipchecksums. Used for changes that land at fixed system paths (/etc/, /usr/lib/, udev rule bodies, plymouth themes, /etc/skel) that dev-link can't shadow. The built package's pkgver is tagged 'dev.<short-sha>[.dirty]' so 'pacman -Q' makes its source obvious. Defaults: package omarchy-settings, checkout ~/Work/omarchy/omarchy-installer, PKGBUILDs read from ~/Work/omarchy/omarchy-pkgs/pkgbuilds/. All four ship via omarchy-dev-tools (existing PKGBUILD wildcard). Verified package build picks them up at /usr/bin/omarchy-dev-*.
This commit is contained in:
Executable
+67
@@ -0,0 +1,67 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Point Omarchy at a local checkout for live editing
|
||||
# omarchy:group=dev
|
||||
# omarchy:args=<path-to-checkout>
|
||||
# omarchy:examples=omarchy dev link ~/Work/omarchy/omarchy-installer
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [[ $# -ne 1 || $1 == "-h" || $1 == "--help" ]]; then
|
||||
cat <<USAGE
|
||||
Usage: omarchy dev link <path-to-checkout>
|
||||
|
||||
Writes /etc/omarchy.conf so OMARCHY_PATH resolves to <path-to-checkout>
|
||||
in all new shells, the Hyprland session, and Quickshell. Restarts
|
||||
omarchy-shell and reloads hyprctl so changes take effect immediately.
|
||||
|
||||
Affects only \$OMARCHY_PATH-resolved trees: bin/, default/, shell/,
|
||||
themes/, applications/, config/. Files installed at fixed system paths
|
||||
(/etc/, /usr/lib/systemd/, udev rule bodies, /etc/skel after user
|
||||
creation, /usr/share/plymouth) are NOT covered — for those, use
|
||||
omarchy-dev-pkg-test to build and install the package from the checkout.
|
||||
USAGE
|
||||
exit 0
|
||||
fi
|
||||
|
||||
target=$(realpath -e "$1" 2>/dev/null) || {
|
||||
echo "Error: path does not exist: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Sanity: looks like an omarchy-installer checkout?
|
||||
for required in bin default shell; do
|
||||
if [[ ! -d "$target/$required" ]]; then
|
||||
echo "Warning: $target/$required not found — does this look like an omarchy-installer checkout?" >&2
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Pointing Omarchy at $target"
|
||||
printf 'export OMARCHY_PATH="${OMARCHY_PATH:-%s}"\n' "$target" | sudo tee /etc/omarchy.conf >/dev/null
|
||||
|
||||
# Update the current shell so the rest of this script and anything spawned
|
||||
# from it see the new path.
|
||||
export OMARCHY_PATH="$target"
|
||||
export PATH="$target/bin:$PATH"
|
||||
|
||||
# Update the live Hyprland session if one is running.
|
||||
if command -v hyprctl >/dev/null 2>&1 && hyprctl version &>/dev/null; then
|
||||
hyprctl setenv OMARCHY_PATH "$target" >/dev/null
|
||||
hyprctl setenv PATH "$PATH" >/dev/null
|
||||
echo " Updated Hyprland session env."
|
||||
|
||||
systemctl --user import-environment OMARCHY_PATH PATH 2>/dev/null || true
|
||||
echo " Updated systemd --user env."
|
||||
|
||||
if pgrep -x quickshell >/dev/null 2>&1; then
|
||||
omarchy-restart-shell
|
||||
echo " Restarted omarchy-shell."
|
||||
fi
|
||||
|
||||
hyprctl reload >/dev/null
|
||||
echo " Reloaded Hyprland config."
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Done. Open a new shell (or restart existing ones) to pick up the new"
|
||||
echo "OMARCHY_PATH. Run 'omarchy dev unlink' to restore the package install."
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Build and install an Omarchy package from a local checkout
|
||||
# omarchy:group=dev
|
||||
# omarchy:args=[package-name] [path-to-checkout]
|
||||
# omarchy:examples=omarchy dev pkg-test omarchy-settings | omarchy dev pkg-test omarchy ~/Work/omarchy/omarchy-installer
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
|
||||
cat <<USAGE
|
||||
Usage: omarchy dev pkg-test [package-name] [path-to-checkout]
|
||||
|
||||
Builds and installs an Omarchy package from a local omarchy-installer
|
||||
checkout. Use when changes need to land at fixed system paths (/etc/,
|
||||
/usr/lib/systemd/, udev rule bodies, plymouth) that omarchy-dev-link
|
||||
can't shadow.
|
||||
|
||||
Defaults:
|
||||
package-name omarchy-settings
|
||||
path-to-checkout ~/Work/omarchy/omarchy-installer
|
||||
|
||||
The pkgver of the built package is tagged 'dev.<short-sha>[.dirty]' so
|
||||
'pacman -Q' makes it obvious where the installed version came from.
|
||||
|
||||
PKGBUILDs are read from \${OMARCHY_PKGBUILDS_DIR:-~/Work/omarchy/omarchy-pkgs/pkgbuilds}/<package-name>/.
|
||||
USAGE
|
||||
exit 0
|
||||
fi
|
||||
|
||||
PKG="${1:-omarchy-settings}"
|
||||
CHECKOUT="${2:-$HOME/Work/omarchy/omarchy-installer}"
|
||||
PKGBUILDS_ROOT="${OMARCHY_PKGBUILDS_DIR:-$HOME/Work/omarchy/omarchy-pkgs/pkgbuilds}"
|
||||
PKGBUILD_DIR="$PKGBUILDS_ROOT/$PKG"
|
||||
|
||||
if [[ ! -d "$CHECKOUT" ]]; then
|
||||
echo "Error: checkout not found at $CHECKOUT" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -f "$PKGBUILD_DIR/PKGBUILD" ]]; then
|
||||
echo "Error: PKGBUILD not found at $PKGBUILD_DIR/PKGBUILD" >&2
|
||||
echo " Pass a different package name as arg 1, or set OMARCHY_PKGBUILDS_DIR." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
build_dir=$(mktemp -d -t omarchy-dev-pkg-test.XXXXXX)
|
||||
trap 'rm -rf "$build_dir"' EXIT
|
||||
|
||||
cp -a "$PKGBUILD_DIR/." "$build_dir/"
|
||||
|
||||
# Mark the build with a versioned dev pkgver so pacman -Q makes the source obvious.
|
||||
short_sha=$(git -C "$CHECKOUT" rev-parse --short HEAD 2>/dev/null || echo "local")
|
||||
dirty=""
|
||||
if [[ -d "$CHECKOUT/.git" ]] && [[ -n "$(git -C "$CHECKOUT" status --porcelain)" ]]; then
|
||||
dirty=".dirty"
|
||||
fi
|
||||
new_pkgver="dev.${short_sha}${dirty}"
|
||||
sed -i "s/^pkgver=.*/pkgver=${new_pkgver}/" "$build_dir/PKGBUILD"
|
||||
|
||||
echo "Building $PKG ${new_pkgver} from $CHECKOUT"
|
||||
echo " build dir: $build_dir"
|
||||
echo " PKGBUILD : $PKGBUILD_DIR/PKGBUILD"
|
||||
echo
|
||||
|
||||
cd "$build_dir"
|
||||
OMARCHY_SRC="$CHECKOUT" makepkg -si --skipchecksums --noconfirm "${@:3}"
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Show the current Omarchy dev-link state
|
||||
# omarchy:group=dev
|
||||
|
||||
if [[ -f /etc/omarchy.conf ]]; then
|
||||
# Source in a subshell so we don't mutate the caller's env.
|
||||
configured=$(
|
||||
OMARCHY_PATH=
|
||||
# shellcheck disable=SC1091
|
||||
. /etc/omarchy.conf
|
||||
printf '%s' "${OMARCHY_PATH:-<empty>}"
|
||||
)
|
||||
echo "dev-link: ACTIVE"
|
||||
echo " /etc/omarchy.conf -> OMARCHY_PATH=$configured"
|
||||
else
|
||||
configured="/usr/share/omarchy (default)"
|
||||
echo "dev-link: inactive"
|
||||
fi
|
||||
|
||||
echo " current shell: OMARCHY_PATH=${OMARCHY_PATH:-<unset>}"
|
||||
|
||||
if [[ -f /etc/omarchy.conf && "${OMARCHY_PATH:-}" != "$configured" ]]; then
|
||||
echo
|
||||
echo "Note: this shell predates dev-link. Open a new shell to pick up the change,"
|
||||
echo "or 'export OMARCHY_PATH=$configured' to update just this shell."
|
||||
fi
|
||||
|
||||
if command -v hyprctl >/dev/null 2>&1 && hyprctl version &>/dev/null; then
|
||||
hypr_path=$(hyprctl getoption -j env 2>/dev/null | sed -n 's/.*OMARCHY_PATH=\([^"]*\).*/\1/p' | head -1)
|
||||
if [[ -n "$hypr_path" ]]; then
|
||||
echo " hyprland session: OMARCHY_PATH=$hypr_path"
|
||||
fi
|
||||
fi
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Restore Omarchy to the package install (undo omarchy-dev-link)
|
||||
# omarchy:group=dev
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
|
||||
cat <<USAGE
|
||||
Usage: omarchy dev unlink
|
||||
|
||||
Removes /etc/omarchy.conf so OMARCHY_PATH falls back to /usr/share/omarchy
|
||||
(the package install). Updates Hyprland/systemd session env and restarts
|
||||
omarchy-shell so live state matches.
|
||||
USAGE
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ ! -f /etc/omarchy.conf ]]; then
|
||||
echo "Not currently linked. OMARCHY_PATH already resolves to /usr/share/omarchy."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
sudo rm -f /etc/omarchy.conf
|
||||
echo "Removed /etc/omarchy.conf"
|
||||
|
||||
# Update the current shell.
|
||||
export OMARCHY_PATH=/usr/share/omarchy
|
||||
# Drop the prepended checkout bin/ from PATH if present.
|
||||
PATH=$(printf '%s' "$PATH" | tr ':' '\n' | grep -vFx "$(dirname "$0")" | paste -sd:)
|
||||
export PATH
|
||||
|
||||
# Update the live Hyprland session.
|
||||
if command -v hyprctl >/dev/null 2>&1 && hyprctl version &>/dev/null; then
|
||||
hyprctl setenv OMARCHY_PATH /usr/share/omarchy >/dev/null
|
||||
hyprctl setenv PATH "$PATH" >/dev/null
|
||||
echo " Updated Hyprland session env."
|
||||
|
||||
systemctl --user import-environment OMARCHY_PATH PATH 2>/dev/null || true
|
||||
echo " Updated systemd --user env."
|
||||
|
||||
if pgrep -x quickshell >/dev/null 2>&1; then
|
||||
omarchy-restart-shell
|
||||
echo " Restarted omarchy-shell."
|
||||
fi
|
||||
|
||||
hyprctl reload >/dev/null
|
||||
echo " Reloaded Hyprland config."
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Done. Existing shells still have the old OMARCHY_PATH until restarted."
|
||||
Reference in New Issue
Block a user