diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh index 2ab0d5ccca982..d835ac3c0630e 100644 --- a/Library/Homebrew/brew.sh +++ b/Library/Homebrew/brew.sh @@ -168,7 +168,7 @@ case "$@" in homebrew-command-path "$@" && exit 0 ;; # falls back to cmd/list.rb on a non-zero return - list*) + list* | ls*) source "${HOMEBREW_LIBRARY}/Homebrew/list.sh" homebrew-list "$@" && exit 0 ;; diff --git a/Library/Homebrew/list.sh b/Library/Homebrew/list.sh index 39eaf65ac7c0d..234b7f3b76aa0 100644 --- a/Library/Homebrew/list.sh +++ b/Library/Homebrew/list.sh @@ -4,8 +4,8 @@ homebrew-list() { case "$1" in # check we actually have list and not e.g. listsomething - list) ;; - list*) return 1 ;; + list | ls) ;; + list* | ls*) return 1 ;; *) ;; esac @@ -24,23 +24,30 @@ homebrew-list() { local formula="" local cask="" - local first_arg - for arg in "$@" + # `OPTIND` is used internally by `getopts` to track parsing position + local OPTIND=2 # skip $1 (and localise OPTIND to this function) + while getopts ":1lrt-:" arg do - if [[ -z "${first_arg}" ]] - then - first_arg=1 - [[ "${arg}" == "list" ]] && continue - fi case "${arg}" in # check for flags passed to ls - -1 | -l | -r | -t) ls_args+=("${arg}") ;; - --formula | --formulae) formula=1 ;; - --cask | --casks) cask=1 ;; + 1 | l | r | t) ls_args+=("-${arg}") ;; + -) + local parsed_index=$((OPTIND - 1)) # Parse full arg to reject e.g. -r-formula + case "${!parsed_index}" in + --formula | --formulae) formula=1 ;; + --cask | --casks) cask=1 ;; + *) return 1 ;; + esac + ;; # reject all other flags - -* | *) return 1 ;; + *) return 1 ;; esac done + # If we haven't reached the end of the arg list, we have named args. + if ((OPTIND - 1 != $#)) + then + return 1 + fi if [[ -z "${cask}" && -d "${HOMEBREW_CELLAR}" ]] then diff --git a/Library/Homebrew/test/cmd/list_spec.rb b/Library/Homebrew/test/cmd/list_spec.rb index b5b4a52902edd..97a6f1466a1db 100644 --- a/Library/Homebrew/test/cmd/list_spec.rb +++ b/Library/Homebrew/test/cmd/list_spec.rb @@ -18,4 +18,6 @@ .and not_to_output.to_stderr .and be_a_success end + + # TODO: add a test for the shell fast-path (`brew_sh`) end