aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike McQuaid2017-11-05 15:37:57 +0000
committerMike McQuaid2017-11-05 15:37:57 +0000
commit7a68b4a3f96c0cc76f94de2cd72b463b40be0343 (patch)
tree3a60bab25001d67966c8bf239b2d7a28f72cd1d3
parentc3006f0f121b44baa7acb5e2a023dfd96e582e7a (diff)
downloadbrew-7a68b4a3f96c0cc76f94de2cd72b463b40be0343.tar.bz2
Refactor command handling code
Don’t rely on having external commands always present in the PATH in order to find them. Instead, provide an accessory method to Tap so they can be added and used when needed. While we’re here, do some general refactoring and cleanup of the command code in these places.
-rw-r--r--Library/Homebrew/brew.rb14
-rw-r--r--Library/Homebrew/cmd/command.rb19
-rw-r--r--Library/Homebrew/cmd/commands.rb43
-rw-r--r--Library/Homebrew/commands.rb15
-rw-r--r--Library/Homebrew/tap.rb5
5 files changed, 51 insertions, 45 deletions
diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb
index e21e0bbd4..bb663537d 100644
--- a/Library/Homebrew/brew.rb
+++ b/Library/Homebrew/brew.rb
@@ -33,7 +33,6 @@ begin
empty_argv = ARGV.empty?
help_flag_list = %w[-h --help --usage -?]
help_flag = !ENV["HOMEBREW_HELP"].nil?
- internal_cmd = true
cmd = nil
ARGV.dup.each_with_index do |arg, i|
@@ -60,8 +59,9 @@ begin
internal_cmd = require? HOMEBREW_LIBRARY_PATH/"cmd"/cmd
unless internal_cmd
- internal_cmd = require? HOMEBREW_LIBRARY_PATH/"dev-cmd"/cmd
- if internal_cmd && !ARGV.homebrew_developer?
+ internal_dev_cmd = require? HOMEBREW_LIBRARY_PATH/"dev-cmd"/cmd
+ internal_cmd = internal_dev_cmd
+ if internal_dev_cmd && !ARGV.homebrew_developer?
system "git", "config", "--file=#{HOMEBREW_REPOSITORY}/.git/config",
"--replace-all", "homebrew.devcmdrun", "true"
ENV["HOMEBREW_DEV_CMD_RUN"] = "1"
@@ -90,8 +90,7 @@ begin
unless internal_cmd
# Add contributed commands to PATH before checking.
- tap_cmds = Pathname.glob(Tap::TAP_DIRECTORY/"*/*/cmd")
- homebrew_path.append(tap_cmds)
+ homebrew_path.append(Tap.cmd_directories)
# External commands expect a normal PATH
ENV["PATH"] = homebrew_path
@@ -100,14 +99,13 @@ begin
if internal_cmd
Homebrew.send cmd.to_s.tr("-", "_").downcase
elsif which "brew-#{cmd}"
- %w[CACHE LIBRARY_PATH].each do |e|
- ENV["HOMEBREW_#{e}"] = Object.const_get("HOMEBREW_#{e}").to_s
+ %w[CACHE LIBRARY_PATH].each do |env|
+ ENV["HOMEBREW_#{env}"] = Object.const_get("HOMEBREW_#{env}").to_s
end
exec "brew-#{cmd}", *ARGV
elsif (path = which("brew-#{cmd}.rb")) && require?(path)
exit Homebrew.failed? ? 1 : 0
else
- require "tap"
possible_tap = OFFICIAL_CMD_TAPS.find { |_, cmds| cmds.include?(cmd) }
possible_tap = Tap.fetch(possible_tap.first) if possible_tap
diff --git a/Library/Homebrew/cmd/command.rb b/Library/Homebrew/cmd/command.rb
index 39e8ba6fc..d964fa1a9 100644
--- a/Library/Homebrew/cmd/command.rb
+++ b/Library/Homebrew/cmd/command.rb
@@ -8,15 +8,16 @@ module Homebrew
def command
abort "This command requires a command argument" if ARGV.empty?
- cmd = ARGV.first
- cmd = HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(cmd, cmd)
- if (path = Commands.path(cmd))
- puts path
- elsif (path = which("brew-#{cmd}") || which("brew-#{cmd}.rb"))
- puts path
- else
- odie "Unknown command: #{cmd}"
- end
+ cmd = HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(ARGV.first, ARGV.first)
+
+ path = Commands.path(cmd)
+
+ cmd_paths = PATH.new(ENV["PATH"]).append(Tap.cmd_directories) unless path
+ path ||= which("brew-#{cmd}", cmd_paths)
+ path ||= which("brew-#{cmd}.rb", cmd_paths)
+
+ odie "Unknown command: #{cmd}" unless path
+ puts path
end
end
diff --git a/Library/Homebrew/cmd/commands.rb b/Library/Homebrew/cmd/commands.rb
index 0dfc6c451..244373482 100644
--- a/Library/Homebrew/cmd/commands.rb
+++ b/Library/Homebrew/cmd/commands.rb
@@ -9,27 +9,30 @@ module Homebrew
def commands
if ARGV.include? "--quiet"
- cmds = internal_commands + external_commands
+ cmds = internal_commands
+ cmds += external_commands
cmds += internal_developer_commands
cmds += HOMEBREW_INTERNAL_COMMAND_ALIASES.keys if ARGV.include? "--include-aliases"
puts Formatter.columns(cmds.sort)
- else
- # Find commands in Homebrew/cmd
- puts "Built-in commands"
- puts Formatter.columns(internal_commands.sort)
-
- # Find commands in Homebrew/dev-cmd
- puts
- puts "Built-in developer commands"
- puts Formatter.columns(internal_developer_commands.sort)
-
- # Find commands in the path
- unless (exts = external_commands).empty?
- puts
- puts "External commands"
- puts Formatter.columns(exts)
- end
+ return
end
+
+ # Find commands in Homebrew/cmd
+ puts "Built-in commands"
+ puts Formatter.columns(internal_commands.sort)
+
+ # Find commands in Homebrew/dev-cmd
+ puts
+ puts "Built-in developer commands"
+ puts Formatter.columns(internal_developer_commands.sort)
+
+ exts = external_commands
+ return if exts.empty?
+
+ # Find commands in the PATH
+ puts
+ puts "External commands"
+ puts Formatter.columns(exts)
end
def internal_commands
@@ -41,11 +44,13 @@ module Homebrew
end
def external_commands
- paths.each_with_object([]) do |path, cmds|
+ cmd_paths = PATH.new(ENV["PATH"]).append(Tap.cmd_directories)
+ cmd_paths.each_with_object([]) do |path, cmds|
Dir["#{path}/brew-*"].each do |file|
next unless File.executable?(file)
cmd = File.basename(file, ".rb")[5..-1]
- cmds << cmd unless cmd.include?(".")
+ next if cmd.include?(".")
+ cmds << cmd
end
end.sort
end
diff --git a/Library/Homebrew/commands.rb b/Library/Homebrew/commands.rb
index caf356b43..9f25f2a2e 100644
--- a/Library/Homebrew/commands.rb
+++ b/Library/Homebrew/commands.rb
@@ -1,13 +1,10 @@
module Commands
def self.path(cmd)
- if File.exist?(HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.sh")
- HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.sh"
- elsif File.exist?(HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.sh")
- HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.sh"
- elsif File.exist?(HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.rb")
- HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.rb"
- elsif File.exist?(HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.rb")
- HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.rb"
- end
+ [
+ HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.sh",
+ HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.sh",
+ HOMEBREW_LIBRARY_PATH/"cmd/#{cmd}.rb",
+ HOMEBREW_LIBRARY_PATH/"dev-cmd/#{cmd}.rb",
+ ].find(&:exist?)
end
end
diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb
index 2d1c47e32..ed93e1266 100644
--- a/Library/Homebrew/tap.rb
+++ b/Library/Homebrew/tap.rb
@@ -503,6 +503,11 @@ class Tap
map(&:name).sort
end
+ # an array of all tap cmd directory {Pathname}s
+ def self.cmd_directories
+ Pathname.glob TAP_DIRECTORY/"*/*/cmd"
+ end
+
# @private
def formula_file_to_name(file)
"#{name}/#{file.basename(".rb")}"