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:
Adam Vandenberg 2010-09-22 07:54:53 -07:00
parent d14323b9a0
commit ea03121688
2 changed files with 47 additions and 10 deletions

View File

@ -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

View File

@ -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