
The "apply" DSL method can be called from patch-do blocks to specify the paths within an archive of the desired patch files, which will be applied in the order in which they were supplied to the "apply" calls. If "apply" isn't used, raise an error whenever the extracted directory doesn't contain exactly one file. The "apply" method can be called zero or more times within a patch-do block with the following syntaxes supported: apply "single_apply" apply "multiple_apply_1", "multiple_apply_2" apply [array_of_apply] If apply must be used, a single call using the second syntax above is usually best practice. Each apply leaf should be the relative path to a specific patch file in the extracted directory. For example, if extracting this-v123-patches.tar.gz gives you this-123 this-123/.DS_Store this-123/LICENSE.txt this-123/patches this-123/patches/A.diff this-123/patches/B.diff this-123/patches/C.diff this-123/README.txt and you want to apply only B.diff and C.diff, then you need to use "patches/B.diff" and "patches/C.diff" for the lowest-level apply leaves. The code was provided by Xu Cheng. Any mistakes are mine.
156 lines
4.2 KiB
Ruby
156 lines
4.2 KiB
Ruby
require "testing_env"
|
|
require "patch"
|
|
|
|
class PatchTests < Homebrew::TestCase
|
|
def test_create_simple
|
|
patch = Patch.create(:p2, nil)
|
|
assert_kind_of ExternalPatch, patch
|
|
assert_predicate patch, :external?
|
|
assert_equal :p2, patch.strip
|
|
end
|
|
|
|
def test_create_string
|
|
patch = Patch.create(:p0, "foo")
|
|
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 StringPatch, patch
|
|
assert_equal :p1, patch.strip
|
|
end
|
|
|
|
def test_create_DATA
|
|
patch = Patch.create(:p0, :DATA)
|
|
assert_kind_of DATAPatch, patch
|
|
assert_equal :p0, patch.strip
|
|
end
|
|
|
|
def test_create_DATA_without_strip
|
|
patch = Patch.create(:DATA, nil)
|
|
assert_kind_of DATAPatch, patch
|
|
assert_equal :p1, patch.strip
|
|
end
|
|
|
|
def test_raises_for_unknown_values
|
|
assert_raises(ArgumentError) { Patch.create(Object.new) }
|
|
assert_raises(ArgumentError) { Patch.create(Object.new, Object.new) }
|
|
end
|
|
end
|
|
|
|
class LegacyPatchTests < Homebrew::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.count { |p| p.strip == :p0 }
|
|
assert_equal 1, patches.count { |p| p.strip == :p1 }
|
|
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.count { |p| p.strip == :p0 }
|
|
assert_equal 2, patches.count { |p| p.strip == :p1 }
|
|
end
|
|
|
|
def test_nil
|
|
assert_empty Patch.normalize_legacy_patches(nil)
|
|
end
|
|
end
|
|
|
|
class EmbeddedPatchTests < Homebrew::TestCase
|
|
def test_inspect
|
|
p = EmbeddedPatch.new :p1
|
|
assert_equal "#<EmbeddedPatch: :p1>", p.inspect
|
|
end
|
|
end
|
|
|
|
class ExternalPatchTests < Homebrew::TestCase
|
|
def setup
|
|
@p = ExternalPatch.new(:p1) { url "file:///my.patch" }
|
|
|
|
end
|
|
|
|
def test_url
|
|
assert_equal "file:///my.patch", @p.url
|
|
end
|
|
|
|
def test_inspect
|
|
assert_equal %(#<ExternalPatch: :p1 "file:///my.patch">), @p.inspect
|
|
end
|
|
|
|
def test_cached_download
|
|
@p.resource.stubs(:cached_download).returns "/tmp/foo.tar.gz"
|
|
assert_equal "/tmp/foo.tar.gz", @p.cached_download
|
|
end
|
|
end
|
|
|
|
class ApplyPatchTests < Homebrew::TestCase
|
|
def test_empty_patch_files
|
|
patch = Patch.create(:p2, nil)
|
|
resource = patch.resource
|
|
patch_files = patch.patch_files
|
|
assert_kind_of Resource::Patch, resource
|
|
assert_equal patch_files, resource.patch_files
|
|
assert_equal patch_files, []
|
|
end
|
|
|
|
def test_resource_patch_apply_method
|
|
patch = Patch.create(:p2, nil)
|
|
resource = patch.resource
|
|
patch_files = patch.patch_files
|
|
resource.apply("patch1.diff")
|
|
assert_equal patch_files, ["patch1.diff"]
|
|
resource.apply("patch2.diff", "patch3.diff")
|
|
assert_equal patch_files, ["patch1.diff", "patch2.diff", "patch3.diff"]
|
|
resource.apply(["patch4.diff", "patch5.diff"])
|
|
assert_equal patch_files.count, 5
|
|
resource.apply("patch4.diff", ["patch5.diff", "patch6.diff"], "patch7.diff")
|
|
assert_equal patch_files.count, 7
|
|
end
|
|
end
|