| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "resource" | 
					
						
							|  |  |  | require "erb" | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 16:23:42 -05:00
										 |  |  | module Patch | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |   def self.create(strip, src, &block) | 
					
						
							| 
									
										
										
										
											2014-07-10 12:38:09 -05:00
										 |  |  |     case strip | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |     when :DATA | 
					
						
							|  |  |  |       DATAPatch.new(:p1) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     when String | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |       StringPatch.new(:p1, strip) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     when Symbol | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |       case src | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |       when :DATA | 
					
						
							|  |  |  |         DATAPatch.new(strip) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |       when String | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |         StringPatch.new(strip, src) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |     when Array, String, :DATA | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |       { :p1 => list } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     end.each_pair do |strip, urls| | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |       Array(urls).each do |url| | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |         case url | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |         when :DATA | 
					
						
							|  |  |  |           patch = DATAPatch.new(strip) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |         else | 
					
						
							|  |  |  |           patch = LegacyPatch.new(strip, url) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         patches << patch | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     patches | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  | class EmbeddedPatch | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   attr_writer :owner | 
					
						
							|  |  |  |   attr_reader :strip | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |   def initialize(strip) | 
					
						
							|  |  |  |     @strip = strip | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 16:23:42 -05:00
										 |  |  |   def external? | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |   def contents | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def apply | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |     data = contents.gsub("HOMEBREW_PREFIX", HOMEBREW_PREFIX) | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     cmd = "/usr/bin/patch" | 
					
						
							|  |  |  |     args = %W[-g 0 -f -#{strip}] | 
					
						
							| 
									
										
										
										
											2014-09-18 20:32:50 -05:00
										 |  |  |     IO.popen("#{cmd} #{args.join(" ")}", "w") { |p| p.write(data) } | 
					
						
							|  |  |  |     raise ErrorDuringExecution.new(cmd, args) unless $?.success? | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  |   def inspect | 
					
						
							| 
									
										
										
										
											2014-07-01 15:07:06 -05:00
										 |  |  |     "#<#{self.class.name}: #{strip.inspect}>" | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  | class DATAPatch < EmbeddedPatch | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |   attr_accessor :path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(strip) | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:06 -05:00
										 |  |  |     @path = nil | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def contents | 
					
						
							|  |  |  |     data = "" | 
					
						
							|  |  |  |     path.open("rb") do |f| | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         line = f.gets | 
					
						
							|  |  |  |       end until line.nil? || /^__END__$/ === line | 
					
						
							|  |  |  |       data << line while line = f.gets | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     data | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 16:06:07 -05:00
										 |  |  | class StringPatch < EmbeddedPatch | 
					
						
							|  |  |  |   def initialize(strip, str) | 
					
						
							|  |  |  |     super(strip) | 
					
						
							|  |  |  |     @str = str | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def contents | 
					
						
							|  |  |  |     @str | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 16:23:42 -05:00
										 |  |  | class ExternalPatch | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   attr_reader :resource, :strip | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(strip, &block) | 
					
						
							|  |  |  |     @strip    = strip | 
					
						
							| 
									
										
										
										
											2016-01-25 08:21:57 -08:00
										 |  |  |     @resource = Resource::Patch.new(&block) | 
					
						
							| 
									
										
										
										
											2014-07-28 16:23:42 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def external? | 
					
						
							|  |  |  |     true | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def owner=(owner) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2016-01-25 08:21:57 -08:00
										 |  |  |       patch_dir = Pathname.pwd | 
					
						
							|  |  |  |       if patch_files.empty? | 
					
						
							|  |  |  |         children = patch_dir.children | 
					
						
							| 
									
										
										
										
											2016-02-06 14:19:58 -08:00
										 |  |  |         if (children.length == 1 && children.first.file?) | 
					
						
							| 
									
										
										
										
											2016-01-25 08:21:57 -08:00
										 |  |  |           patch_files << children.first.basename | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           raise MissingApplyError, <<-EOS.undent
 | 
					
						
							|  |  |  |             There should be exactly one patch file in the staging directory unless | 
					
						
							|  |  |  |             the "apply" method was used one or more times in the patch-do block. | 
					
						
							|  |  |  |           EOS | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       dir.cd do | 
					
						
							|  |  |  |         patch_files.each do |patch_file| | 
					
						
							|  |  |  |           ohai "Applying #{patch_file}" | 
					
						
							|  |  |  |           patch_file = patch_dir/patch_file | 
					
						
							|  |  |  |           safe_system "/usr/bin/patch", "-g", "0", "-f", "-#{strip}", "-i", patch_file | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 08:21:57 -08:00
										 |  |  |   def patch_files | 
					
						
							|  |  |  |     resource.patch_files | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-14 16:12:31 -05:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2014-07-01 15:07:06 -05:00
										 |  |  |     "#<#{self.class.name}: #{strip.inspect} #{url.inspect}>" | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:24 -05:00
										 |  |  |   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) | 
					
						
							| 
									
										
										
										
											2015-01-08 14:18:41 -05:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def verify_download_integrity(_fn) | 
					
						
							| 
									
										
										
										
											2014-03-13 19:51:23 -05:00
										 |  |  |     # 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 |