
Symlinks in opt and LinkedKegs point directly at a keg in the cellar, so only resolving one symlink should suffice, and make it clear what path we are actually interested in.
206 lines
4.3 KiB
Ruby
206 lines
4.3 KiB
Ruby
module HomebrewArgvExtension
|
|
def named
|
|
@named ||= reject{|arg| arg[0..0] == '-'}
|
|
end
|
|
|
|
def options_only
|
|
select {|arg| arg[0..0] == '-'}
|
|
end
|
|
|
|
def formulae
|
|
require 'formula'
|
|
@formulae ||= downcased_unique_named.map{ |name| Formula.factory name }
|
|
return @formulae
|
|
end
|
|
|
|
def kegs
|
|
rack = nil
|
|
require 'keg'
|
|
require 'formula'
|
|
@kegs ||= downcased_unique_named.collect do |name|
|
|
canonical_name = Formula.canonical_name(name)
|
|
|
|
if canonical_name.include? "/"
|
|
# canonical_name returns a path if it was a formula installed via a
|
|
# URL. And we only want the name. FIXME that function is insane.
|
|
rack = HOMEBREW_CELLAR/Pathname.new(canonical_name).stem
|
|
else
|
|
rack = HOMEBREW_CELLAR/canonical_name
|
|
end
|
|
|
|
dirs = rack.directory? ? rack.subdirs : []
|
|
raise NoSuchKegError.new(rack.basename.to_s) if not rack.directory? or dirs.empty?
|
|
|
|
linked_keg_ref = HOMEBREW_REPOSITORY/"Library/LinkedKegs"/name
|
|
opt_prefix = HOMEBREW_PREFIX/"opt"/name
|
|
|
|
if opt_prefix.symlink? && opt_prefix.directory?
|
|
Keg.new(opt_prefix.resolved_path)
|
|
elsif linked_keg_ref.symlink? && linked_keg_ref.directory?
|
|
Keg.new(linked_keg_ref.resolved_path)
|
|
elsif dirs.length == 1
|
|
Keg.new(dirs.first)
|
|
elsif (prefix = Formula.factory(canonical_name).prefix).directory?
|
|
Keg.new(prefix)
|
|
else
|
|
raise MultipleVersionsInstalledError.new(name)
|
|
end
|
|
end
|
|
rescue FormulaUnavailableError
|
|
if rack
|
|
raise <<-EOS.undent
|
|
Multiple kegs installed to #{rack}
|
|
However we don't know which one you refer to.
|
|
Please delete (with rm -rf!) all but one and then try again.
|
|
Sorry, we know this is lame.
|
|
EOS
|
|
else
|
|
raise
|
|
end
|
|
end
|
|
|
|
# self documenting perhaps?
|
|
def include? arg
|
|
@n=index arg
|
|
end
|
|
def next
|
|
at @n+1 or raise UsageError
|
|
end
|
|
|
|
def value arg
|
|
arg = find {|o| o =~ /--#{arg}=(.+)/}
|
|
$1 if arg
|
|
end
|
|
|
|
def force?
|
|
flag? '--force'
|
|
end
|
|
def verbose?
|
|
flag? '--verbose' or !ENV['VERBOSE'].nil? or !ENV['HOMEBREW_VERBOSE'].nil?
|
|
end
|
|
def debug?
|
|
flag? '--debug' or !ENV['HOMEBREW_DEBUG'].nil?
|
|
end
|
|
def quieter?
|
|
flag? '--quieter'
|
|
end
|
|
def interactive?
|
|
flag? '--interactive'
|
|
end
|
|
def one?
|
|
flag? '--1'
|
|
end
|
|
def dry_run?
|
|
include?('--dry-run') || switch?('n')
|
|
end
|
|
|
|
def homebrew_developer?
|
|
include? '--homebrew-developer' or !ENV['HOMEBREW_DEVELOPER'].nil?
|
|
end
|
|
|
|
def ignore_deps?
|
|
include? '--ignore-dependencies'
|
|
end
|
|
|
|
def only_deps?
|
|
include? '--only-dependencies'
|
|
end
|
|
|
|
def json
|
|
value 'json'
|
|
end
|
|
|
|
def build_head?
|
|
include? '--HEAD'
|
|
end
|
|
|
|
def build_devel?
|
|
include? '--devel'
|
|
end
|
|
|
|
def build_stable?
|
|
not (build_head? or build_devel?)
|
|
end
|
|
|
|
def build_universal?
|
|
include? '--universal'
|
|
end
|
|
|
|
# Request a 32-bit only build.
|
|
# This is needed for some use-cases though we prefer to build Universal
|
|
# when a 32-bit version is needed.
|
|
def build_32_bit?
|
|
include? '--32-bit'
|
|
end
|
|
|
|
def build_bottle?
|
|
include? '--build-bottle' or !ENV['HOMEBREW_BUILD_BOTTLE'].nil?
|
|
end
|
|
|
|
def bottle_arch
|
|
arch = value 'bottle-arch'
|
|
arch.to_sym if arch
|
|
end
|
|
|
|
def build_from_source?
|
|
include? '--build-from-source' or !ENV['HOMEBREW_BUILD_FROM_SOURCE'].nil?
|
|
end
|
|
|
|
def flag? flag
|
|
options_only.any? do |arg|
|
|
arg == flag || arg[1..1] != '-' && arg.include?(flag[2..2])
|
|
end
|
|
end
|
|
|
|
def force_bottle?
|
|
include? '--force-bottle'
|
|
end
|
|
|
|
def help?
|
|
empty? || grep(/(-h$|--help$|--usage$|-\?$|help$)/).any?
|
|
end
|
|
|
|
def version?
|
|
include? '--version'
|
|
end
|
|
|
|
# eg. `foo -ns -i --bar` has three switches, n, s and i
|
|
def switch? switch_character
|
|
return false if switch_character.length > 1
|
|
options_only.any? do |arg|
|
|
arg[1..1] != '-' && arg.include?(switch_character)
|
|
end
|
|
end
|
|
|
|
def usage
|
|
require 'cmd/help'
|
|
Homebrew.help_s
|
|
end
|
|
|
|
def filter_for_dependencies
|
|
old_args = clone
|
|
delete "--devel"
|
|
delete "--HEAD"
|
|
yield
|
|
ensure
|
|
replace(old_args)
|
|
end
|
|
|
|
def cc
|
|
value 'cc'
|
|
end
|
|
|
|
def env
|
|
value 'env'
|
|
end
|
|
|
|
private
|
|
|
|
def downcased_unique_named
|
|
# Only lowercase names, not paths or URLs
|
|
@downcased_unique_named ||= named.map do |arg|
|
|
arg.include?("/") ? arg : arg.downcase
|
|
end.uniq
|
|
end
|
|
end
|