Plugin cloning via menu (#6433)
* Add plugin cloning via menu * Split plugin commands by action * Keep plugin enablement in action commands * Remove unused plugin edit command * Simplify plugin rescan arguments * Assume Omarchy shell is running for plugin commands * Remove plugin compatibility dispatcher * Flatten plugin clone command * Keep only shared plugin helpers * Remove plugin rescan wrapper * Keep plugin commands self-contained * Simplify plugin clone lifecycle
This commit is contained in:
Executable
+133
@@ -0,0 +1,133 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Update installed git-managed plugins
|
||||
# omarchy:group=plugin
|
||||
# omarchy:args=[id] [--yes]
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
export GIT_TERMINAL_PROMPT=0
|
||||
export GIT_SSH_COMMAND="${GIT_SSH_COMMAND:-ssh -oBatchMode=yes}"
|
||||
|
||||
PLUGINS_DIR="$HOME/.config/omarchy/plugins"
|
||||
ASSUME_YES=0
|
||||
UPDATED_ANY=0
|
||||
|
||||
fail() {
|
||||
echo "omarchy-plugin-update: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
interactive() {
|
||||
[[ -t 0 && -t 1 ]]
|
||||
}
|
||||
|
||||
confirm() {
|
||||
local prompt="$1"
|
||||
(( ASSUME_YES )) && return 0
|
||||
if interactive; then
|
||||
gum confirm "$prompt"
|
||||
else
|
||||
fail "refusing to continue without confirmation; pass --yes"
|
||||
fi
|
||||
}
|
||||
|
||||
valid_plugin_id() {
|
||||
[[ $1 =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ && $1 != *..* ]]
|
||||
}
|
||||
|
||||
update_one() {
|
||||
local id="$1"
|
||||
local dir="$PLUGINS_DIR/$id"
|
||||
|
||||
if ! git -C "$dir" fetch --quiet origin HEAD; then
|
||||
echo "omarchy-plugin-update: fetch failed for '$id'" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ $(git -C "$dir" rev-parse HEAD) == $(git -C "$dir" rev-parse FETCH_HEAD) ]]; then
|
||||
echo "$id is up to date."
|
||||
return 0
|
||||
fi
|
||||
|
||||
if (( ! ASSUME_YES )); then
|
||||
echo "Changes for $id:"
|
||||
if omarchy-cmd-present delta; then
|
||||
git -C "$dir" diff HEAD FETCH_HEAD | delta --paging=never
|
||||
else
|
||||
git -C "$dir" diff HEAD FETCH_HEAD
|
||||
fi
|
||||
echo
|
||||
confirm "Update $id?" || {
|
||||
echo "Skipped $id."
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
|
||||
if ! git -C "$dir" merge --ff-only FETCH_HEAD >/dev/null 2>&1; then
|
||||
echo "omarchy-plugin-update: cannot fast-forward '$id'; you have local changes in $dir" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! omarchy-plugin-validate "$dir"; then
|
||||
git -C "$dir" reset --hard ORIG_HEAD >/dev/null
|
||||
echo "omarchy-plugin-update: update of '$id' failed validation; rolled back" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Updated $id."
|
||||
UPDATED_ANY=1
|
||||
}
|
||||
|
||||
id=""
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--yes | -y)
|
||||
ASSUME_YES=1
|
||||
shift
|
||||
;;
|
||||
-h | --help)
|
||||
echo "Usage: omarchy plugin update [id] [--yes]"
|
||||
exit 0
|
||||
;;
|
||||
-*)
|
||||
fail "unknown update option: $1"
|
||||
;;
|
||||
*)
|
||||
[[ -z $id ]] || fail "unexpected argument: $1"
|
||||
id="$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
[[ -d $PLUGINS_DIR ]] || fail "no plugins installed"
|
||||
|
||||
targets=()
|
||||
if [[ -n $id ]]; then
|
||||
valid_plugin_id "$id" || fail "invalid plugin id '$id'"
|
||||
[[ -d $PLUGINS_DIR/$id ]] || fail "plugin '$id' is not installed"
|
||||
[[ -d $PLUGINS_DIR/$id/.git ]] ||
|
||||
fail "plugin '$id' is not a git checkout, so there is nothing to pull from"
|
||||
targets=("$id")
|
||||
else
|
||||
for dir in "$PLUGINS_DIR"/*/; do
|
||||
[[ -d $dir/.git ]] || continue
|
||||
targets+=("$(basename "$dir")")
|
||||
done
|
||||
if (( ${#targets[@]} == 0 )); then
|
||||
echo "No git-managed plugins installed."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
rc=0
|
||||
for id in "${targets[@]}"; do
|
||||
update_one "$id" || rc=1
|
||||
done
|
||||
|
||||
if (( UPDATED_ANY )); then
|
||||
omarchy-shell shell rescanPlugins >/dev/null
|
||||
fi
|
||||
exit $rc
|
||||
Reference in New Issue
Block a user