mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
Enable new patch implementation with compatibility layer
This commit is contained in:
parent
bc6e4a1894
commit
665b14c4a4
@ -3,7 +3,6 @@ require 'formula_lock'
|
|||||||
require 'formula_pin'
|
require 'formula_pin'
|
||||||
require 'hardware'
|
require 'hardware'
|
||||||
require 'bottles'
|
require 'bottles'
|
||||||
require 'patches'
|
|
||||||
require 'compilers'
|
require 'compilers'
|
||||||
require 'build_environment'
|
require 'build_environment'
|
||||||
require 'build_options'
|
require 'build_options'
|
||||||
@ -224,16 +223,7 @@ class Formula
|
|||||||
# any e.g. configure options for this package
|
# any e.g. configure options for this package
|
||||||
def options; [] end
|
def options; [] end
|
||||||
|
|
||||||
# patches are automatically applied after extracting the tarball
|
def patches; {} end
|
||||||
# return an array of strings, or if you need a patch level other than -p1
|
|
||||||
# return a Hash eg.
|
|
||||||
# {
|
|
||||||
# :p0 => ['http://foo.com/patch1', 'http://foo.com/patch2'],
|
|
||||||
# :p1 => 'http://bar.com/patch2'
|
|
||||||
# }
|
|
||||||
# The final option is to return DATA, then put a diff after __END__. You
|
|
||||||
# can still return a Hash with DATA as the value for a patch level key.
|
|
||||||
def patches; end
|
|
||||||
|
|
||||||
# rarely, you don't want your library symlinked into the main prefix
|
# rarely, you don't want your library symlinked into the main prefix
|
||||||
# see gettext.rb for an example
|
# see gettext.rb for an example
|
||||||
@ -633,23 +623,15 @@ class Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
def patch
|
def patch
|
||||||
patch_list = Patches.new(patches)
|
active_spec.add_legacy_patches(patches)
|
||||||
return if patch_list.empty?
|
return if patchlist.empty?
|
||||||
|
|
||||||
if patch_list.external_patches?
|
active_spec.patches.select(&:external?).each do |patch|
|
||||||
ohai "Downloading patches"
|
patch.verify_download_integrity(patch.fetch)
|
||||||
patch_list.download!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
ohai "Patching"
|
ohai "Patching"
|
||||||
patch_list.each do |p|
|
active_spec.patches.each(&:apply)
|
||||||
case p.compression
|
|
||||||
when :gzip then with_system_path { safe_system "gunzip", p.compressed_filename }
|
|
||||||
when :bzip2 then with_system_path { safe_system "bunzip2", p.compressed_filename }
|
|
||||||
end
|
|
||||||
# -f means don't prompt the user if there are errors; just exit with non-zero status
|
|
||||||
safe_system '/usr/bin/patch', '-g', '0', '-f', *(p.patch_args)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Explicitly request changing C++ standard library compatibility check
|
# Explicitly request changing C++ standard library compatibility check
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
require 'resource'
|
require 'resource'
|
||||||
require 'stringio'
|
require 'stringio'
|
||||||
|
require 'erb'
|
||||||
|
|
||||||
class Patch
|
class Patch
|
||||||
def self.create(strip, io=nil, &block)
|
def self.create(strip, io=nil, &block)
|
||||||
@ -22,6 +23,32 @@ class Patch
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
attr_reader :whence
|
attr_reader :whence
|
||||||
|
|
||||||
def external?
|
def external?
|
||||||
@ -80,3 +107,31 @@ class ExternalPatch < Patch
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Legacy patches have no checksum and are not cached
|
||||||
|
class LegacyPatch < ExternalPatch
|
||||||
|
def initialize(strip, url)
|
||||||
|
super(strip)
|
||||||
|
resource.url = url
|
||||||
|
end
|
||||||
|
|
||||||
|
def owner= owner
|
||||||
|
super
|
||||||
|
resource.name = "patch-#{ERB::Util.url_encode(resource.url)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch
|
||||||
|
resource.clear_cache
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def verify_download_integrity(fn)
|
||||||
|
# no-op
|
||||||
|
end
|
||||||
|
|
||||||
|
def apply
|
||||||
|
super
|
||||||
|
ensure
|
||||||
|
resource.clear_cache
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@ -1,143 +0,0 @@
|
|||||||
require 'stringio'
|
|
||||||
|
|
||||||
class Patches
|
|
||||||
include Enumerable
|
|
||||||
|
|
||||||
# The patches defined in a formula and the DATA from that file
|
|
||||||
def initialize patches
|
|
||||||
@patches = []
|
|
||||||
return if patches.nil?
|
|
||||||
n = 0
|
|
||||||
normalize_patches(patches).each do |patch_p, urls|
|
|
||||||
# Wrap the urls list in an array if it isn't already;
|
|
||||||
# DATA.each does each line, which doesn't work so great
|
|
||||||
urls = [urls] unless urls.kind_of? Array
|
|
||||||
urls.each do |url|
|
|
||||||
@patches << Patch.new(patch_p, '%03d-homebrew.diff' % n, url)
|
|
||||||
n += 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def external_patches?
|
|
||||||
not external_curl_args.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
def each(&blk)
|
|
||||||
@patches.each(&blk)
|
|
||||||
end
|
|
||||||
def empty?
|
|
||||||
@patches.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
def download!
|
|
||||||
return unless external_patches?
|
|
||||||
|
|
||||||
# downloading all at once is much more efficient, especially for FTP
|
|
||||||
curl(*external_curl_args)
|
|
||||||
|
|
||||||
external_patches.each{|p| p.stage!}
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def external_patches
|
|
||||||
@patches.select{|p| p.external?}
|
|
||||||
end
|
|
||||||
|
|
||||||
# Collects the urls and output names of all external patches
|
|
||||||
def external_curl_args
|
|
||||||
external_patches.collect{|p| p.curl_args}.flatten
|
|
||||||
end
|
|
||||||
|
|
||||||
def normalize_patches patches
|
|
||||||
if patches.kind_of? Hash
|
|
||||||
patches
|
|
||||||
else
|
|
||||||
{ :p1 => patches } # We assume -p1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
class Patch
|
|
||||||
# Used by formula to unpack after downloading
|
|
||||||
attr_reader :compression
|
|
||||||
attr_reader :compressed_filename
|
|
||||||
# Used by audit
|
|
||||||
attr_reader :url
|
|
||||||
|
|
||||||
def initialize patch_p, filename, url
|
|
||||||
@patch_p = patch_p
|
|
||||||
@patch_filename = filename
|
|
||||||
@compressed_filename = nil
|
|
||||||
@compression = nil
|
|
||||||
@url = nil
|
|
||||||
|
|
||||||
if url.kind_of? IO or url.kind_of? StringIO
|
|
||||||
# File-like objects. Most common when DATA is passed.
|
|
||||||
write_data url
|
|
||||||
elsif looks_like_url(url)
|
|
||||||
@url = url # Save URL to mark this as an external patch
|
|
||||||
else
|
|
||||||
# it's a file on the local filesystem
|
|
||||||
# use URL as the filename for patch
|
|
||||||
@patch_filename = url
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# rename the downloaded file to take compression into account
|
|
||||||
def stage!
|
|
||||||
return unless external?
|
|
||||||
detect_compression!
|
|
||||||
case @compression
|
|
||||||
when :gzip
|
|
||||||
@compressed_filename = @patch_filename + '.gz'
|
|
||||||
FileUtils.mv @patch_filename, @compressed_filename
|
|
||||||
when :bzip2
|
|
||||||
@compressed_filename = @patch_filename + '.bz2'
|
|
||||||
FileUtils.mv @patch_filename, @compressed_filename
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def external?
|
|
||||||
not @url.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def patch_args
|
|
||||||
["-#{@patch_p}", '-i', @patch_filename]
|
|
||||||
end
|
|
||||||
|
|
||||||
def curl_args
|
|
||||||
[@url, '-o', @patch_filename]
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
# Detect compression type from the downloaded patch.
|
|
||||||
def detect_compression!
|
|
||||||
# If nil we have not tried to detect yet
|
|
||||||
if @compression.nil?
|
|
||||||
path = Pathname.new(@patch_filename)
|
|
||||||
if path.exist?
|
|
||||||
@compression = path.compression_type
|
|
||||||
@compression ||= :none # If nil, convert to :none
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write the given file object (DATA) out to a local file for patch
|
|
||||||
def write_data f
|
|
||||||
pn = Pathname.new @patch_filename
|
|
||||||
pn.write(brew_var_substitution(f.read.to_s))
|
|
||||||
end
|
|
||||||
|
|
||||||
# Do any supported substitutions of HOMEBREW vars in a DATA patch
|
|
||||||
def brew_var_substitution s
|
|
||||||
s.gsub("HOMEBREW_PREFIX", HOMEBREW_PREFIX)
|
|
||||||
end
|
|
||||||
|
|
||||||
def looks_like_url str
|
|
||||||
str =~ %r[^\w+\://]
|
|
||||||
end
|
|
||||||
end
|
|
@ -91,6 +91,12 @@ class SoftwareSpec
|
|||||||
def patch strip=:p1, io=nil, &block
|
def patch strip=:p1, io=nil, &block
|
||||||
patches << Patch.create(strip, io, &block)
|
patches << Patch.create(strip, io, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def add_legacy_patches(list)
|
||||||
|
list = Patch.normalize_legacy_patches(list)
|
||||||
|
list.each { |p| p.owner = self }
|
||||||
|
patches.concat(list)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class HeadSoftwareSpec < SoftwareSpec
|
class HeadSoftwareSpec < SoftwareSpec
|
||||||
|
@ -50,3 +50,66 @@ class PatchTests < Test::Unit::TestCase
|
|||||||
assert_raises(ArgumentError) { Patch.create(Object.new) }
|
assert_raises(ArgumentError) { Patch.create(Object.new) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class LegacyPatchTests < Test::Unit::TestCase
|
||||||
|
def test_patch_single_string
|
||||||
|
patches = Patch.normalize_legacy_patches("http://example.com/patch.diff")
|
||||||
|
assert_equal 1, patches.length
|
||||||
|
assert_equal :p1, patches.first.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_patch_array
|
||||||
|
patches = Patch.normalize_legacy_patches(
|
||||||
|
%w{http://example.com/patch1.diff http://example.com/patch2.diff}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal 2, patches.length
|
||||||
|
assert_equal :p1, patches[0].strip
|
||||||
|
assert_equal :p1, patches[1].strip
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_p0_hash_to_string
|
||||||
|
patches = Patch.normalize_legacy_patches(
|
||||||
|
:p0 => "http://example.com/patch.diff"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal 1, patches.length
|
||||||
|
assert_equal :p0, patches.first.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_p1_hash_to_string
|
||||||
|
patches = Patch.normalize_legacy_patches(
|
||||||
|
:p1 => "http://example.com/patch.diff"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal 1, patches.length
|
||||||
|
assert_equal :p1, patches.first.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_mixed_hash_to_strings
|
||||||
|
patches = Patch.normalize_legacy_patches(
|
||||||
|
:p1 => "http://example.com/patch1.diff",
|
||||||
|
:p0 => "http://example.com/patch0.diff"
|
||||||
|
)
|
||||||
|
assert_equal 2, patches.length
|
||||||
|
assert_equal 1, patches.select { |p| p.strip == :p0 }.length
|
||||||
|
assert_equal 1, patches.select { |p| p.strip == :p1 }.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_mixed_hash_to_arrays
|
||||||
|
patches = Patch.normalize_legacy_patches(
|
||||||
|
:p1 => ["http://example.com/patch10.diff",
|
||||||
|
"http://example.com/patch11.diff"],
|
||||||
|
:p0 => ["http://example.com/patch00.diff",
|
||||||
|
"http://example.com/patch01.diff"]
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal 4, patches.length
|
||||||
|
assert_equal 2, patches.select { |p| p.strip == :p0 }.length
|
||||||
|
assert_equal 2, patches.select { |p| p.strip == :p1 }.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_nil
|
||||||
|
assert_empty Patch.normalize_legacy_patches(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@ -1,88 +0,0 @@
|
|||||||
require 'testing_env'
|
|
||||||
require 'test/testball'
|
|
||||||
require 'set'
|
|
||||||
|
|
||||||
# Expose some internals
|
|
||||||
class Patches
|
|
||||||
attr_reader :patches
|
|
||||||
end
|
|
||||||
|
|
||||||
class Patch
|
|
||||||
attr_reader :patch_p
|
|
||||||
attr_reader :patch_filename
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
class PatchingTests < Test::Unit::TestCase
|
|
||||||
def test_patchSingleString
|
|
||||||
patches = Patches.new("http://example.com/patch.diff")
|
|
||||||
assert_equal 1, patches.patches.length
|
|
||||||
p = patches.patches[0]
|
|
||||||
assert_equal :p1, p.patch_p
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_patchArray
|
|
||||||
patches = Patches.new(["http://example.com/patch1.diff", "http://example.com/patch2.diff"])
|
|
||||||
assert_equal 2, patches.patches.length
|
|
||||||
|
|
||||||
p1 = patches.patches[0]
|
|
||||||
assert_equal :p1, p1.patch_p
|
|
||||||
|
|
||||||
p2 = patches.patches[0]
|
|
||||||
assert_equal :p1, p2.patch_p
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_p0_hash_to_string
|
|
||||||
patches = Patches.new({
|
|
||||||
:p0 => "http://example.com/patch.diff"
|
|
||||||
})
|
|
||||||
assert_equal 1, patches.patches.length
|
|
||||||
|
|
||||||
p = patches.patches[0]
|
|
||||||
assert_equal :p0, p.patch_p
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_p1_hash_to_string
|
|
||||||
patches = Patches.new({
|
|
||||||
:p1 => "http://example.com/patch.diff"
|
|
||||||
})
|
|
||||||
assert_equal 1, patches.patches.length
|
|
||||||
|
|
||||||
p = patches.patches[0]
|
|
||||||
assert_equal :p1, p.patch_p
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mixed_hash_to_strings
|
|
||||||
expected = {
|
|
||||||
:p1 => "http://example.com/patch1.diff",
|
|
||||||
:p0 => "http://example.com/patch0.diff"
|
|
||||||
}
|
|
||||||
patches = Patches.new(expected)
|
|
||||||
assert_equal 2, patches.patches.length
|
|
||||||
|
|
||||||
# Make sure unique filenames were assigned
|
|
||||||
filenames = Set.new
|
|
||||||
patches.each do |p|
|
|
||||||
filenames << p.patch_filename
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal 2, filenames.size
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mixed_hash_to_arrays
|
|
||||||
expected = {
|
|
||||||
:p1 => ["http://example.com/patch10.diff","http://example.com/patch11.diff"],
|
|
||||||
:p0 => ["http://example.com/patch00.diff","http://example.com/patch01.diff"]
|
|
||||||
}
|
|
||||||
patches = Patches.new(expected)
|
|
||||||
assert_equal 4, patches.patches.length
|
|
||||||
|
|
||||||
# Make sure unique filenames were assigned
|
|
||||||
filenames = Set.new
|
|
||||||
patches.each do |p|
|
|
||||||
filenames << p.patch_filename
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal 4, filenames.size
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,64 +1,153 @@
|
|||||||
require 'testing_env'
|
require 'testing_env'
|
||||||
require 'test/testball'
|
require 'formula'
|
||||||
|
require 'testball'
|
||||||
|
|
||||||
class PatchingTests < Test::Unit::TestCase
|
class PatchingTests < Test::Unit::TestCase
|
||||||
def read_file path
|
def formula(&block)
|
||||||
File.open(path, 'r') { |f| f.read }
|
super do
|
||||||
|
url "file:///#{TEST_FOLDER}/tarballs/testball-0.1.tbz"
|
||||||
|
sha1 "482e737739d946b7c8cbaf127d9ee9c148b999f5"
|
||||||
|
class_eval(&block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_patched(path)
|
||||||
|
s = File.read(path)
|
||||||
|
assert !s.include?("NOOP"), "File was unpatched."
|
||||||
|
assert s.include?("ABCD"), "File was not patched as expected."
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_single_patch
|
def test_single_patch
|
||||||
shutup do
|
shutup do
|
||||||
Class.new(TestBall) do
|
formula do
|
||||||
def patches
|
def patches
|
||||||
"file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
"file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
||||||
end
|
end
|
||||||
end.new("test_single_patch").brew do
|
end.brew { assert_patched 'libexec/NOOP' }
|
||||||
s = read_file 'libexec/NOOP'
|
end
|
||||||
assert !s.include?("NOOP"), "File was unpatched."
|
end
|
||||||
assert s.include?("ABCD"), "File was not patched as expected."
|
|
||||||
|
def test_single_patch_dsl
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
patch do
|
||||||
|
url "file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
||||||
|
sha1 "fa8af2e803892e523fdedc6b758117c45e5749a2"
|
||||||
|
end
|
||||||
|
end.brew { assert_patched 'libexec/NOOP' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_single_patch_dsl_with_strip
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
patch :p1 do
|
||||||
|
url "file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
||||||
|
sha1 "fa8af2e803892e523fdedc6b758117c45e5749a2"
|
||||||
|
end
|
||||||
|
end.brew { assert_patched 'libexec/NOOP' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_single_patch_dsl_with_incorrect_strip
|
||||||
|
assert_raises(ErrorDuringExecution) do
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
patch :p0 do
|
||||||
|
url "file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
||||||
|
sha1 "fa8af2e803892e523fdedc6b758117c45e5749a2"
|
||||||
|
end
|
||||||
|
end.brew { }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_patch_array
|
def test_patch_p0_dsl
|
||||||
shutup do
|
shutup do
|
||||||
Class.new(TestBall) do
|
formula do
|
||||||
def patches
|
patch :p0 do
|
||||||
["file:///#{TEST_FOLDER}/patches/noop-a.diff"]
|
url "file:///#{TEST_FOLDER}/patches/noop-b.diff"
|
||||||
end
|
sha1 "3b54bd576f998ef6d6623705ee023b55062b9504"
|
||||||
end.new("test_patch_array").brew do
|
|
||||||
s = read_file 'libexec/NOOP'
|
|
||||||
assert !s.include?("NOOP"), "File was unpatched."
|
|
||||||
assert s.include?("ABCD"), "File was not patched as expected."
|
|
||||||
end
|
end
|
||||||
|
end.brew { assert_patched 'libexec/NOOP' }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_patch_p0
|
def test_patch_p0
|
||||||
shutup do
|
shutup do
|
||||||
Class.new(TestBall) do
|
formula do
|
||||||
def patches
|
def patches
|
||||||
"file:///#{TEST_FOLDER}/patches/noop-a.diff"
|
{ :p0 => "file:///#{TEST_FOLDER}/patches/noop-b.diff" }
|
||||||
end
|
|
||||||
end.new("test_patch_p0").brew do
|
|
||||||
s = read_file 'libexec/NOOP'
|
|
||||||
assert !s.include?("NOOP"), "File was unpatched."
|
|
||||||
assert s.include?("ABCD"), "File was not patched as expected."
|
|
||||||
end
|
end
|
||||||
|
end.brew { assert_patched 'libexec/NOOP' }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_patch_p1
|
def test_patch_array
|
||||||
shutup do
|
shutup do
|
||||||
Class.new(TestBall) do
|
formula do
|
||||||
|
def patches
|
||||||
|
["file:///#{TEST_FOLDER}/patches/noop-a.diff"]
|
||||||
|
end
|
||||||
|
end.brew { assert_patched 'libexec/noop' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_patch_hash
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
def patches
|
||||||
|
{ :p1 => "file:///#{TEST_FOLDER}/patches/noop-a.diff" }
|
||||||
|
end
|
||||||
|
end.brew { assert_patched 'libexec/noop' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_patch_hash_array
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
def patches
|
def patches
|
||||||
{ :p1 => ["file:///#{TEST_FOLDER}/patches/noop-a.diff"] }
|
{ :p1 => ["file:///#{TEST_FOLDER}/patches/noop-a.diff"] }
|
||||||
end
|
end
|
||||||
end.new("test_patch_p1").brew do
|
end.brew { assert_patched 'libexec/noop' }
|
||||||
s = read_file 'libexec/NOOP'
|
|
||||||
assert !s.include?("NOOP"), "File was unpatched."
|
|
||||||
assert s.include?("ABCD"), "File was not patched as expected."
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_patch_string
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
patch %q{
|
||||||
|
diff --git a/libexec/NOOP b/libexec/NOOP
|
||||||
|
index bfdda4c..e08d8f4 100755
|
||||||
|
--- a/libexec/NOOP
|
||||||
|
+++ b/libexec/NOOP
|
||||||
|
@@ -1,2 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
-echo NOOP
|
||||||
|
\ No newline at end of file
|
||||||
|
+echo ABCD
|
||||||
|
\ No newline at end of file
|
||||||
|
}
|
||||||
|
end.brew { assert_patched 'libexec/noop' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_patch_string_with_strip
|
||||||
|
shutup do
|
||||||
|
formula do
|
||||||
|
patch :p0, %q{
|
||||||
|
diff --git libexec/NOOP libexec/NOOP
|
||||||
|
index bfdda4c..e08d8f4 100755
|
||||||
|
--- libexec/NOOP
|
||||||
|
+++ libexec/NOOP
|
||||||
|
@@ -1,2 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
-echo NOOP
|
||||||
|
\ No newline at end of file
|
||||||
|
+echo ABCD
|
||||||
|
\ No newline at end of file
|
||||||
|
}
|
||||||
|
end.brew { assert_patched 'libexec/noop' }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user