Mike McQuaid 3875f16782
Fix --formula and --cask flags.
These were all made `--formulae` and `--casks` for consistency but that
doesn't behave as expected because they have special behaviours in
`args`. Instead, use the singular form everywhere.
2020-08-07 09:53:30 +01:00

901 lines
20 KiB
Plaintext

# Bash completion script for brew(1)
# Indicates there are no completions
__brewcomp_null() {
COMPREPLY=""
}
__brewcomp_words_include() {
local i=1
while [[ "$i" -lt "$COMP_CWORD" ]]
do
if [[ "${COMP_WORDS[i]}" = "$1" ]]
then
return 0
fi
(( i++ ))
done
return 1
}
# Find the previous non-switch word
__brewcomp_prev() {
local idx="$((COMP_CWORD - 1))"
local prv="${COMP_WORDS[idx]}"
while [[ "$prv" = -* ]]
do
(( idx-- ))
prv="${COMP_WORDS[idx]}"
done
echo "$prv"
}
__brewcomp() {
# break $1 on space, tab, and newline characters,
# and turn it into a newline separated list of words
local list s sep=$'\n' IFS=$' \t\n'
local cur="${COMP_WORDS[COMP_CWORD]}"
for s in $1
do
__brewcomp_words_include "$s" && continue
list="$list$s$sep"
done
IFS="$sep"
COMPREPLY=($(compgen -W "$list" -- "$cur"))
}
# Don't use __brewcomp() in any of the __brew_complete_foo functions, as
# it is too slow and is not worth it just for duplicate elimination.
__brew_complete_formulae() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local formulas="$(brew search)"
local shortnames="$(echo "$formulas" | \grep / | \cut -d / -f 3)"
COMPREPLY=($(compgen -W "$formulas $shortnames" -- "$cur"))
}
__brew_complete_installed() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local inst="$(command ls "$(brew --cellar)" 2>/dev/null)"
COMPREPLY=($(compgen -W "$inst" -- "$cur"))
}
__brew_complete_outdated() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local od="$(brew outdated --quiet)"
COMPREPLY=($(compgen -W "$od" -- "$cur"))
}
__brew_complete_versions() {
local formula="$1"
local versions="$(brew list --versions "$formula")"
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(compgen -W "$versions" -X "$formula" -- "$cur"))
}
__brew_complete_logs() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local logs="$(command ls "${HOMEBREW_LOGS:-${HOME}/Library/Logs/Homebrew/}" 2>/dev/null)"
COMPREPLY=($(compgen -W "$logs" -- "$cur"))
}
__brew_complete_tapped() {
local taplib="$(brew --repository)/Library/Taps"
local dir taps
for dir in "$taplib"/*/*
do
[[ -d "$dir" ]] || continue
dir="${dir#${taplib}/}"
dir="${dir/homebrew-/}"
taps="$taps $dir"
done
__brewcomp "$taps"
}
__brew_complete_commands() {
local cur="${COMP_WORDS[COMP_CWORD]}"
HOMEBREW_CACHE=$(brew --cache)
HOMEBREW_REPOSITORY=$(brew --repo)
# Do not auto-complete "*instal" or "*uninstal" aliases for "*install" commands.
[[ -f "$HOMEBREW_CACHE/all_commands_list.txt" ]] &&
local cmds="$(cat "$HOMEBREW_CACHE/all_commands_list.txt" | \grep -v instal$)" ||
local cmds="$(cat "$HOMEBREW_REPOSITORY/completions/internal_commands_list.txt" | \grep -v instal$)"
COMPREPLY=($(compgen -W "$cmds" -- "$cur"))
}
_brew_analytics() {
case "$COMP_CWORD" in
2) __brewcomp "off on regenerate-uuid state" ;;
esac
}
_brew_bottle() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "
--debug
--force-core-tap
--help
--json
--keep-old
--merge
--no-commit
--no-rebuild
--or-later
--root-url
--skip-relocation
--verbose
--write
"
return
;;
esac
__brew_complete_installed
}
_brew_cleanup() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "
--debug
--dry-run
--prune
--help
--verbose
-s
"
return
;;
esac
__brew_complete_installed
}
_brew_create() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "
--HEAD
--autotools
--cmake
--crystal
--debug
--force
--go
--help
--meson
--no-fetch
--node
--perl
--python
--ruby
--rust
--set-name
--set-version
--tap
--verbose
"
return
;;
esac
}
_brew_deps() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--1 --all --tree"
return
;;
esac
__brew_complete_formulae
}
_brew_desc() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--search --name --description"
return
;;
esac
__brew_complete_formulae
}
_brew_diy() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--set-name --set-version"
return
;;
esac
}
_brew_doctor() {
local cur="${COMP_WORDS[COMP_CWORD]}"
__brewcomp "$(brew doctor --list-checks)"
}
_brew_fetch() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv="$(__brewcomp_prev)"
case "$cur" in
-*)
__brewcomp "
--deps --force
--devel --HEAD
--build-from-source --force-bottle --build-bottle
--retry
$(brew options --compact "$prv" 2>/dev/null)
"
return
;;
esac
__brew_complete_formulae
}
_brew_gist_logs() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--new-issue"
return
;;
esac
__brew_complete_logs
}
_brew_info() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--all --github --installed --json=v1"
return
;;
esac
__brew_complete_formulae
}
_brew_install() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv="$(__brewcomp_prev)"
case "$cur" in
-*)
if __brewcomp_words_include "--interactive"
then
__brewcomp "--devel --git --HEAD"
else
__brewcomp "
--build-from-source --build-bottle --force-bottle
--debug
--devel
--HEAD
--ignore-dependencies
--interactive
--only-dependencies
--verbose
--display-times
$(brew options --compact "$prv" 2>/dev/null)
"
fi
return
;;
esac
__brew_complete_formulae
}
_brew_irb() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--examples"
return
;;
esac
}
_brew_link() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--dry-run --overwrite --force"
return
;;
esac
__brew_complete_installed
}
_brew_list() {
local allopts="--unbrewed --verbose --pinned --versions --multiple"
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
# most options to brew-list are mutually exclusive
if __brewcomp_words_include "--unbrewed"
then
return
elif __brewcomp_words_include "--verbose"
then
return
elif __brewcomp_words_include "--pinned"
then
return
# --multiple only applies with --versions
elif __brewcomp_words_include "--multiple"
then
__brewcomp "--versions"
return
elif __brewcomp_words_include "--versions"
then
__brewcomp "--multiple"
return
else
__brewcomp "$allopts"
return
fi
;;
esac
# --multiple excludes formulae and *implies* --versions...
if __brewcomp_words_include "--multiple"
then
__brewcomp "--versions"
else
__brew_complete_installed
fi
}
_brew_log() {
# if git-completion is loaded, then we complete git-log options
declare -F _git_log >/dev/null || return
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "
$__git_log_common_options
$__git_log_shortlog_options
$__git_log_gitk_options
$__git_diff_common_options
--walk-reflogs --graph --decorate
--abbrev-commit --oneline --reverse
"
return
;;
esac
__brew_complete_formulae
}
_brew_man() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--link --server --verbose"
return
;;
esac
}
_brew_options() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--all --compact --installed"
return
;;
esac
__brew_complete_formulae
}
_brew_outdated() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--quiet --json=v1 --fetch-HEAD"
return
;;
esac
__brewcomp_null
}
_brew_postinstall() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--debug --verbose --force --help"
return
;;
esac
__brew_complete_installed
}
_brew_pull() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "
--bintray-org
--bottle
--branch-okay
--bump
--clean
--ignore-whitespace
--no-pbcopy
--no-publish
--resolve
--test-bot-user
--warn-on-publish-failure
"
return
;;
esac
__brew_complete_formulae
}
_brew_readall() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--aliases --syntax"
return
;;
esac
__brew_complete_tapped
}
_brew_search() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--cask --debian --desc --fedora --fink --macports --opensuse --ubuntu"
return
;;
esac
__brewcomp_null
}
_brew_style() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--fix --display-cop-names --only-cops --except-cops"
return
;;
esac
__brew_complete_formulae
}
_brew_switch() {
case "$COMP_CWORD" in
2) __brew_complete_installed ;;
3) __brew_complete_versions "${COMP_WORDS[COMP_CWORD-1]}" ;;
*) ;;
esac
}
_brew_tap() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--full --force-auto-update --repair --list-pinned"
return
;;
esac
__brewcomp_null
}
_brew_tap_info() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--installed --json=v1"
return
;;
esac
__brew_complete_tapped
}
_brew_tap_new() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--verbose"
return
;;
esac
}
_brew_tap_unpin() {
__brewcomp "$(brew tap --list-pinned)"
}
_brew_tests() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--verbose"
return
;;
esac
}
_brew_uninstall() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--force"
return
;;
esac
__brew_complete_installed
}
_brew_unpack() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--git --patch --destdir="
return
;;
esac
__brew_complete_formulae
}
_brew_update() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--rebase --verbose"
return
;;
esac
}
_brew_upgrade() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv="$(__brewcomp_prev)"
case "$cur" in
-*)
__brewcomp "
--all
--build-from-source --build-bottle --force-bottle
--cleanup
--debug
--verbose
--fetch-HEAD
--display-times
"
return
;;
esac
__brew_complete_outdated
}
_brew_uses() {
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brewcomp "--installed --recursive --include-build --include-test --include-optional --skip-recommended --devel --HEAD"
return
;;
esac
__brew_complete_formulae
}
__brew_caskcomp_words_include ()
{
local i=1
while [[ $i -lt $COMP_CWORD ]]; do
if [[ "${COMP_WORDS[i]}" = "$1" ]]; then
return 0
fi
(( i++ ))
done
return 1
}
# Find the previous non-switch word
__brew_caskcomp_prev ()
{
local idx=$((COMP_CWORD - 1))
local prv="${COMP_WORDS[idx]}"
while [[ $prv == -* ]]; do
(( idx-- ))
prv="${COMP_WORDS[idx]}"
done
echo "$prv"
}
__brew_caskcomp ()
{
# break $1 on space, tab, and newline characters,
# and turn it into a newline separated list of words
local list s sep=$'\n' IFS=$' \t\n'
local cur="${COMP_WORDS[COMP_CWORD]}"
for s in $1; do
__brew_caskcomp_words_include "$s" && continue
list="$list$s$sep"
done
IFS="$sep"
COMPREPLY=($(compgen -W "$list" -- "$cur"))
}
# Don't use __brew_caskcomp() in any of the __brew_cask_complete_foo functions, as
# it is too slow and is not worth it just for duplicate elimination.
__brew_cask_complete_formulae ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local lib=$(brew --repository)/Library
local taps=${lib}/Taps
local casks=${lib}/Taps/homebrew/homebrew-cask/Casks
local ff=$(\ls ${casks} 2>/dev/null | \sed 's/\.rb//g')
COMPREPLY=($(compgen -W "$ff" -- "$cur"))
}
__brew_cask_complete_installed ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local inst=$(brew cask list -1)
COMPREPLY=($(compgen -W "$inst" -- "$cur"))
}
__brew_cask_complete_caskroom ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local caskroom_dir="$(brew --prefix)/Caskroom/"
local files=$(\ls ${caskroom_dir} 2>/dev/null)
COMPREPLY=($(compgen -W "$files" -- "$cur"))
}
__brew_cask_complete_outdated ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local greedy=$(__brew_caskcomp_words_include "--greedy" && echo "--greedy")
local outdated=$(brew cask outdated --quiet $greedy)
COMPREPLY=($(compgen -W "$outdated" -- "$cur"))
}
_brew_cask_fetch ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv=$(__brew_caskcomp_prev)
case "$cur" in
-*)
__brew_caskcomp "--force"
return
;;
esac
__brew_cask_complete_formulae
}
_brew_cask_install ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv=$(__brew_caskcomp_prev)
case "$cur" in
-*)
__brew_caskcomp "--force --skip-cask-deps --require-sha --language"
return
;;
esac
__brew_cask_complete_formulae
}
_brew_cask_list ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brew_caskcomp "-1 --versions"
return
;;
esac
__brew_cask_complete_installed
}
_brew_cask_outdated ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brew_caskcomp "--greedy --verbose --quiet"
return
;;
esac
__brew_cask_complete_installed
}
_brew_cask_style ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brew_caskcomp "--fix"
return
;;
esac
__brew_cask_complete_installed
}
_brew_cask_uninstall ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brew_caskcomp "--force"
return
;;
esac
__brew_cask_complete_installed
}
_brew_cask_upgrade ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
-*)
__brew_caskcomp "--force --greedy"
return
;;
esac
__brew_cask_complete_outdated
}
_brew_cask ()
{
local i=1 cmd
# find the subcommand
while [[ $i -lt $COMP_CWORD ]]; do
local s="${COMP_WORDS[i]}"
case "$s" in
--*)
cmd="$s"
break
;;
-*)
;;
cask)
;;
*)
cmd="$s"
break
;;
esac
(( i++ ))
done
if [[ $i -eq $COMP_CWORD ]]; then
__brew_caskcomp "abv audit cat create doctor edit fetch home info install list ls outdated reinstall remove rm search style uninstall upgrade zap -S --force --verbose --appdir --colorpickerdir --prefpanedir --qlplugindir --fontdir --servicedir --input_methoddir --internet_plugindir --screen_saverdir --no-binaries --debug --version"
return
fi
# subcommands have their own completion functions
case "$cmd" in
--version) __brewcomp_null ;;
audit) __brew_cask_complete_formulae ;;
cat) __brew_cask_complete_formulae ;;
create) ;;
doctor) __brewcomp_null ;;
edit) __brew_cask_complete_formulae ;;
fetch) _brew_cask_fetch ;;
home) __brew_cask_complete_formulae ;;
info|abv) __brew_cask_complete_formulae ;;
install|instal) _brew_cask_install ;;
list|ls) _brew_cask_list ;;
outdated) _brew_cask_outdated ;;
reinstall) __brew_cask_complete_installed ;;
search) __brewcomp_null ;;
style) _brew_cask_style ;;
uninstall|remove|rm) _brew_cask_uninstall ;;
upgrade) _brew_cask_upgrade ;;
zap) __brew_cask_complete_caskroom ;;
*) ;;
esac
}
_brew() {
local i=1 cmd
# find the subcommand
while [[ "$i" -lt "$COMP_CWORD" ]]
do
local s="${COMP_WORDS[i]}"
case "$s" in
--*)
cmd="$s"
break
;;
-*)
;;
*)
cmd="$s"
break
;;
esac
(( i++ ))
done
if [[ "$i" -eq "$COMP_CWORD" ]]
then
__brew_complete_commands
return
fi
# subcommands have their own completion functions
case "$cmd" in
--cache) __brew_complete_formulae ;;
--cellar) __brew_complete_formulae ;;
--prefix) __brew_complete_formulae ;;
analytics) _brew_analytics ;;
audit) __brew_complete_formulae ;;
bottle) _brew_bottle ;;
cask) _brew_cask ;;
cat) __brew_complete_formulae ;;
cleanup) _brew_cleanup ;;
command) __brew_complete_commands ;;
create) _brew_create ;;
deps) _brew_deps ;;
desc) _brew_desc ;;
diy|configure) _brew_diy ;;
doctor|dr) _brew_doctor ;;
edit) __brew_complete_formulae ;;
fetch) _brew_fetch ;;
gist-logs) _brew_gist_logs ;;
help) __brew_complete_commands ;;
home|homepage) __brew_complete_formulae ;;
info|abv) _brew_info ;;
install|instal) _brew_install ;;
irb) _brew_irb ;;
link|ln) _brew_link ;;
list|ls) _brew_list ;;
log) _brew_log ;;
man) _brew_man ;;
missing) __brew_complete_formulae ;;
options) _brew_options ;;
outdated) _brew_outdated ;;
pin) __brew_complete_formulae ;;
postinstall) _brew_postinstall ;;
prof) __brew_complete_commands ;;
pull) _brew_pull ;;
readall) _brew_readall ;;
reinstall) _brew_install ;;
search|-S) _brew_search ;;
style) _brew_style ;;
switch) _brew_switch ;;
tap) _brew_tap ;;
tap-info) _brew_tap_info ;;
tap-new) _brew_tap_new ;;
tap-unpin) _brew_tap_unpin ;;
test) __brew_complete_installed ;;
tests) _brew_tests ;;
uninstall|remove|rm) _brew_uninstall ;;
unlink) __brew_complete_installed ;;
unpack) _brew_unpack ;;
unpin) __brew_complete_formulae ;;
untap) __brew_complete_tapped ;;
update|up) _brew_update ;;
upgrade) _brew_upgrade ;;
uses) _brew_uses ;;
*) ;;
esac
}
# keep around for compatibility
_brew_to_completion() {
_brew
}
complete -o bashdefault -o default -F _brew brew