diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 70f9af3109..ee32352063 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -671,8 +671,8 @@ class Formula specs.each { |spec| spec.option(name, description) } end - def patch strip=:p1, io=nil, &block - specs.each { |spec| spec.patch(strip, io, &block) } + def patch strip=:p1, src=nil, &block + specs.each { |spec| spec.patch(strip, src, &block) } end def plist_options options diff --git a/Library/Homebrew/patch.rb b/Library/Homebrew/patch.rb index 477eb20a80..53ea0ac6d0 100644 --- a/Library/Homebrew/patch.rb +++ b/Library/Homebrew/patch.rb @@ -1,24 +1,19 @@ require 'resource' -require 'stringio' require 'erb' module Patch - def self.create(strip, io, &block) + def self.create(strip, src, &block) case strip when :DATA DATAPatch.new(:p1) - when IO, StringIO - IOPatch.new(strip, :p1) when String - IOPatch.new(StringIO.new(strip), :p1) + StringPatch.new(:p1, strip) when Symbol - case io + case src when :DATA DATAPatch.new(strip) - when IO, StringIO - IOPatch.new(io, strip) when String - IOPatch.new(StringIO.new(io), strip) + StringPatch.new(strip, src) else ExternalPatch.new(strip, &block) end @@ -53,31 +48,26 @@ module Patch end end -class IOPatch +class EmbeddedPatch attr_writer :owner attr_reader :strip + def initialize(strip) + @strip = strip + end + def external? false end - def initialize(io, strip) - @io = io - @strip = strip + def contents + raise NotImplementedError end def apply data = contents.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 - - def contents - @io.read end def inspect @@ -85,11 +75,11 @@ class IOPatch end end -class DATAPatch < IOPatch +class DATAPatch < EmbeddedPatch attr_accessor :path def initialize(strip) - @strip = strip + super @path = nil end @@ -105,6 +95,17 @@ class DATAPatch < IOPatch end end +class StringPatch < EmbeddedPatch + def initialize(strip, str) + super(strip) + @str = str + end + + def contents + @str + end +end + class ExternalPatch attr_reader :resource, :strip diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index fb29ad5a65..e173cb4766 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -90,8 +90,8 @@ class SoftwareSpec dependency_collector.requirements end - def patch strip=:p1, io=nil, &block - patches << Patch.create(strip, io, &block) + def patch strip=:p1, src=nil, &block + patches << Patch.create(strip, src, &block) end def add_legacy_patches(list) diff --git a/Library/Homebrew/test/test_patch.rb b/Library/Homebrew/test/test_patch.rb index 4b8cdf53c1..a70d581d87 100644 --- a/Library/Homebrew/test/test_patch.rb +++ b/Library/Homebrew/test/test_patch.rb @@ -9,28 +9,15 @@ class PatchTests < Homebrew::TestCase assert_equal :p2, patch.strip end - def test_create_io - patch = Patch.create(:p0, StringIO.new("foo")) - assert_kind_of IOPatch, patch - refute_predicate patch, :external? - assert_equal :p0, patch.strip - end - - def test_create_io_without_strip - patch = Patch.create(StringIO.new("foo"), nil) - assert_kind_of IOPatch, patch - assert_equal :p1, patch.strip - end - def test_create_string patch = Patch.create(:p0, "foo") - assert_kind_of IOPatch, patch + assert_kind_of StringPatch, patch assert_equal :p0, patch.strip end def test_create_string_without_strip patch = Patch.create("foo", nil) - assert_kind_of IOPatch, patch + assert_kind_of StringPatch, patch assert_equal :p1, patch.strip end