lib/release_tools/trace_section.rb (30 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module TraceSection
def self.collapse(summary, icon: nil)
title =
if icon
"#{icon} #{summary}"
else
summary
end
section = section_name(summary)
puts "section_start:#{Time.now.to_i}:#{section}[collapsed=true]\r\e[0K#{title}"
ret = yield
close(section)
ret
rescue StandardError => ex
close(section)
# If we don't handle the error, it's displayed within the collapsed
# section, which can be confusing. Handling the error allows us to close
# the section first, and display it outside of the section.
puts "❌ The section #{summary.inspect} produced an error:".colorize(:red)
raise ex
end
def self.close(section)
# Flush any output so we capture it in the section, instead of it being
# buffered and displayed outside of the section.
#
# We flush here so that for both the happy and error path we flush the
# output first.
$stdout.flush
$stderr.flush
SemanticLogger.flush
puts "section_end:#{Time.now.to_i}:#{section}\r\e[0K"
end
def self.section_name(summary)
summary.downcase.tr(':', '-').gsub(/\s+/, '_')
end
end
end