lexivo/bin/check
2026-03-30 13:18:39 +02:00

85 lines
1.8 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
require 'optparse'
options = {
parallel: [],
then: []
}
OptionParser.new do |opts|
opts.on("--parallel=LIST", Array) { |list| options[:parallel] = list }
opts.on("--then=LIST", Array) { |list| options[:then] = list }
end.parse!
if options[:parallel].empty? && options[:then].empty?
puts "Usage: #{$PROGRAM_NAME} [--parallel=task1,task2] [--then=task3,task4]"
exit 1
end
ENV["SILENT_TESTS"] = "1"
def resolve_cmd(name)
paths = [
"./bin/linters/#{name}",
"./bin/linters/helpers/#{name}"
]
# Find an executable path, or default to executing the name directly
paths.find { |p| File.executable?(p) } || name
end
def run_task(name)
cmd = resolve_cmd(name)
start_time = Time.now
output = `DISABLE_SPRING=1 #{cmd} 2>&1`
ext_code = $?.exitstatus
elapsed = (Time.now - start_time).round
success = (ext_code == 0)
# Check if the script wraps its own output
if output.include?("✅ SUCCESS") || output.include?("❌ FAILED")
puts output
else
if success
puts "✅ SUCCESS: #{cmd} (#{elapsed}s)"
else
puts "========================================"
puts "❌ FAILED: #{cmd} (#{elapsed}s)"
puts output
puts ""
end
end
success
end
threads = []
results = {}
mutex = Mutex.new
options[:parallel].each do |task_name|
threads << Thread.new do
success = run_task(task_name)
mutex.synchronize { results[task_name] = success }
end
end
unless options[:then].empty?
threads << Thread.new do
options[:then].each do |task_name|
success = run_task(task_name)
mutex.synchronize { results[task_name] = success }
break unless success # Stop the sequential chain on failure!
end
end
end
threads.each(&:join)
if results.values.any? { |r| !r }
exit 1
else
exit 0
end