Refuse a theme name that is shell syntax, and quote the one the unlock picker returns
(cherry picked from commit 9da8824098)
64 lines
2.7 KiB
Bash
Executable File
64 lines
2.7 KiB
Bash
Executable File
#!/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"
|