aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Nagel2014-09-28 01:08:31 -0500
committerJack Nagel2014-09-28 01:11:31 -0500
commit395d133bde8bf1820fe7cdbcddd5f9ccbbff7ec2 (patch)
treef4eb455092d8e2829b5c34501e7ed406be4c3447
parent1c991be5be770a4bfd1b27cbd511cf76017e87a9 (diff)
downloadhomebrew-395d133bde8bf1820fe7cdbcddd5f9ccbbff7ec2.tar.bz2
Make inreplace errors fatal
Closes #32649. Closes #32703.
-rw-r--r--Library/Homebrew/extend/string.rb17
-rw-r--r--Library/Homebrew/test/test_inreplace.rb28
-rw-r--r--Library/Homebrew/utils/inreplace.rb26
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