93 lines
3.0 KiB
Ruby
Executable File
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
|