75 lines
2.1 KiB
Ruby
75 lines
2.1 KiB
Ruby
require 'cask/checkable'
|
|
require 'cask/download'
|
|
|
|
class Cask::Audit
|
|
attr_reader :cask
|
|
|
|
include Cask::Checkable
|
|
|
|
def initialize(cask)
|
|
@cask = cask
|
|
end
|
|
|
|
def run!(download = false)
|
|
_check_required_fields
|
|
_check_checksums
|
|
_check_sha256_no_check_if_latest
|
|
_check_sha256_if_versioned
|
|
_check_sourceforge_download_url_format
|
|
_check_download(download) if download
|
|
return !(errors? or warnings?)
|
|
end
|
|
|
|
def summary_header
|
|
"audit for #{cask}"
|
|
end
|
|
|
|
|
|
def _check_required_fields
|
|
odebug "Auditing required fields"
|
|
add_error "url is required" unless cask.url
|
|
add_error "version is required" unless cask.version
|
|
add_error "homepage is required" unless cask.homepage
|
|
end
|
|
|
|
def _check_checksums
|
|
odebug "Auditing checksums"
|
|
return if cask.sums == :no_check
|
|
add_error "sha256 is required" unless cask.sums.is_a?(Array) && cask.sums.length > 0
|
|
end
|
|
|
|
def _check_sha256_no_check_if_latest
|
|
odebug "Verifying sha256 :no_check with version 'latest'"
|
|
add_error "you should use sha256 :no_check when version is 'latest'" if cask.version == "latest" && cask.sums.is_a?(Array)
|
|
end
|
|
|
|
def _check_sha256_if_versioned
|
|
odebug "Verifying a sha256 is present when versioned"
|
|
add_error "you must include a sha256 when version is not 'latest'" if cask.version != "latest" && cask.sums == :no_check
|
|
end
|
|
|
|
def _check_download(download)
|
|
odebug "Auditing download"
|
|
download.perform
|
|
rescue => e
|
|
add_error "download not possible: #{e.message}"
|
|
end
|
|
|
|
def _check_sourceforge_download_url_format
|
|
odebug "Auditing URL format"
|
|
if _bad_sourceforge_url?
|
|
add_warning "SourceForge URL format incorrect. See https://github.com/caskroom/homebrew-cask/blob/master/CONTRIBUTING.md#sourceforge-urls"
|
|
end
|
|
end
|
|
|
|
def _bad_sourceforge_url?
|
|
return false unless cask.url.to_s =~ /sourceforge/
|
|
valid_url_formats = [
|
|
%r{https?://sourceforge.net/projects/.*/files/latest/download},
|
|
%r{https?://downloads.sourceforge.net/},
|
|
%r{https?://dl.sourceforge.jp/},
|
|
]
|
|
valid_url_formats.none? { |format| cask.url.to_s =~ format }
|
|
end
|
|
end
|