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
|
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
|
|
|
|
|
|
|
|
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
|
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)
|
|
|
|
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
|