lib/support/rake/task_with_logger.rb (48 lines of code) (raw):
# frozen_string_literal: true
module Support
module Rake
module TaskWithLogger
MakeError = Class.new(StandardError) do
def initialize(target)
super("`make #{target}` failed.")
end
end
LoggerError = Class.new(StandardError) do
def initialize(task, error, logger)
@task = task
@error = error
@logger = logger
super("Task `#{@task.name}` failed")
end
def print!
tail = @logger.tail.strip.split("\n").map { |l| " #{l}" }.join("\n")
GDK::Output.error("Task \e[32m#{@task.name}\e[0m failed:\n\n#{tail}", report_error: false)
GDK::Output.puts
end
end
def execute(...)
# The TaskLogger has no proxy mode, so it would swallow all logs
# for tasks that don't run in the context of a spinner.
return super unless TaskWithSpinner.spinner_manager
begin
logger = TaskLogger.from_task(self)
TaskLogger.set_current!(logger)
super
logger.cleanup!
rescue StandardError => e
if logger
unless e.is_a?(MakeError)
warn e.message
warn e.backtrace
end
error = LoggerError.new(self, e, logger)
attachment = { filename: "log/#{name}.txt", bytes: GDK::ConfigRedactor.new.redact_logfile(logger.tail) }
GDK::Telemetry.capture_exception(error, attachment: attachment)
raise error
end
raise
ensure
logger&.cleanup!(delete: false)
TaskLogger.set_current!(nil)
end
end
end
end
end