Make inreplace errors fatal
Closes Homebrew/homebrew#32649. Closes Homebrew/homebrew#32703.
This commit is contained in:
parent
1c71fb4287
commit
aaaab946ec
@ -56,10 +56,16 @@ end
|
|||||||
|
|
||||||
# used by the inreplace function (in utils.rb)
|
# used by the inreplace function (in utils.rb)
|
||||||
module StringInreplaceExtension
|
module StringInreplaceExtension
|
||||||
|
attr_accessor :errors
|
||||||
|
|
||||||
|
def self.extended(str)
|
||||||
|
str.errors = []
|
||||||
|
end
|
||||||
|
|
||||||
def sub! before, after
|
def sub! before, after
|
||||||
result = super
|
result = super
|
||||||
unless result
|
unless result
|
||||||
opoo "inreplace: replacement of '#{before}' with '#{after}' failed"
|
errors << "expected replacement of #{before.inspect} with #{after.inspect}"
|
||||||
end
|
end
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
@ -68,7 +74,7 @@ module StringInreplaceExtension
|
|||||||
def gsub! before, after, audit_result=true
|
def gsub! before, after, audit_result=true
|
||||||
result = super(before, after)
|
result = super(before, after)
|
||||||
if audit_result && result.nil?
|
if audit_result && result.nil?
|
||||||
opoo "inreplace: replacement of '#{before}' with '#{after}' failed"
|
errors << "expected replacement of #{before.inspect} with #{after.inspect}"
|
||||||
end
|
end
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
@ -76,9 +82,8 @@ module StringInreplaceExtension
|
|||||||
# Looks for Makefile style variable defintions and replaces the
|
# Looks for Makefile style variable defintions and replaces the
|
||||||
# value with "new_value", or removes the definition entirely.
|
# value with "new_value", or removes the definition entirely.
|
||||||
def change_make_var! flag, new_value
|
def change_make_var! flag, new_value
|
||||||
new_value = "#{flag}=#{new_value}"
|
unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=[ \t]*(.*)$/, "#{flag}=#{new_value}", false)
|
||||||
unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=[ \t]*(.*)$/, new_value, false)
|
errors << "expected to change #{flag.inspect} to #{new_value.inspect}"
|
||||||
opoo "inreplace: changing '#{flag}' to '#{new_value}' failed"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -87,7 +92,7 @@ module StringInreplaceExtension
|
|||||||
Array(flags).each do |flag|
|
Array(flags).each do |flag|
|
||||||
# Also remove trailing \n, if present.
|
# Also remove trailing \n, if present.
|
||||||
unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=.*$\n?/, "", false)
|
unless gsub!(/^#{Regexp.escape(flag)}[ \t]*=.*$\n?/, "", false)
|
||||||
opoo "inreplace: removing '#{flag}' failed"
|
errors << "expected to remove #{flag.inspect}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
require 'testing_env'
|
require "testing_env"
|
||||||
require 'extend/string'
|
require "extend/string"
|
||||||
|
require "utils/inreplace"
|
||||||
|
|
||||||
class InreplaceTest < Homebrew::TestCase
|
class InreplaceTest < Homebrew::TestCase
|
||||||
def test_change_make_var
|
def test_change_make_var
|
||||||
@ -87,4 +88,27 @@ class InreplaceTest < Homebrew::TestCase
|
|||||||
s.gsub!("o", "e")
|
s.gsub!("o", "e")
|
||||||
assert_equal "bee", s
|
assert_equal "bee", s
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@ -1,24 +1,32 @@
|
|||||||
module Utils
|
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
|
module Inreplace
|
||||||
def inreplace paths, before=nil, after=nil
|
def inreplace paths, before=nil, after=nil
|
||||||
|
errors = {}
|
||||||
|
|
||||||
Array(paths).each do |path|
|
Array(paths).each do |path|
|
||||||
s = File.open(path, "rb", &:read)
|
s = File.open(path, "rb", &:read).extend(StringInreplaceExtension)
|
||||||
|
|
||||||
if before.nil? && after.nil?
|
if before.nil? && after.nil?
|
||||||
yield s.extend(StringInreplaceExtension)
|
yield s
|
||||||
else
|
else
|
||||||
after = after.to_s if Symbol === after
|
after = after.to_s if Symbol === after
|
||||||
unless s.gsub!(before, after)
|
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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
errors[path] = s.errors if s.errors.any?
|
||||||
|
|
||||||
Pathname(path).atomic_write(s)
|
Pathname(path).atomic_write(s)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
raise InreplaceError.new(errors) if errors.any?
|
||||||
end
|
end
|
||||||
module_function :inreplace
|
module_function :inreplace
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user