Various improvements for brew command

- Add a (large) speedup by moving some logic to Bash for the typical
  case of a normal or dev-cmd, Bash or Ruby command.
- Make `brew command` a non-developer command, I don't think it makes
  sense to consider it something needed for developing Homebrew.
- Update the manpage/tests/RBI accordingly.

Co-authored-by: Carlo Cabrera <30379873+carlocab@users.noreply.github.com>
This commit is contained in:
Mike McQuaid 2024-04-30 11:09:42 +01:00
parent c9c8806be8
commit 4ffcd8a110
No known key found for this signature in database
8 changed files with 72 additions and 21 deletions

View File

@ -120,6 +120,11 @@ case "$*" in
source "${HOMEBREW_LIBRARY}/Homebrew/formula_path.sh" source "${HOMEBREW_LIBRARY}/Homebrew/formula_path.sh"
homebrew-formula-path "$@" && exit 0 homebrew-formula-path "$@" && exit 0
;; ;;
# falls back to cmd/command.rb on a non-zero return
command*)
source "${HOMEBREW_LIBRARY}/Homebrew/command_path.sh"
homebrew-command-path "$@" && exit 0
;;
esac esac
##### #####

View File

@ -5,7 +5,7 @@ require "abstract_command"
require "commands" require "commands"
module Homebrew module Homebrew
module DevCmd module Cmd
class Command < AbstractCommand class Command < AbstractCommand
cmd_args do cmd_args do
description <<~EOS description <<~EOS

View File

@ -0,0 +1,46 @@
# does the quickest output of brew command possible for the basic cases of an
# official Bash or Ruby normal or dev-cmd command.
# HOMEBREW_LIBRARY is set by brew.sh
# shellcheck disable=SC2154
homebrew-command-path() {
case "$1" in
# check we actually have command and not e.g. commandsomething
command) ;;
*) return 1 ;;
esac
local first_command found_command
for arg in "$@"
do
if [[ -z "${first_command}" && "${arg}" == "command" ]]
then
first_command=1
continue
elif [[ -f "${HOMEBREW_LIBRARY}/Homebrew/cmd/${arg}.sh" ]]
then
echo "${HOMEBREW_LIBRARY}/Homebrew/cmd/${arg}.sh"
found_command=1
elif [[ -f "${HOMEBREW_LIBRARY}/Homebrew/dev-cmd/${arg}.sh" ]]
then
echo "${HOMEBREW_LIBRARY}/Homebrew/dev-cmd/${arg}.sh"
found_command=1
elif [[ -f "${HOMEBREW_LIBRARY}/Homebrew/cmd/${arg}.rb" ]]
then
echo "${HOMEBREW_LIBRARY}/Homebrew/cmd/${arg}.rb"
found_command=1
elif [[ -f "${HOMEBREW_LIBRARY}/Homebrew/dev-cmd/${arg}.rb" ]]
then
echo "${HOMEBREW_LIBRARY}/Homebrew/dev-cmd/${arg}.rb"
found_command=1
else
return 1
fi
done
if [[ -n "${found_command}" ]]
then
return 0
else
return 1
fi
}

View File

@ -0,0 +1,12 @@
# typed: true
# DO NOT EDIT MANUALLY
# This is an autogenerated file for dynamic methods in `Homebrew::Cmd::Command`.
# Please instead update this file by running `bin/tapioca dsl Homebrew::Cmd::Command`.
class Homebrew::Cmd::Command
sig { returns(Homebrew::Cmd::Command::Args) }
def args; end
end
class Homebrew::Cmd::Command::Args < Homebrew::CLI::Args; end

View File

@ -1,12 +0,0 @@
# typed: true
# DO NOT EDIT MANUALLY
# This is an autogenerated file for dynamic methods in `Homebrew::DevCmd::Command`.
# Please instead update this file by running `bin/tapioca dsl Homebrew::DevCmd::Command`.
class Homebrew::DevCmd::Command
sig { returns(Homebrew::DevCmd::Command::Args) }
def args; end
end
class Homebrew::DevCmd::Command::Args < Homebrew::CLI::Args; end

View File

@ -1,9 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
require "cmd/shared_examples/args_parse" require "cmd/shared_examples/args_parse"
require "dev-cmd/command" require "cmd/command"
RSpec.describe Homebrew::DevCmd::Command do RSpec.describe Homebrew::Cmd::Command do
it_behaves_like "parseable arguments" it_behaves_like "parseable arguments"
it "returns the file for a given command", :integration_test do it "returns the file for a given command", :integration_test do

View File

@ -153,6 +153,10 @@ old. This can be adjusted with `HOMEBREW_CLEANUP_MAX_AGE_DAYS`.
: Only prune the symlinks and directories from the prefix and remove no other : Only prune the symlinks and directories from the prefix and remove no other
files. files.
### `command` *`command`* \[...\]
Display the path to the file being used when invoking `brew` *`cmd`*.
### `commands` \[`--quiet`\] \[`--include-aliases`\] ### `commands` \[`--quiet`\] \[`--include-aliases`\]
Show lists of built-in and external commands. Show lists of built-in and external commands.
@ -1985,10 +1989,6 @@ Display the source of a *`formula`* or *`cask`*.
: Treat all named arguments as casks. : Treat all named arguments as casks.
### `command` *`command`* \[...\]
Display the path to the file being used when invoking `brew` *`cmd`*.
### `contributions` \[--user=*`email|username`*\] \[*`--repositories`*`=`\] \[*`--csv`*\] ### `contributions` \[--user=*`email|username`*\] \[*`--repositories`*`=`\] \[*`--csv`*\]
Summarise contributions to Homebrew repositories. Summarise contributions to Homebrew repositories.

View File

@ -93,6 +93,8 @@ Scrub the cache, including downloads for even the latest versions\. Note that do
.TP .TP
\fB\-\-prune\-prefix\fP \fB\-\-prune\-prefix\fP
Only prune the symlinks and directories from the prefix and remove no other files\. Only prune the symlinks and directories from the prefix and remove no other files\.
.SS "\fBcommand\fP \fIcommand\fP \fR[\.\.\.]"
Display the path to the file being used when invoking \fBbrew\fP \fIcmd\fP\&\.
.SS "\fBcommands\fP \fR[\fB\-\-quiet\fP] \fR[\fB\-\-include\-aliases\fP]" .SS "\fBcommands\fP \fR[\fB\-\-quiet\fP] \fR[\fB\-\-include\-aliases\fP]"
Show lists of built\-in and external commands\. Show lists of built\-in and external commands\.
.TP .TP
@ -1259,8 +1261,6 @@ Treat all named arguments as formulae\.
.TP .TP
\fB\-\-cask\fP \fB\-\-cask\fP
Treat all named arguments as casks\. Treat all named arguments as casks\.
.SS "\fBcommand\fP \fIcommand\fP \fR[\.\.\.]"
Display the path to the file being used when invoking \fBbrew\fP \fIcmd\fP\&\.
.SS "\fBcontributions\fP \fR[\-\-user=\fIemail|username\fP] \fR[\fI\-\-repositories\fP\fB=\fP] \fR[\fI\-\-csv\fP]" .SS "\fBcontributions\fP \fR[\-\-user=\fIemail|username\fP] \fR[\fI\-\-repositories\fP\fB=\fP] \fR[\fI\-\-csv\fP]"
Summarise contributions to Homebrew repositories\. Summarise contributions to Homebrew repositories\.
.TP .TP