| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | require 'resource' | 
					
						
							|  |  |  | require 'stringio' | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | require 'erb' | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Patch | 
					
						
							|  |  |  |   def self.create(strip, io=nil, &block) | 
					
						
							|  |  |  |     case strip ||= :p1 | 
					
						
							|  |  |  |     when :DATA, IO, StringIO | 
					
						
							|  |  |  |       IOPatch.new(strip, :p1) | 
					
						
							|  |  |  |     when String | 
					
						
							|  |  |  |       IOPatch.new(StringIO.new(strip), :p1) | 
					
						
							|  |  |  |     when Symbol | 
					
						
							|  |  |  |       case io | 
					
						
							|  |  |  |       when :DATA, IO, StringIO | 
					
						
							|  |  |  |         IOPatch.new(io, strip) | 
					
						
							|  |  |  |       when String | 
					
						
							|  |  |  |         IOPatch.new(StringIO.new(io), strip) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         ExternalPatch.new(strip, &block) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       raise ArgumentError, "unexpected value #{strip.inspect} for strip" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   def self.normalize_legacy_patches(list) | 
					
						
							|  |  |  |     patches = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case list | 
					
						
							|  |  |  |     when Hash | 
					
						
							|  |  |  |       list | 
					
						
							|  |  |  |     when Array, String, IO, StringIO | 
					
						
							|  |  |  |       { :p1 => list } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     end.each_pair do |strip, urls| | 
					
						
							|  |  |  |       urls = [urls] unless Array === urls | 
					
						
							|  |  |  |       urls.each do |url| | 
					
						
							|  |  |  |         case url | 
					
						
							|  |  |  |         when IO, StringIO | 
					
						
							|  |  |  |           patch = IOPatch.new(url, strip) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           patch = LegacyPatch.new(strip, url) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         patches << patch | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     patches | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   attr_reader :whence | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def external? | 
					
						
							|  |  |  |     whence == :resource | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class IOPatch < Patch | 
					
						
							|  |  |  |   attr_writer :owner | 
					
						
							|  |  |  |   attr_reader :strip | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(io, strip) | 
					
						
							|  |  |  |     @io     = io | 
					
						
							|  |  |  |     @strip  = strip | 
					
						
							|  |  |  |     @whence = :io | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def apply | 
					
						
							|  |  |  |     @io = DATA if @io == :DATA | 
					
						
							|  |  |  |     data = @io.read | 
					
						
							|  |  |  |     data.gsub!("HOMEBREW_PREFIX", HOMEBREW_PREFIX) | 
					
						
							|  |  |  |     IO.popen("/usr/bin/patch -g 0 -f -#{strip}", "w") { |p| p.write(data) } | 
					
						
							|  |  |  |     raise ErrorDuringExecution, "Applying DATA patch failed" unless $?.success? | 
					
						
							|  |  |  |   ensure | 
					
						
							|  |  |  |     # IO and StringIO cannot be marshaled, so remove the reference | 
					
						
							|  |  |  |     # in case we are indirectly referenced by an exception later. | 
					
						
							|  |  |  |     @io = nil | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class}: #{strip.inspect}>" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ExternalPatch < Patch | 
					
						
							|  |  |  |   attr_reader :resource, :strip | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(strip, &block) | 
					
						
							|  |  |  |     @strip    = strip | 
					
						
							| 
									
										
										
										
											2014-03-15 22:40:14 -05:00
										 |  |  |     @resource = Resource.new("patch", &block) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     @whence   = :resource | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def owner= owner | 
					
						
							|  |  |  |     resource.owner   = owner | 
					
						
							| 
									
										
										
										
											2014-03-14 12:38:06 -05:00
										 |  |  |     resource.version = resource.checksum || ERB::Util.url_encode(resource.url) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def apply | 
					
						
							|  |  |  |     dir = Pathname.pwd | 
					
						
							|  |  |  |     resource.unpack do | 
					
						
							|  |  |  |       # Assumption: the only file in the staging directory is the patch | 
					
						
							|  |  |  |       patchfile = Pathname.pwd.children.first | 
					
						
							|  |  |  |       safe_system "/usr/bin/patch", "-g", "0", "-f", "-d", dir, "-#{strip}", "-i", patchfile | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-14 16:12:31 -05:00
										 |  |  |   def url | 
					
						
							|  |  |  |     resource.url | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch | 
					
						
							|  |  |  |     resource.fetch | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def verify_download_integrity(fn) | 
					
						
							|  |  |  |     resource.verify_download_integrity(fn) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def cached_download | 
					
						
							|  |  |  |     resource.cached_download | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def clear_cache | 
					
						
							|  |  |  |     resource.clear_cache | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class}: #{strip.inspect} #{url.inspect}>" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Legacy patches have no checksum and are not cached | 
					
						
							|  |  |  | class LegacyPatch < ExternalPatch | 
					
						
							|  |  |  |   def initialize(strip, url) | 
					
						
							|  |  |  |     super(strip) | 
					
						
							|  |  |  |     resource.url = url | 
					
						
							| 
									
										
										
										
											2014-03-18 14:24:07 -05:00
										 |  |  |     resource.download_strategy = CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch | 
					
						
							| 
									
										
										
										
											2014-03-14 16:12:31 -05:00
										 |  |  |     clear_cache | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def verify_download_integrity(fn) | 
					
						
							|  |  |  |     # no-op | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def apply | 
					
						
							|  |  |  |     super | 
					
						
							|  |  |  |   ensure | 
					
						
							| 
									
										
										
										
											2014-03-14 16:12:31 -05:00
										 |  |  |     clear_cache | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | end |