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