diff --git a/tool/generic_erb.rb b/tool/generic_erb.rb index 3227e7a5ac..6af995fc13 100644 --- a/tool/generic_erb.rb +++ b/tool/generic_erb.rb @@ -6,22 +6,30 @@ require 'erb' require 'optparse' require_relative 'lib/vpath' -require_relative 'lib/atomic_write' +require_relative 'lib/colorize' vpath = VPath.new -aw = AtomicWrite.new -aw.vpath = vpath +timestamp = nil +output = nil +ifchange = nil source = false +color = nil templates = [] ARGV.options do |o| + o.on('-t', '--timestamp[=PATH]') {|v| timestamp = v || true} o.on('-i', '--input=PATH') {|v| template << v} + o.on('-o', '--output=PATH') {|v| output = v} + o.on('-c', '--[no-]if-change') {|v| ifchange = v} o.on('-x', '--source') {source = true} - aw.def_options(o) + o.on('--color') {color = true} vpath.def_options(o) o.order!(ARGV) templates << (ARGV.shift or abort o.to_s) if templates.empty? end +color = Colorize.new(color) +unchanged = color.pass("unchanged") +updated = color.fail("updated") result = templates.map do |template| if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ @@ -33,4 +41,21 @@ result = templates.map do |template| source ? erb.src : proc{erb.result(binding)}.call end result = result.size == 1 ? result[0] : result.join("") -aw.emit(result) +if output + if ifchange and (vpath.open(output, "rb") {|f| f.read} rescue nil) == result + puts "#{output} #{unchanged}" + else + open(output, "wb") {|f| f.print result} + puts "#{output} #{updated}" + end + if timestamp + if timestamp == true + dir, base = File.split(output) + timestamp = File.join(dir, ".time." + base) + end + File.open(timestamp, 'a') {} + File.utime(nil, nil, timestamp) + end +else + print result +end diff --git a/tool/lib/atomic_write.rb b/tool/lib/atomic_write.rb deleted file mode 100644 index 12a8e12a8a..0000000000 --- a/tool/lib/atomic_write.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'optparse' -require_relative 'vpath' -require_relative 'colorize' - -class AtomicWrite - attr_accessor :vpath, :timestamp, :output, :compare :color - - def initialize - @vpath = nil - @timestamp = nil - @output = nil - @compare = nil - @color = nil - end - - def def_options(opt) - opt.on('-t', '--timestamp[=PATH]') {|v| @timestamp = v || true} - opt.on('-o', '--output=PATH') {|v| @output = v} - opt.on('-c', '--[no-]if-change') {|v| @compare = v} - opt.on('--color') {@color = true} - @vpath.def_options(opt) if @vpath - opt - end - - def emit(result) - output = @output - if output - update output, result - stamp output - else - print result - end - end - - def update(output, result) - color = Colorize.new(@color) - unchanged = color.pass("unchanged") - updated = color.fail("updated") - vpath = @vpath || File - if @compare and (vpath.open(output, "rb") {|f| f.read} rescue nil) == result - puts "#{output} #{unchanged}" - false - else - open(output, "wb") {|f| f.print result} - puts "#{output} #{updated}" - true - end - end - - def stamp(output, timestamp = @timestamp) - if timestamp - if timestamp == true - dir, base = File.split(output) - timestamp = File.join(dir, ".time." + base) - end - File.open(timestamp, 'a') {} - File.utime(nil, nil, timestamp) - end - end -end