Quote mise-install arguments and refuse unusable command names
(cherry picked from commit e989b5b3ee)
(cherry picked from commit fabcc4e437614cdd20638b108ae59b04191752e6)
60 lines
2.1 KiB
Bash
Executable File
60 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Install a small mise-backed wrapper for a given tool.
|
|
# omarchy:args=<package> [command-name [bin-name]]
|
|
|
|
if [[ -z $1 ]]; then
|
|
echo "Usage: omarchy-mise-install <package> [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" <<EOF
|
|
#!/bin/bash
|
|
export MISE_MINIMUM_RELEASE_AGE=0
|
|
mise use -g --quiet $package_arg || exit 1
|
|
exec mise x $package_arg -- $bin_arg "\$@"
|
|
EOF
|
|
|
|
chmod +x "$HOME/.local/bin/$command"
|