diff options
| author | ilovezfs | 2016-01-25 08:21:57 -0800 |
|---|---|---|
| committer | Mike McQuaid | 2016-02-01 18:37:36 +0000 |
| commit | cc3d041c263ef88d2d301d06eb17031cfabfc971 (patch) | |
| tree | 7552b6adabf32d8f43947efc0c1c84d846a4dd0c /Library/Homebrew/patch.rb | |
| parent | 604323e641ccd0b125716f4a337b1f9384236716 (diff) | |
| download | brew-cc3d041c263ef88d2d301d06eb17031cfabfc971.tar.bz2 | |
DSL method "apply" to specify patch files
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.
Diffstat (limited to 'Library/Homebrew/patch.rb')
| -rw-r--r-- | Library/Homebrew/patch.rb | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/Library/Homebrew/patch.rb b/Library/Homebrew/patch.rb index 3c5bd42ea..ebfb8e347 100644 --- a/Library/Homebrew/patch.rb +++ b/Library/Homebrew/patch.rb @@ -112,7 +112,7 @@ class ExternalPatch def initialize(strip, &block) @strip = strip - @resource = Resource.new("patch", &block) + @resource = Resource::Patch.new(&block) end def external? @@ -127,9 +127,25 @@ class ExternalPatch def apply dir = Pathname.pwd resource.unpack do - # Assumption: the only file in the staging directory is the patch - patchfile = Pathname.pwd.children.first - dir.cd { safe_system "/usr/bin/patch", "-g", "0", "-f", "-#{strip}", "-i", patchfile } + patch_dir = Pathname.pwd + if patch_files.empty? + children = patch_dir.children + if (children.count == 1 && children.first.file?) + patch_files << children.first.basename + else + raise MissingApplyError, <<-EOS.undent + There should be exactly one patch file in the staging directory unless + the "apply" method was used one or more times in the patch-do block. + EOS + end + end + dir.cd do + patch_files.each do |patch_file| + ohai "Applying #{patch_file}" + patch_file = patch_dir/patch_file + safe_system "/usr/bin/patch", "-g", "0", "-f", "-#{strip}", "-i", patch_file + end + end end end @@ -141,6 +157,10 @@ class ExternalPatch resource.fetch end + def patch_files + resource.patch_files + end + def verify_download_integrity(fn) resource.verify_download_integrity(fn) end |
