lib/autobuild/reporting.rb in autobuild-1.6.5 vs lib/autobuild/reporting.rb in autobuild-1.7.0.rc1

- old
+ new

@@ -35,19 +35,28 @@ def self.message(*args) return if silent? display_lock.synchronize do - if @last_progress_msg - puts - @last_progress_msg = nil + display_message(*args) + end + end + + def self.display_message(*args) + msg = + if args.empty? then "" + else "#{color(*args)}" end - if args.empty? - puts - else - puts "#{color(*args)}" + + size = + if @last_progress_msg then @last_progress_msg.size + else 0 end + + puts "\r#{msg}#{" " * [size - msg.size, 0].max}" + if @last_progress_msg + print "#{@last_progress_msg}" end end class << self attr_reader :progress_messages @@ -82,12 +91,14 @@ begin yield if options[:done_message] progress(key, *options[:done_message]) end - ensure - progress_done(key) + progress_done(key, true) + rescue Exception => e + progress_done(key, false) + raise end end end def self.progress(key, *args) found = false @@ -104,38 +115,104 @@ progress_messages << [key, color(*args)] end display_progress end end - def self.progress_done(key) + def self.progress_done(key, display_last = true) found = false display_lock.synchronize do + last_msg = nil progress_messages.delete_if do |msg_key, msg| if msg_key == key found = true + last_msg = msg end end if found && @last_progress_msg - puts + display_message(" #{last_msg}") if display_last && last_msg display_progress end end found end - def self.display_progress - msg = "#{progress_messages.map(&:last).join(" | ")}" - if @last_progress_msg - if !silent? - print "\r" + " " * @last_progress_msg.length + def self.find_common_prefix(msg, other_msg) + msg = msg.split(" ") + other_msg = other_msg.split(" ") + msg.each_with_index do |token, idx| + if other_msg[idx] != token + prefix = msg[0..(idx - 1)].join(" ") + if !prefix.empty? + prefix << " " + end + return prefix end end + return msg + end + def self.format_progress_message(messages) + messages = messages.sort + + groups = Array.new + groups << ["", (0...messages.size)] + messages.each_with_index do |msg, idx| + prefix, grouping = nil, false + messages[(idx + 1)..-1].each_with_index do |other_msg, other_idx| + other_idx += idx + 1 + prefix ||= find_common_prefix(msg, other_msg) + break if !other_msg.start_with?(prefix) + + if grouping + break if prefix != groups.last[0] + groups.last[1] << other_idx + else + current_prefix, current_group = groups.last + if prefix.size > current_prefix.size # create a new group from there + groups.last[1] = (current_group.first..[idx-1,current_group.last].min) + groups << [prefix, [idx, other_idx]] + grouping = true + else break + end + end + end + end + if groups.last.last.last < messages.size + groups << ["", (groups.last.last.last + 1)...(messages.size)] + end + + result = [] + groups.each do |prefix, indexes| + if prefix.empty? + indexes.each do |index| + result << messages[index] + end + else + grouped_messages = [] + indexes.each do |index| + grouped_messages << messages[index][(prefix.size)..-1] + end + if !grouped_messages.empty? + result << "#{prefix}#{grouped_messages.join(", ")}" + end + end + end + result.join(" | ") + end + + def self.display_progress + msg = format_progress_message(progress_messages.map(&:last)) + last_msg_length = + if @last_progress_msg then @last_progress_msg.length + else 0 + end + if msg.empty? - print "\r" if !silent? + print "\r" + " " * last_msg_length if !silent? @last_progress_msg = nil else - print "\r #{msg}" if !silent? + msg = " #{msg}" + print "\r#{msg}#{" " * [last_msg_length - msg.length, 0].max}" if !silent? @last_progress_msg = msg end end # The exception type that is used to report multiple errors that occured