aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Vandenberg2010-09-22 07:54:53 -0700
committerAdam Vandenberg2010-10-30 14:23:01 -0700
commitea03121688a19c827f1da230ac90c37e29e77608 (patch)
treeac3e189851f31c61b211398145fc306d7b9b3eda
parentd14323b9a07344404bd2f628bfe75db593727828 (diff)
downloadbrew-ea03121688a19c827f1da230ac90c37e29e77608.tar.bz2
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
-rw-r--r--Library/Homebrew/extend/ARGV.rb5
-rw-r--r--Library/Homebrew/formula.rb52
2 files changed, 47 insertions, 10 deletions
diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb
index a4189e73b..245bbcf56 100644
--- a/Library/Homebrew/extend/ARGV.rb
+++ b/Library/Homebrew/extend/ARGV.rb
@@ -136,6 +136,9 @@ module HomebrewArgvExtension
private
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
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index d9f110982..3df0d29f1 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -59,10 +59,10 @@ end
class Formula
include FileUtils
- attr_reader :url, :version, :homepage, :name, :specs, :downloader
+ attr_reader :name, :path, :url, :version, :homepage, :specs, :downloader
# Homebrew determines the name
- def initialize name='__UNKNOWN__'
+ def initialize name='__UNKNOWN__', path=nil
set_instance_variable 'homepage'
set_instance_variable 'url'
set_instance_variable 'head'
@@ -87,6 +87,8 @@ class Formula
@name=name
validate_variable :name
+ @path=path
+
set_instance_variable 'version'
@version ||= @spec_to_use.detect_version
validate_variable :version if @version
@@ -113,7 +115,11 @@ class Formula
end
def path
- self.class.path name
+ if @path.nil?
+ return self.class.path name
+ else
+ return @path
+ end
end
def prefix
@@ -276,6 +282,9 @@ class Formula
end
def self.resolve_alias name
+ # Don't resolve paths or URLs
+ return name if name.include?("/")
+
aka = HOMEBREW_REPOSITORY+"Library/Aliases/#{name}"
if aka.file?
aka.realpath.basename('.rb').to_s
@@ -285,14 +294,37 @@ class Formula
end
def self.factory name
+ # If an instance of Formula is passed, just return it
return name if name.kind_of? Formula
- path = Pathname.new(name)
- if path.absolute?
- require name
- name = path.stem
+
+ # If a URL is passed, download to the cache and install
+ if name =~ %r[(https?|ftp)://]
+ 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
- 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
+
begin
klass_name = self.class_s(name)
klass = eval(klass_name)
@@ -303,7 +335,9 @@ class Formula
puts "Double-check the name of the class in that formula."
raise LoadError
end
- return klass.new(name)
+
+ return klass.new(name) if install_type == :from_name
+ return klass.new(name, target_file)
rescue LoadError
raise FormulaUnavailableError.new(name)
end