diff options
| author | Jack Nagel | 2014-09-28 01:08:31 -0500 |
|---|---|---|
| committer | Jack Nagel | 2014-09-28 01:11:31 -0500 |
| commit | 395d133bde8bf1820fe7cdbcddd5f9ccbbff7ec2 (patch) | |
| tree | f4eb455092d8e2829b5c34501e7ed406be4c3447 | |
| parent | 1c991be5be770a4bfd1b27cbd511cf76017e87a9 (diff) | |
| download | homebrew-395d133bde8bf1820fe7cdbcddd5f9ccbbff7ec2.tar.bz2 | |
Make inreplace errors fatal
Closes #32649.
Closes #32703.
| -rw-r--r-- | Library/Homebrew/extend/string.rb | 17 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_inreplace.rb | 28 | ||||
| -rw-r--r-- | Library/Homebrew/utils/inreplace.rb | 26 |
3 files changed, 54 insertions, 17 deletions
diff --git a/Library/Homebrew/extend/string.rb b/Library/Homebrew/extend/string.rb index d85e029f3..c921a2a7d 100644 --- a/Library/Homebrew/extend/string.rb +++ b/Library/Homebrew/extend/string.rb @@ -56,10 +56,16 @@ end # used by the inreplace function (in utils.rb) module StringInreplaceExtension + attr_accessor :errors + + def self.extended(str) + str.errors = [] + end + def sub! before, after result = super unless result - opoo "inreplace: replacement of '#{before}' with '#{after}' failed" + errors << "expected replacement of #{before.inspect} with #{after.inspect}" end result end @@ -68,7 +74,7 @@ module StringInreplaceExtension def gsub! before, after, audit_result=true result = super(before, after) if audit_result && result.nil? - opoo "inreplace: replacement of '#{before}' with '#{after}' failed" + errors << "expected replacement of #{before.inspect} with #{after.inspect}" end result end @@ -76,9 +82,8 @@ module StringInreplaceExtension # Looks for Makefile style variable defintions and replaces the # value with "new_value", or removes the definition entirely. def change_make_var! flag, new_value - new_value = "#{flag}=#{new_value}" - unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=[ \t]*(.*)$/, new_value, false) - opoo "inreplace: changing '#{flag}' to '#{new_value}' failed" + unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=[ \t]*(.*)$/, "#{flag}=#{new_value}", false) + errors << "expected to change #{flag.inspect} to #{new_value.inspect}" end end @@ -87,7 +92,7 @@ module StringInreplaceExtension Array(flags).each do |flag| # Also remove trailing \n, if present. unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=.*$\n?/, "", false) - opoo "inreplace: removing '#{flag}' failed" + errors << "expected to remove #{flag.inspect}" end end end diff --git a/Library/Homebrew/test/test_inreplace.rb b/Library/Homebrew/test/test_inreplace.rb index 5b226eb8d..e7917f67f 100644 --- a/Library/Homebrew/test/test_inreplace.rb +++ b/Library/Homebrew/test/test_inreplace.rb @@ -1,5 +1,6 @@ -require 'testing_env' -require 'extend/string' +require "testing_env" +require "extend/string" +require "utils/inreplace" class InreplaceTest < Homebrew::TestCase def test_change_make_var @@ -87,4 +88,27 @@ class InreplaceTest < Homebrew::TestCase s.gsub!("o", "e") assert_equal "bee", s end + + def test_inreplace_errors + extend(Utils::Inreplace) + + open("test", "w") { |f| f.write "a\nb\nc\n" } + + assert_raises(Utils::InreplaceError) { + inreplace "test", "d", "f" + } + + assert_raises(Utils::InreplaceError) { + inreplace("test") { |s| s.gsub! "d", "f" } + } + + assert_raises(Utils::InreplaceError) { + inreplace("test") { |s| + s.change_make_var! "VAR", "value" + s.remove_make_var! "VAR2" + } + } + ensure + File.unlink("test") + end end diff --git a/Library/Homebrew/utils/inreplace.rb b/Library/Homebrew/utils/inreplace.rb index 52a43ece9..02372d214 100644 --- a/Library/Homebrew/utils/inreplace.rb +++ b/Library/Homebrew/utils/inreplace.rb @@ -1,24 +1,32 @@ module Utils + class InreplaceError < RuntimeError + def initialize(errors) + super errors.inject("inreplace failed\n") { |s, (path, errs)| + s << "#{path}:\n" << errs.map { |e| " #{e}\n" }.join + } + end + end + module Inreplace def inreplace paths, before=nil, after=nil + errors = {} + Array(paths).each do |path| - s = File.open(path, "rb", &:read) + s = File.open(path, "rb", &:read).extend(StringInreplaceExtension) if before.nil? && after.nil? - yield s.extend(StringInreplaceExtension) + yield s else after = after.to_s if Symbol === after - unless s.gsub!(before, after) - message = <<-EOS.undent - inreplace in '#{path}' failed - Expected replacement of '#{before}' with '#{after}' - EOS - ARGV.homebrew_developer? ? odie(message) : opoo(message) - end + s.gsub!(before, after) end + errors[path] = s.errors if s.errors.any? + Pathname(path).atomic_write(s) end + + raise InreplaceError.new(errors) if errors.any? end module_function :inreplace end |
