diff options
Diffstat (limited to 'etc/bash_completion.d')
| -rw-r--r-- | etc/bash_completion.d/brew | 642 |
1 files changed, 642 insertions, 0 deletions
diff --git a/etc/bash_completion.d/brew b/etc/bash_completion.d/brew new file mode 100644 index 000000000..0a709d7f2 --- /dev/null +++ b/etc/bash_completion.d/brew @@ -0,0 +1,642 @@ +# Bash completion script for brew(1) + +__brewcomp_words_include () +{ + local i=1 + while [[ $i -lt $COMP_CWORD ]]; do + if [[ "${COMP_WORDS[i]}" = "$1" ]]; then + return 0 + fi + i=$((++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=$((--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 lib=$(brew --repository)/Library + local taps=${lib}/Taps + local ff=$(\ls ${lib}/Formula 2>/dev/null | sed 's/\.rb//g') + local af=$(\ls ${lib}/Aliases 2>/dev/null) + local tf file + + for file in ${taps}/*/*/*.rb ${taps}/*/*/Formula/*.rb ${taps}/*/*/HomebrewFormula/*.rb; do + [ -f "$file" ] || continue + file=${file/"Formula/"/} + file=${file/"HomebrewFormula/"/} + file=${file#${lib}/Taps/} + file=${file%.rb} + file=${file/homebrew-/} + tf="${tf} ${file}" + done + + COMPREPLY=($(compgen -W "$ff $af $tf" -- "$cur")) +} + +__brew_complete_installed () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + local inst=$(\ls $(brew --cellar)) + 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=$(ls ${HOMEBREW_LOGS:-~/Library/Logs/Homebrew/}) + COMPREPLY=($(compgen -W "$logs" -- "$cur")) +} + +_brew_switch () +{ + case "$COMP_CWORD" in + 2) __brew_complete_installed ;; + 3) __brew_complete_versions "${COMP_WORDS[COMP_CWORD-1]}" ;; + *) ;; + esac +} + +__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_tap_unpin () +{ + __brewcomp "$(brew tap --list-pinned)" +} + +_brew_complete_tap () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--repair --list-official --list-pinned" + return + ;; + esac + __brewcomp "$(brew tap --list-official)" +} + +_brew_bottle () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--merge --rb --write --root_url=" + return + ;; + esac + __brew_complete_installed +} + +_brew_cleanup () +{ + __brew_complete_installed +} + +_brew_create () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--autotools --cmake --no-fetch --set-name --set-version" + 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_doctor () { + local cur="${COMP_WORDS[COMP_CWORD]}" + __brewcomp "$(brew doctor --list-checks)" +} + +_brew_diy () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--set-name --set-version" + return + ;; + esac +} + +_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 + $(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_linkapps () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--local" + 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" + return + ;; + esac +} + +_brew_postinstall () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--debug --sandbox" + return + ;; + esac + __brew_complete_installed +} + +_brew_prune () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--dry-run --verbose" + return + ;; + esac +} + +_brew_pull () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--bottle --bump --clean --ignore-whitespace --install --resolve" + return + ;; + esac +} + +_brew_readall () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--syntax" + return + ;; + esac + __brew_complete_tapped +} + +_brew_search () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--debian --desc --fedora --fink --macports --opensuse --ubuntu" + return + ;; + esac +} + +_brew_style () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--fix" + return + ;; + esac + __brew_complete_formulae +} + +_brew_tap_readme () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--verbose" + return + ;; + esac +} + +_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 + " + return + ;; + esac + __brew_complete_outdated +} + +_brew_uses () +{ + local cur="${COMP_WORDS[COMP_CWORD]}" + case "$cur" in + --*) + __brewcomp "--installed --recursive" + return + ;; + esac + __brew_complete_formulae +} + +_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=$((++i)) + done + + if [[ $i -eq $COMP_CWORD ]]; then + # Do not auto-complete "instal" abbreviation for "install" command. + # Prefix newline to prevent not checking the first command. + local cmds=$'\n'"$(brew commands --quiet --include-aliases)" + __brewcomp "${cmds/$'\n'instal$'\n'/$'\n'}" + return + fi + + # subcommands have their own completion functions + case "$cmd" in + --cache|--cellar|--prefix) __brew_complete_formulae ;; + audit|cat|edit|home) __brew_complete_formulae ;; + test|unlink) __brew_complete_installed ;; + bottle) _brew_bottle ;; + cleanup) _brew_cleanup ;; + create) _brew_create ;; + deps) _brew_deps ;; + desc) _brew_desc ;; + doctor|dr) _brew_doctor ;; + diy|configure) _brew_diy ;; + fetch) _brew_fetch ;; + gist-logs) _brew_gist_logs ;; + info|abv) _brew_info ;; + install|instal|reinstall) _brew_install ;; + irb) _brew_irb ;; + link|ln) _brew_link ;; + linkapps|unlinkapps) _brew_linkapps ;; + 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 ;; + prune) _brew_prune ;; + pull) _brew_pull ;; + readall) _brew_readall ;; + search|-S) _brew_search ;; + style) _brew_style ;; + switch) _brew_switch ;; + tap) _brew_complete_tap ;; + tap-readme) _brew_tap_readme ;; + tap-unpin) _brew_tap_unpin ;; + tests) _brew_tests ;; + uninstall|remove|rm) _brew_uninstall ;; + unpack) _brew_unpack ;; + unpin) __brew_complete_formulae ;; + untap|tap-info|tap-pin) __brew_complete_tapped ;; + update) _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 |
