Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add checking whether an appcast contains the version number #5972

Merged
merged 1 commit into from May 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 23 additions & 1 deletion Library/Homebrew/cask/audit.rb
Expand Up @@ -9,11 +9,16 @@
module Cask
class Audit
include Checkable
extend Predicable

attr_reader :cask, :commit_range, :download

def initialize(cask, download: false, check_token_conflicts: false, commit_range: nil, command: SystemCommand)
attr_predicate :check_appcast?

def initialize(cask, check_appcast: false, download: false, check_token_conflicts: false,
commit_range: nil, command: SystemCommand)
@cask = cask
@check_appcast = check_appcast
@download = download
@commit_range = commit_range
@check_token_conflicts = check_token_conflicts
Expand All @@ -40,6 +45,7 @@ def run!
check_latest_with_appcast
check_latest_with_auto_updates
check_stanza_requires_uninstall
check_appcast_contains_version
self
rescue => e
odebug "#{e.message}\n#{e.backtrace.join("\n")}"
Expand Down Expand Up @@ -292,6 +298,22 @@ def check_download
add_error "download not possible: #{e.message}"
end

def check_appcast_contains_version
return unless check_appcast?
return if cask.appcast.to_s.empty?

appcast_stanza = cask.appcast.to_s
appcast_contents, = curl_output("--max-time", "5", appcast_stanza)
version_stanza = cask.version.to_s
adjusted_version_stanza = version_stanza.split(",")[0].split("-")[0].split("_")[0]
core-code marked this conversation as resolved.
Show resolved Hide resolved
return if appcast_contents.include? adjusted_version_stanza
reitermarkus marked this conversation as resolved.
Show resolved Hide resolved

add_warning "appcast at URL '#{appcast_stanza}' does not contain"\
" the version number: '#{adjusted_version_stanza}'"
rescue
add_error "appcast at URL '#{appcast_stanza}' offline or looping"
end

def check_https_availability
return unless download

Expand Down
22 changes: 15 additions & 7 deletions Library/Homebrew/cask/auditor.rb
Expand Up @@ -4,15 +4,24 @@

module Cask
class Auditor
def self.audit(cask, audit_download: false, check_token_conflicts: false, quarantine: true, commit_range: nil)
new(cask, audit_download, check_token_conflicts, quarantine, commit_range).audit
include Checkable
extend Predicable

def self.audit(cask, audit_download: false, audit_appcast: false,
core-code marked this conversation as resolved.
Show resolved Hide resolved
check_token_conflicts: false, quarantine: true, commit_range: nil)
new(cask, audit_download: audit_download,
audit_appcast: audit_appcast,
check_token_conflicts: check_token_conflicts,
quarantine: quarantine, commit_range: commit_range).audit
end

attr_reader :cask, :commit_range

def initialize(cask, audit_download, check_token_conflicts, quarantine, commit_range)
def initialize(cask, audit_download: false, audit_appcast: false,
check_token_conflicts: false, quarantine: true, commit_range: nil)
@cask = cask
@audit_download = audit_download
@audit_appcast = audit_appcast
@quarantine = quarantine
@commit_range = commit_range
@check_token_conflicts = check_token_conflicts
Expand All @@ -22,9 +31,7 @@ def audit_download?
@audit_download
end

def quarantine?
@quarantine
end
attr_predicate :audit_appcast?, :quarantine?
reitermarkus marked this conversation as resolved.
Show resolved Hide resolved

def check_token_conflicts?
@check_token_conflicts
Expand Down Expand Up @@ -57,7 +64,8 @@ def audit_languages(languages)

def audit_cask_instance(cask)
download = audit_download? && Download.new(cask, quarantine: quarantine?)
audit = Audit.new(cask, download: download,
audit = Audit.new(cask, check_appcast: audit_appcast?,
download: download,
check_token_conflicts: check_token_conflicts?,
commit_range: commit_range)
audit.run!
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/cask/cmd/audit.rb
Expand Up @@ -4,6 +4,7 @@ module Cask
class Cmd
class Audit < AbstractCommand
option "--download", :download, false
option "--appcast", :appcast, false
option "--token-conflicts", :token_conflicts, false

def self.help
Expand All @@ -22,6 +23,7 @@ def run
def audit(cask)
odebug "Auditing Cask #{cask}"
Auditor.audit(cask, audit_download: download?,
audit_appcast: appcast?,
check_token_conflicts: token_conflicts?,
quarantine: quarantine?)
end
Expand Down
10 changes: 5 additions & 5 deletions Library/Homebrew/test/cask/cmd/audit_spec.rb
Expand Up @@ -21,7 +21,7 @@
expect(Cask::CaskLoader).to receive(:load).with(cask_token).and_return(cask)

expect(Cask::Auditor).to receive(:audit)
.with(cask, audit_download: false, check_token_conflicts: false, quarantine: true)
.with(cask, audit_download: false, audit_appcast: false, check_token_conflicts: false, quarantine: true)
.and_return(true)

described_class.run(cask_token)
Expand All @@ -32,7 +32,7 @@
it "does not download the Cask per default" do
allow(Cask::CaskLoader).to receive(:load).and_return(cask)
expect(Cask::Auditor).to receive(:audit)
.with(cask, audit_download: false, check_token_conflicts: false, quarantine: true)
.with(cask, audit_download: false, audit_appcast: false, check_token_conflicts: false, quarantine: true)
.and_return(true)

described_class.run("casktoken")
Expand All @@ -41,7 +41,7 @@
it "download a Cask if --download flag is set" do
allow(Cask::CaskLoader).to receive(:load).and_return(cask)
expect(Cask::Auditor).to receive(:audit)
.with(cask, audit_download: true, check_token_conflicts: false, quarantine: true)
.with(cask, audit_download: true, audit_appcast: false, check_token_conflicts: false, quarantine: true)
.and_return(true)

described_class.run("casktoken", "--download")
Expand All @@ -52,7 +52,7 @@
it "does not check for token conflicts per default" do
allow(Cask::CaskLoader).to receive(:load).and_return(cask)
expect(Cask::Auditor).to receive(:audit)
.with(cask, audit_download: false, check_token_conflicts: false, quarantine: true)
.with(cask, audit_download: false, audit_appcast: false, check_token_conflicts: false, quarantine: true)
.and_return(true)

described_class.run("casktoken")
Expand All @@ -61,7 +61,7 @@
it "checks for token conflicts if --token-conflicts flag is set" do
allow(Cask::CaskLoader).to receive(:load).and_return(cask)
expect(Cask::Auditor).to receive(:audit)
.with(cask, audit_download: false, check_token_conflicts: true, quarantine: true)
.with(cask, audit_download: false, audit_appcast: false, check_token_conflicts: true, quarantine: true)
.and_return(true)

described_class.run("casktoken", "--token-conflicts")
Expand Down