aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/cmd/create.rb2
-rw-r--r--Library/Homebrew/download_strategy.rb78
-rw-r--r--Library/Homebrew/formula_support.rb29
3 files changed, 61 insertions, 48 deletions
diff --git a/Library/Homebrew/cmd/create.rb b/Library/Homebrew/cmd/create.rb
index da86262c9..97f7e3907 100644
--- a/Library/Homebrew/cmd/create.rb
+++ b/Library/Homebrew/cmd/create.rb
@@ -88,7 +88,7 @@ class FormulaCreator
end
unless ARGV.include? "--no-fetch" and version
- strategy = detect_download_strategy url
+ strategy = DownloadStrategyDetector.new(url).detect
@sha1 = strategy.new(url, name, version, nil).fetch.sha1 if strategy == CurlDownloadStrategy
end
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index a509d098e..3e6a56317 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -562,27 +562,61 @@ class FossilDownloadStrategy < AbstractDownloadStrategy
end
end
-def detect_download_strategy url
- case url
- # We use a special URL pattern for cvs
- when %r[^cvs://] then CVSDownloadStrategy
- # Standard URLs
- when %r[^bzr://] then BazaarDownloadStrategy
- when %r[^git://] then GitDownloadStrategy
- when %r[^https?://.+\.git$] then GitDownloadStrategy
- when %r[^hg://] then MercurialDownloadStrategy
- when %r[^svn://] then SubversionDownloadStrategy
- when %r[^svn\+http://] then SubversionDownloadStrategy
- when %r[^fossil://] then FossilDownloadStrategy
- # Some well-known source hosts
- when %r[^https?://(.+?\.)?googlecode\.com/hg] then MercurialDownloadStrategy
- when %r[^https?://(.+?\.)?googlecode\.com/svn] then SubversionDownloadStrategy
- when %r[^https?://(.+?\.)?sourceforge\.net/svnroot/] then SubversionDownloadStrategy
- when %r[^http://svn.apache.org/repos/] then SubversionDownloadStrategy
- when %r[^http://www.apache.org/dyn/closer.cgi] then CurlApacheMirrorDownloadStrategy
- # Common URL patterns
- when %r[^https?://svn\.] then SubversionDownloadStrategy
- # Otherwise just try to download
- else CurlDownloadStrategy
+class DownloadStrategyDetector
+ def initialize url, strategy=nil
+ @url = url
+ @strategy = strategy
+ end
+
+ def detect
+ case @strategy
+ when AbstractDownloadStrategy then @strategy
+ when Symbol then detect_from_symbol
+ else detect_from_url
+ end
+ end
+
+ private
+
+ def detect_from_url
+ case @url
+ # We use a special URL pattern for cvs
+ when %r[^cvs://] then CVSDownloadStrategy
+ # Standard URLs
+ when %r[^bzr://] then BazaarDownloadStrategy
+ when %r[^git://] then GitDownloadStrategy
+ when %r[^https?://.+\.git$] then GitDownloadStrategy
+ when %r[^hg://] then MercurialDownloadStrategy
+ when %r[^svn://] then SubversionDownloadStrategy
+ when %r[^svn\+http://] then SubversionDownloadStrategy
+ when %r[^fossil://] then FossilDownloadStrategy
+ # Some well-known source hosts
+ when %r[^https?://(.+?\.)?googlecode\.com/hg] then MercurialDownloadStrategy
+ when %r[^https?://(.+?\.)?googlecode\.com/svn] then SubversionDownloadStrategy
+ when %r[^https?://(.+?\.)?sourceforge\.net/svnroot/] then SubversionDownloadStrategy
+ when %r[^http://svn.apache.org/repos/] then SubversionDownloadStrategy
+ when %r[^http://www.apache.org/dyn/closer.cgi] then CurlApacheMirrorDownloadStrategy
+ # Common URL patterns
+ when %r[^https?://svn\.] then SubversionDownloadStrategy
+ when bottle_native_regex, bottle_regex, old_bottle_regex
+ CurlBottleDownloadStrategy
+ # Otherwise just try to download
+ else CurlDownloadStrategy
+ end
+ end
+
+ def detect_from_symbol
+ case @strategy
+ when :bzr then BazaarDownloadStrategy
+ when :curl then CurlDownloadStrategy
+ when :cvs then CVSDownloadStrategy
+ when :git then GitDownloadStrategy
+ when :hg then MercurialDownloadStrategy
+ when :nounzip then NoUnzipCurlDownloadStrategy
+ when :post then CurlPostDownloadStrategy
+ when :svn then SubversionDownloadStrategy
+ else
+ raise "Unknown download strategy #{@strategy} was requested."
+ end
end
end
diff --git a/Library/Homebrew/formula_support.rb b/Library/Homebrew/formula_support.rb
index 0449094cb..e9a306ade 100644
--- a/Library/Homebrew/formula_support.rb
+++ b/Library/Homebrew/formula_support.rb
@@ -2,35 +2,15 @@ require 'download_strategy'
require 'checksums'
class SoftwareSpec
- attr_reader :checksum, :mirrors, :specs, :strategy
-
- VCS_SYMBOLS = {
- :bzr => BazaarDownloadStrategy,
- :curl => CurlDownloadStrategy,
- :cvs => CVSDownloadStrategy,
- :git => GitDownloadStrategy,
- :hg => MercurialDownloadStrategy,
- :nounzip => NoUnzipCurlDownloadStrategy,
- :post => CurlPostDownloadStrategy,
- :svn => SubversionDownloadStrategy,
- }
+ attr_reader :checksum, :mirrors, :specs
# Was the version defined in the DSL, or detected from the URL?
def explicit_version?
@explicit_version || false
end
- # Returns a suitable DownloadStrategy class that can be
- # used to retrieve this software package.
def download_strategy
- return detect_download_strategy(@url) if @strategy.nil?
-
- # If a class is passed, assume it is a download strategy
- return @strategy if @strategy.kind_of? Class
-
- detected = VCS_SYMBOLS[@strategy]
- raise "Unknown strategy #{@strategy} was requested." unless detected
- return detected
+ @download_strategy ||= DownloadStrategyDetector.new(@url, @using).detect
end
def verify_download_integrity fn
@@ -64,9 +44,9 @@ class SoftwareSpec
return @url if val.nil?
@url = val
if specs.nil?
- @strategy = nil
+ @using = nil
else
- @strategy = specs.delete :using
+ @using = specs.delete :using
@specs = specs
end
end
@@ -104,7 +84,6 @@ class Bottle < SoftwareSpec
def initialize
super
@revision = 0
- @strategy = CurlBottleDownloadStrategy
end
# Checksum methods in the DSL's bottle block optionally take