| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  | require 'download_strategy' | 
					
						
							|  |  |  | require 'checksum' | 
					
						
							|  |  |  | require 'version' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  | # Resource is the fundamental representation of an external resource. The | 
					
						
							|  |  |  | # primary formula download, along with other declared resources, are instances | 
					
						
							|  |  |  | # of this class. | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  | class Resource | 
					
						
							|  |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   attr_reader :checksum, :mirrors, :specs, :using | 
					
						
							| 
									
										
										
										
											2014-03-18 14:24:07 -05:00
										 |  |  |   attr_writer :url, :checksum, :version, :download_strategy | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   # Formula name must be set after the DSL, as we have no access to the | 
					
						
							|  |  |  |   # formula name before initialization of the formula | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   attr_accessor :name, :owner | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-23 21:39:19 -05:00
										 |  |  |   def initialize name=nil, &block | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |     @name = name | 
					
						
							| 
									
										
										
										
											2013-09-23 21:39:19 -05:00
										 |  |  |     @url = nil | 
					
						
							|  |  |  |     @version = nil | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |     @mirrors = [] | 
					
						
							|  |  |  |     @specs = {} | 
					
						
							|  |  |  |     @checksum = nil | 
					
						
							|  |  |  |     @using = nil | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:39 -05:00
										 |  |  |     instance_eval(&block) if block_given? | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   def downloader | 
					
						
							|  |  |  |     @downloader ||= download_strategy.new(download_name, self) | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:40 -05:00
										 |  |  |   def download_name | 
					
						
							| 
									
										
										
										
											2013-09-23 21:39:19 -05:00
										 |  |  |     name.nil? ? owner.name : "#{owner.name}--#{name}" | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:40 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def download_strategy | 
					
						
							|  |  |  |     @download_strategy ||= DownloadStrategyDetector.detect(url, using) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cached_download | 
					
						
							|  |  |  |     downloader.cached_location | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 14:28:49 -05:00
										 |  |  |   def clear_cache | 
					
						
							|  |  |  |     downloader.clear_cache | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 00:43:10 -05:00
										 |  |  |   # Fetch, verify, and unpack the resource | 
					
						
							|  |  |  |   def stage(target=nil, &block) | 
					
						
							|  |  |  |     verify_download_integrity(fetch) | 
					
						
							|  |  |  |     unpack(target, &block) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   # If a target is given, unpack there; else unpack to a temp folder | 
					
						
							|  |  |  |   # If block is given, yield to that block | 
					
						
							|  |  |  |   # A target or a block must be given, but not both | 
					
						
							| 
									
										
										
										
											2013-10-30 00:43:10 -05:00
										 |  |  |   def unpack(target=nil) | 
					
						
							| 
									
										
										
										
											2013-10-02 22:01:09 -05:00
										 |  |  |     mktemp(download_name) do | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |       downloader.stage | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |       if block_given? | 
					
						
							|  |  |  |         yield self | 
					
						
							| 
									
										
										
										
											2013-11-06 18:34:03 +00:00
										 |  |  |       elsif target | 
					
						
							| 
									
										
										
										
											2013-11-27 13:29:03 +00:00
										 |  |  |         target = Pathname.new(target) unless target.is_a? Pathname | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |         target.install Dir['*'] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:43 -05:00
										 |  |  |   Partial = Struct.new(:resource, :files) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def files(*files) | 
					
						
							|  |  |  |     Partial.new(self, files) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   # For brew-fetch and others. | 
					
						
							|  |  |  |   def fetch | 
					
						
							| 
									
										
										
										
											2014-02-18 15:08:03 -05:00
										 |  |  |     # Ensure the cache exists | 
					
						
							|  |  |  |     HOMEBREW_CACHE.mkpath | 
					
						
							|  |  |  |     downloader.fetch | 
					
						
							|  |  |  |   rescue ErrorDuringExecution, CurlDownloadStrategyError => e | 
					
						
							| 
									
										
										
										
											2014-02-18 15:08:03 -05:00
										 |  |  |     raise DownloadError.new(self, e) | 
					
						
							| 
									
										
										
										
											2014-02-18 15:08:03 -05:00
										 |  |  |   else | 
					
						
							|  |  |  |     cached_download | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def verify_download_integrity fn | 
					
						
							| 
									
										
										
										
											2013-10-30 00:43:10 -05:00
										 |  |  |     if fn.respond_to?(:file?) && fn.file? | 
					
						
							| 
									
										
										
										
											2013-12-08 21:37:22 +00:00
										 |  |  |       ohai "Verifying #{fn.basename} checksum" if ARGV.verbose? | 
					
						
							| 
									
										
										
										
											2013-10-30 00:43:10 -05:00
										 |  |  |       fn.verify_checksum(checksum) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   rescue ChecksumMissingError | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:41 -05:00
										 |  |  |     opoo "Cannot verify integrity of #{fn.basename}" | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |     puts "A checksum was not provided for this resource" | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |     puts "For your reference the SHA1 is: #{fn.sha1}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 21:02:00 -05:00
										 |  |  |   Checksum::TYPES.each do |type| | 
					
						
							|  |  |  |     define_method(type) { |val| @checksum = Checksum.new(type, val) } | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def url val=nil, specs={} | 
					
						
							|  |  |  |     return @url if val.nil? | 
					
						
							|  |  |  |     @url = val | 
					
						
							|  |  |  |     @specs.merge!(specs) | 
					
						
							| 
									
										
										
										
											2013-10-11 20:21:41 -05:00
										 |  |  |     @using = @specs.delete(:using) | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def version val=nil | 
					
						
							|  |  |  |     @version ||= detect_version(val) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def mirror val | 
					
						
							|  |  |  |     mirrors << val | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def detect_version(val) | 
					
						
							|  |  |  |     case val | 
					
						
							| 
									
										
										
										
											2014-05-27 21:41:43 -05:00
										 |  |  |     when nil     then Version.detect(url, specs) | 
					
						
							|  |  |  |     when String  then Version.new(val) | 
					
						
							|  |  |  |     when Version then val | 
					
						
							| 
									
										
										
										
											2013-09-17 21:25:38 -05:00
										 |  |  |     else | 
					
						
							|  |  |  |       raise TypeError, "version '#{val.inspect}' should be a string" | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-08-06 19:52:58 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | end |