#!/bin/bash # omarchy:summary=Install a small mise-backed wrapper for a given tool. # omarchy:args= [command-name [bin-name]] if [[ -z $1 ]]; then echo "Usage: omarchy-mise-install [command-name [bin-name]]" exit 1 fi package=$1 command=${2:-$1} bin=${3:-$command} # The command name becomes a file name under ~/.local/bin, so a slash in it # writes the wrapper somewhere else and the rm below deletes somewhere else. A # leading dot hides it or walks up, and a leading dash makes a name that reads # as an option to whatever picks it up. Checked before anything is removed or # written, and kept to those shapes so package names like npm:playwright still # stand in for the command name. case "$command" in */* | .* | -* | *[[:cntrl:]]*) echo "omarchy-mise-install: '$command' is not usable as a command name" >&2 exit 1 ;; esac mkdir -p "$HOME/.local/bin" # The heredoc below is unquoted, so whatever these hold is written into the # wrapper as shell source. Quote them the way omarchy-install-and-launch does, so # a package name carrying shell characters stays one argument instead of running. printf -v package_arg '%q' "$package" printf -v bin_arg '%q' "$bin" # Keep values that are inert inside double quotes in the form existing migrations # recognize, including mise backend options that %q would unnecessarily escape. case "$package" in *'$'* | *'`'* | *'"'* | *'\'* | *'!'* | *[[:cntrl:]]*) ;; *) package_arg="\"$package\"" ;; esac case "$bin" in *'$'* | *'`'* | *'"'* | *'\'* | *'!'* | *[[:cntrl:]]*) ;; *) bin_arg="\"$bin\"" ;; esac # These tools install and upgrade on first run, so mise's release cooldown would # hold a new version back for days after it ships. Exported rather than set on # the install line alone, so resolving the version to execute agrees with the # one just installed. rm -f "$HOME/.local/bin/$command" cat >"$HOME/.local/bin/$command" <