canvas-lms/script/rlint

93 lines
3.0 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
exit 0 if ENV["DISABLE_RUBOCOP"] == "1"
ENV["BUNDLE_GEMFILE"] = File.expand_path("../Gemfile.d/rubocop.rb", __dir__)
require "rubygems"
require "bundler/setup"
Bundler.setup
require_relative "linter"
require "optparse"
linter_options = {
linter_name: "Rubocop",
file_regex: %r{(?:\.rb|\.rake|\.gemspec|Gemfile|/[^./]+)$},
format: "rubocop",
command: +"bin/rubocop --force-exclusion",
auto_correct: false,
campsite_mode: false,
append_files_to_command: true,
boyscout_mode: false,
severe_levels: %w[error fatal].freeze
}
no_fail = false
SEVERITIES = %w[info warn error fatal].freeze
rlint = nil
OptionParser.new do |opts|
# boy scout means treat everything as an error
opts.on("--boy-scout", "Treat all comments as errors") { linter_options[:boyscout_mode] = true }
# heavy means inspect entire files if a file was changed
opts.on("--heavy") { linter_options[:heavy_mode] = true }
opts.on("--plugin PLUGIN", "Inspect changes from the given plugin, instead of canvas-lms") do |v|
linter_options[:plugin] = v
end
opts.on("--no-fail-on-offense",
<<~TEXT.tr("\n", " ")) do |_v|
Don't fail (exit code) if you find an offense.
Use if you're processing the output elsewise, like in Jenkins+Gergich.
TEXT
no_fail = true
end
opts.on("--all", "Run RuboCop against all files, not just changed files") do
linter_options[:heavy_mode] = true
linter_options[:append_files_to_command] = false
end
opts.on("--summary", "Print a summary of offense counts by cop, instead of individual offenses") do
linter_options[:comment_post_processing] = proc do |comments|
grouped_comments = comments.group_by { |comment| comment[:rule] }
pp grouped_comments.transform_values(&:length).to_a.sort_by(&:last).reverse.to_h
exit 0
end
end
opts.on("-a", "--auto-correct") do |_v|
linter_options[:auto_correct] = true
linter_options[:command] << " -a"
end
opts.on("-A", "--auto-correct-all") do |_v|
linter_options[:auto_correct] = true
linter_options[:command] << " -A"
end
opts.on("-x", "--fix-layout") do
linter_options[:auto_correct] = true
linter_options[:command] << " -x"
end
opts.on("-h", "--help", "Display this usage information") do
puts opts
exit 1
end
opts.on("-s", "--severe SEVERITY", "Configure which level is considered severe") do |v|
severity = SEVERITIES.find { |s| s[0...v.length].casecmp(v).zero? }
raise "Unknown severity #{v}" unless severity
linter_options[:severe_levels] = SEVERITIES[SEVERITIES.index(severity)..]
end
opts.on("--only-severe", "Filter non-severe comments out of results") do
linter_options[:comment_post_processing] = lambda do |comments|
min_severity = SEVERITIES.index(rlint.severe_levels.first)
comments.select do |c|
c[:corrected] || SEVERITIES.index(c[:severity]) >= min_severity
end
end
end
end.parse!
rlint = Linter.new(linter_options)
exit 1 if !rlint.run && !no_fail