diff --git a/Library/Homebrew/cask/cmd/audit.rb b/Library/Homebrew/cask/cmd/audit.rb index 8c4626b773..5cc94fec74 100644 --- a/Library/Homebrew/cask/cmd/audit.rb +++ b/Library/Homebrew/cask/cmd/audit.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "utils/github/actions" + module Cask class Cmd # Implementation of the `brew cask audit` command. @@ -57,7 +59,19 @@ module Cask odebug "Auditing Cask #{cask}" result = Auditor.audit(cask, **options) - result[:warnings].empty? && result[:errors].empty? + next true if result[:warnings].empty? && result[:errors].empty? + + if ENV["GITHUB_ACTIONS"] + cask_path = cask.sourcefile_path + annotations = (result[:warnings].map { |w| [:warning, w] } + result[:errors].map { |e| [:error, e] }) + .map { |type, message| GitHub::Actions::Annotation.new(type, message, file: cask_path) } + + annotations.each do |annotation| + puts annotation if annotation.relevant? + end + end + + false end return if failed_casks.empty? diff --git a/Library/Homebrew/style.rb b/Library/Homebrew/style.rb index 9d31a8f724..506fcf127f 100644 --- a/Library/Homebrew/style.rb +++ b/Library/Homebrew/style.rb @@ -15,8 +15,15 @@ module Homebrew success = check_style_impl(files, :print, **options) if ENV["GITHUB_ACTIONS"] && !success - offenses = check_style_json(files, **options) - puts offenses.to_github_annotations + check_style_json(files, **options).each do |path, offenses| + offenses.each do |o| + line = o.location.line + column = o.location.line + + annotation = GitHub::Actions::Annotation.new(:error, o.message, file: path, line: line, column: column) + puts annotation if annotation.relevant? + end + end end success @@ -236,26 +243,6 @@ module Homebrew def each(*args, &block) @offenses.each(*args, &block) end - - def to_github_annotations - workspace = ENV["GITHUB_WORKSPACE"] - return [] if workspace.blank? - - workspace = Pathname(workspace).realpath - - @offenses.flat_map do |path, offenses| - relative_path = path.relative_path_from(workspace) - - # Only generate annotations for paths relative to the `GITHUB_WORKSPACE` directory. - next [] if relative_path.descend.next.to_s == ".." - - offenses.map do |o| - line = o.location.line - column = o.location.line - GitHub::Actions::Annotation.new(:error, o.message, file: relative_path, line: line, column: column) - end - end - end end # A style offense. diff --git a/Library/Homebrew/utils/github/actions.rb b/Library/Homebrew/utils/github/actions.rb index 646945b428..31833e0d11 100644 --- a/Library/Homebrew/utils/github/actions.rb +++ b/Library/Homebrew/utils/github/actions.rb @@ -14,12 +14,20 @@ module GitHub # Helper class for formatting annotations on GitHub Actions. class Annotation + def self.path_relative_to_workspace(path) + workspace = Pathname(ENV.fetch("GITHUB_WORKSPACE", Dir.pwd)).realpath + path = Pathname(path) + return path unless path.exist? + + path.realpath.relative_path_from(workspace) + end + def initialize(type, message, file: nil, line: nil, column: nil) raise ArgumentError, "Unsupported type: #{type.inspect}" unless [:warning, :error].include?(type) @type = type @message = String(message) - @file = Pathname(file) if file + @file = self.class.path_relative_to_workspace(file) if file @line = Integer(line) if line @column = Integer(column) if column end @@ -33,6 +41,14 @@ module GitHub "::#{@type}#{metadata}::#{Actions.escape(@message)}" end + + # An annotation is only relevant if the corresponding `file` is relative to + # the `GITHUB_WORKSPACE` directory or if no `file` is specified. + def relevant? + return true if @file.nil? + + @file.descend.next.to_s != ".." + end end end end