diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh index 877b33c868..25550839bb 100644 --- a/Library/Homebrew/brew.sh +++ b/Library/Homebrew/brew.sh @@ -172,6 +172,11 @@ case "$@" in source "${HOMEBREW_LIBRARY}/Homebrew/list.sh" homebrew-list "$@" && exit 0 ;; + # falls back to cmd/tap.rb on a non-zero return + tap*) + source "${HOMEBREW_LIBRARY}/Homebrew/tap.sh" + homebrew-tap "$@" && exit 0 + ;; # falls back to cmd/help.rb on a non-zero return help | --help | -h | --usage | "-?" | "") homebrew-help "$@" && exit 0 diff --git a/Library/Homebrew/tap.sh b/Library/Homebrew/tap.sh new file mode 100644 index 0000000000..97d581ef5b --- /dev/null +++ b/Library/Homebrew/tap.sh @@ -0,0 +1,41 @@ +# Does the quickest output of brew tap possible for no arguments. +# HOMEBREW_LIBRARY is set by bin/brew +# shellcheck disable=SC2154 + +normalise_tap_name() { + local dir="$1" + local user + local repo + + user="$(echo "${dir%%/*}" | tr '[:upper:]' '[:lower:]')" + repo="$(echo "${dir#*/}" | tr '[:upper:]' '[:lower:]')" + repo="${repo#@(home|linux)brew-}" + echo "${user}/${repo}" +} + +homebrew-tap() { + case "$1" in + # check we actually have tap and not e.g. tapsomething + tap) ;; + tap*) return 1 ;; + *) ;; + esac + + # Named args are handled by the Ruby code. + if [[ "$#" -gt 1 ]] + then + return 1 + fi + + local taplib="${HOMEBREW_LIBRARY}/Taps" + ( + shopt -s extglob + + for dir in "${taplib}"/*/* + do + [[ -d "${dir}" ]] || continue + dir="${dir#"${taplib}"/}" + normalise_tap_name "${dir}" + done | sort + ) +}