Allow installation from URLs
This allows installation like:
brew install http://example.com/something.rb
Based on an original patch by [dwalters].
Fixes Homebrew/homebrew#160
This commit is contained in:
parent
d14323b9a0
commit
ea03121688
@ -136,6 +136,9 @@ module HomebrewArgvExtension
|
|||||||
private
|
private
|
||||||
|
|
||||||
def downcased_unique_named
|
def downcased_unique_named
|
||||||
@downcased_unique_named ||= named.map{|arg| arg.downcase}.uniq
|
# Only lowercase names, not paths or URLs
|
||||||
|
@downcased_unique_named ||= named.map do |arg|
|
||||||
|
arg.include?("/") ? arg : arg.downcase
|
||||||
|
end.uniq
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -59,10 +59,10 @@ end
|
|||||||
class Formula
|
class Formula
|
||||||
include FileUtils
|
include FileUtils
|
||||||
|
|
||||||
attr_reader :url, :version, :homepage, :name, :specs, :downloader
|
attr_reader :name, :path, :url, :version, :homepage, :specs, :downloader
|
||||||
|
|
||||||
# Homebrew determines the name
|
# Homebrew determines the name
|
||||||
def initialize name='__UNKNOWN__'
|
def initialize name='__UNKNOWN__', path=nil
|
||||||
set_instance_variable 'homepage'
|
set_instance_variable 'homepage'
|
||||||
set_instance_variable 'url'
|
set_instance_variable 'url'
|
||||||
set_instance_variable 'head'
|
set_instance_variable 'head'
|
||||||
@ -87,6 +87,8 @@ class Formula
|
|||||||
@name=name
|
@name=name
|
||||||
validate_variable :name
|
validate_variable :name
|
||||||
|
|
||||||
|
@path=path
|
||||||
|
|
||||||
set_instance_variable 'version'
|
set_instance_variable 'version'
|
||||||
@version ||= @spec_to_use.detect_version
|
@version ||= @spec_to_use.detect_version
|
||||||
validate_variable :version if @version
|
validate_variable :version if @version
|
||||||
@ -113,7 +115,11 @@ class Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
def path
|
def path
|
||||||
self.class.path name
|
if @path.nil?
|
||||||
|
return self.class.path name
|
||||||
|
else
|
||||||
|
return @path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def prefix
|
def prefix
|
||||||
@ -276,6 +282,9 @@ class Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.resolve_alias name
|
def self.resolve_alias name
|
||||||
|
# Don't resolve paths or URLs
|
||||||
|
return name if name.include?("/")
|
||||||
|
|
||||||
aka = HOMEBREW_REPOSITORY+"Library/Aliases/#{name}"
|
aka = HOMEBREW_REPOSITORY+"Library/Aliases/#{name}"
|
||||||
if aka.file?
|
if aka.file?
|
||||||
aka.realpath.basename('.rb').to_s
|
aka.realpath.basename('.rb').to_s
|
||||||
@ -285,14 +294,37 @@ class Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.factory name
|
def self.factory name
|
||||||
|
# If an instance of Formula is passed, just return it
|
||||||
return name if name.kind_of? Formula
|
return name if name.kind_of? Formula
|
||||||
path = Pathname.new(name)
|
|
||||||
if path.absolute?
|
# If a URL is passed, download to the cache and install
|
||||||
require name
|
if name =~ %r[(https?|ftp)://]
|
||||||
name = path.stem
|
url = name
|
||||||
|
name = Pathname.new(name).basename
|
||||||
|
target_file = (HOMEBREW_CACHE+"Formula"+name)
|
||||||
|
name = name.basename(".rb").to_s
|
||||||
|
|
||||||
|
(HOMEBREW_CACHE+"Formula").mkpath
|
||||||
|
FileUtils.rm target_file, :force => true
|
||||||
|
curl url, '-o', target_file
|
||||||
|
|
||||||
|
require target_file
|
||||||
|
install_type = :from_url
|
||||||
else
|
else
|
||||||
require self.path(name)
|
# Check if this is a name or pathname
|
||||||
|
path = Pathname.new(name)
|
||||||
|
if path.absolute?
|
||||||
|
# For absolute paths, just require the path
|
||||||
|
require name
|
||||||
|
name = path.stem
|
||||||
|
install_type = :from_path
|
||||||
|
else
|
||||||
|
# For names, map to the path and then require
|
||||||
|
require self.path(name)
|
||||||
|
install_type = :from_name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
begin
|
begin
|
||||||
klass_name = self.class_s(name)
|
klass_name = self.class_s(name)
|
||||||
klass = eval(klass_name)
|
klass = eval(klass_name)
|
||||||
@ -303,7 +335,9 @@ class Formula
|
|||||||
puts "Double-check the name of the class in that formula."
|
puts "Double-check the name of the class in that formula."
|
||||||
raise LoadError
|
raise LoadError
|
||||||
end
|
end
|
||||||
return klass.new(name)
|
|
||||||
|
return klass.new(name) if install_type == :from_name
|
||||||
|
return klass.new(name, target_file)
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
raise FormulaUnavailableError.new(name)
|
raise FormulaUnavailableError.new(name)
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user