diff options
| author | Jack Nagel | 2014-09-28 01:08:31 -0500 | 
|---|---|---|
| committer | Jack Nagel | 2014-09-28 01:11:31 -0500 | 
| commit | aaaab946eca5b53e7ea9508348634ec280e00b62 (patch) | |
| tree | 562e4a5b37e857363edd702c9201767c7adfe193 /Library/Homebrew | |
| parent | 1c71fb42870556c13ab2c5bf04a4bdb47d35ed67 (diff) | |
| download | brew-aaaab946eca5b53e7ea9508348634ec280e00b62.tar.bz2 | |
Make inreplace errors fatal
Closes Homebrew/homebrew#32649.
Closes Homebrew/homebrew#32703.
Diffstat (limited to 'Library/Homebrew')
| -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  | 
