homebrew-cask/developer/bin/audit_modified_casks

154 lines
3.1 KiB
Ruby
Executable File

#!/usr/bin/env ruby
#
# audit_modified_casks
#
###
### dependencies
###
require 'pathname'
require 'open3'
$LOAD_PATH.unshift(Pathname(__FILE__).realpath.join('../../../lib'))
require 'vendor/homebrew-fork/global'
require 'hbc'
###
### constants
###
CASK_DIR = Pathname(__FILE__).realpath.join('../../../Casks')
RELEVANT_STANZAS = %i{version sha256 url}
###
### methods
###
def cd_to_project_root
Dir.chdir Pathname(__FILE__).realpath.dirname
@git_root ||= git(*%w[rev-parse --show-toplevel])
Dir.chdir @git_root
end
def die(msg, status=1)
onoe msg
exit status
end
def main
cd_to_project_root
modified_cask_files.zip(modified_casks).each do |cask_file, cask|
audit(cask, cask_file)
end
report_failures
end
def commit_range
$commit_range
end
def modified_cask_files
return @modified_cask_files if defined? @modified_cask_files
out = git(*%w[diff --name-only --diff-filter=AM], commit_range,
'--', "#{CASK_DIR}/*.rb")
@modified_cask_files = out.split("\n")
end
def modified_casks
return @modified_casks if defined? @modified_casks
@modified_casks = modified_cask_files.map { |f| Hbc.load(f) }
if @modified_casks.any?
num_modified = @modified_casks.size
ohai "#{num_modified} modified #{pluralize('cask', num_modified)}: " \
"#{@modified_casks.join(' ')}"
end
@modified_casks
end
def audit(cask, cask_file)
audit_download = audit_download?(cask, cask_file)
success = Hbc::Auditor.audit(cask, audit_download: audit_download)
failed_casks << cask unless success
end
def failed_casks
@failed_casks ||= []
end
def audit_download?(cask, cask_file)
cask.sha256 != :no_check && relevant_stanza_modified?(cask_file)
end
def relevant_stanza_modified?(cask_file)
out = git('diff', commit_range, '--', cask_file)
out =~ /^\+\s*(#{RELEVANT_STANZAS.join('|')})/
end
def git(*args)
ohai ['git', *args].join(' ') if $debug
out, err, status = Open3.capture3('git', *args)
return out.chomp if status.success?
die err.chomp, status.exitstatus
end
def report_failures
return if failed_casks.empty?
num_failed = failed_casks.size
cask_pluralized = pluralize('cask', num_failed)
die "audit failed for #{num_failed} #{cask_pluralized}: " \
"#{failed_casks.join(' ')}"
end
def pluralize(str, num)
num == 1 ? str : "#{str}s"
end
def cleanup
Hbc::CLI::Cleanup.run if $clean_cache
end
###
### main
###
usage = <<-EOS
Usage: audit_modified_casks [options...] <commit range>
Given a range of Git commits, find any Casks that were modified and run `brew
cask audit' on them. If the `url', `version', or `sha256' stanzas were modified,
run with the `--download' flag to verify the hash.
Options:
-c, --clean-cache
Remove all cached downloads. Use with care.
-d, --debug
Enable debugging output.
-h, --help
Display usage and exit.
EOS
while ARGV.any? do
case ARGV.first
when /^-+h(elp)?$/i
puts usage
exit 0
when /^-+d(ebug)?$/i
$debug = 1
ARGV.shift
when /^-+c(lean-cache)?$/i
$clean_cache = 1
ARGV.shift
else
die usage if $commit_range
$commit_range = ARGV.shift
end
end
die usage unless $commit_range
at_exit { cleanup }
main