#!/bin/bash # omarchy:summary=Install a theme from a git repository # omarchy:args=[git-repo-url] # omarchy:examples=omarchy theme install https://github.com/example/omarchy-example-theme.git # omarchy:examples=omarchy theme install git@github.com:example/omarchy-example-theme.git if [[ -z $1 ]]; then echo -e "\e[32mSee https://omarchy.org/themes/\n\e[0m" REPO_URL=$(gum input --placeholder="Git repo URL (https or git@host:org/repo.git)" --header="") else REPO_URL="$1" fi if [[ -z $REPO_URL ]]; then exit 1 fi # Refuse a URL that names a git option or a transport helper before cloning. The # check is shared with omarchy-plugin-add and explains itself; a missing checker # leaves this non-zero, which refuses the URL rather than cloning it. omarchy-git-url-check "$REPO_URL" || exit 1 THEMES_DIR="$HOME/.config/omarchy/themes" # Strip user@host: prefix from scp-style SSH URLs so basename sees just the path. # git reads a URL as scp-style when a colon appears before any slash, so the path # after it need not hold one: `git@host:omarchy-blue-theme.git` is a repo in that # user's home, and leaving its prefix on names the theme after the whole URL. REPO_PATH="$REPO_URL" [[ $REPO_PATH != *"://"* && $REPO_PATH == *:* && ${REPO_PATH%%:*} != */* ]] && REPO_PATH="${REPO_PATH#*:}" THEME_NAME=$(basename -- "$REPO_PATH" .git | sed -E 's/^omarchy-//; s/-theme$//' | tr '[:upper:]' '[:lower:]') THEME_PATH="$THEMES_DIR/$THEME_NAME" # The name comes from the URL, is joined into a path that is about to be # removed, and then names a directory the rest of Omarchy passes around by # name: Style > Unlock builds a command line out of the one the picker # returned. So it is held to the characters a theme name needs rather than # screened for the harm of the day -- a repo called `..` would take # ~/.config/omarchy with it, and one called `a';'id` would carry its own # command into that picker. The leading character is kept out of `.` and `-`, # which also covers `host:-s/foo.git` leaving basename with `.git`. # A bracket range follows the locale's collation, not ASCII: `[a-z]` takes in # `é` under en_US.UTF-8. Pin the locale so the set is the one written here. if ! (LC_ALL=C; [[ $THEME_NAME =~ ^[a-z0-9_][a-z0-9._+-]*$ ]]); then echo "Error: '$REPO_URL' does not give a usable theme name." exit 1 fi # Remove existing theme if present if [[ -d $THEME_PATH ]]; then rm -rf "$THEME_PATH" fi # Clone the repo directly to ~/.config/omarchy/themes if ! git clone -- "$REPO_URL" "$THEME_PATH"; then echo "Error: Failed to clone theme repo." exit 1 fi # Apply the new theme with omarchy-theme-set, which stages only the files an # extra theme is allowed to contribute and names anything it dropped. omarchy-theme-set "$THEME_NAME"