Simplify internal representation of patches
- remove support for IO objects, since we no longer access ::DATA directly - since we don't need to support IO objects, use a separate class for string patches and stop wrapping strings in StringIO ojects
This commit is contained in:
parent
3f12ddbccd
commit
a55e196f5f
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user