From 7a68b4a3f96c0cc76f94de2cd72b463b40be0343 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sun, 5 Nov 2017 15:37:57 +0000 Subject: [PATCH] Refactor command handling code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- Library/Homebrew/brew.rb | 14 +++++------ Library/Homebrew/cmd/command.rb | 19 +++++++------- Library/Homebrew/cmd/commands.rb | 43 ++++++++++++++++++-------------- Library/Homebrew/commands.rb | 15 +++++------ Library/Homebrew/tap.rb | 5 ++++ 5 files changed, 51 insertions(+), 45 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index e21e0bbd4f..bb663537d7 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 39e8ba6fc4..d964fa1a9b 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 0dfc6c4512..2443734821 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 caf356b438..9f25f2a2e6 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 2d1c47e32b..ed93e12663 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")}"