Merge pull request #3001 from reitermarkus/cask-conflicts-with

Implement `conflicts_with :cask`.
This commit is contained in:
Markus Reiter 2017-08-20 17:50:54 +02:00 committed by GitHub
commit 4b34ca5b35
5 changed files with 61 additions and 13 deletions

View File

@ -10,24 +10,19 @@ module Hbc
:java,
]
attr_accessor(*VALID_KEYS)
attr_accessor :pairs
attr_reader *VALID_KEYS
def initialize(pairs = {})
@pairs = pairs
VALID_KEYS.each do |key|
instance_variable_set("@#{key}", Set.new)
end
pairs.each do |key, value|
raise "invalid conflicts_with key: '#{key.inspect}'" unless VALID_KEYS.include?(key)
writer_method = "#{key}=".to_sym
send(writer_method, value)
end
end
def to_yaml
@pairs.to_yaml
end
def to_s
@pairs.inspect
instance_variable_set("@#{key}", instance_variable_get("@#{key}").merge([*value]))
end
end
end
end

View File

@ -17,6 +17,19 @@ module Hbc
end
end
class CaskConflictError < AbstractCaskErrorWithToken
attr_reader :conflicting_cask
def initialize(token, conflicting_cask)
super(token)
@conflicting_cask = conflicting_cask
end
def to_s
"Cask '#{token}' conflicts with '#{conflicting_cask}'."
end
end
class CaskUnavailableError < AbstractCaskErrorWithToken
def to_s
"Cask '#{token}' is unavailable" << (reason.empty? ? "." : ": #{reason}")

View File

@ -86,6 +86,8 @@ module Hbc
raise CaskAlreadyInstalledError, @cask
end
check_conflicts
print_caveats
fetch
uninstall_existing_cask if @reinstall
@ -98,6 +100,21 @@ module Hbc
puts summary
end
def check_conflicts
return unless @cask.conflicts_with
@cask.conflicts_with.cask.each do |conflicting_cask|
begin
conflicting_cask = CaskLoader.load(conflicting_cask)
if conflicting_cask.installed?
raise CaskConflictError.new(@cask, conflicting_cask)
end
rescue CaskUnavailableError
next # Ignore conflicting Casks that do not exist.
end
end
end
def reinstall
odebug "Hbc::Installer#reinstall"
@reinstall = true

View File

@ -0,0 +1,23 @@
describe "conflicts_with", :cask do
describe "conflicts_with cask" do
let(:local_caffeine) {
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb")
}
let(:with_conflicts_with) {
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-conflicts-with.rb")
}
it "installs the dependency of a Cask and the Cask itself", :focus do
Hbc::Installer.new(local_caffeine).install
expect(local_caffeine).to be_installed
expect {
Hbc::Installer.new(with_conflicts_with).install
}.to raise_error(Hbc::CaskConflictError, "Cask 'with-conflicts-with' conflicts with 'local-caffeine'.")
expect(with_conflicts_with).not_to be_installed
end
end
end

View File

@ -5,7 +5,7 @@ cask 'with-conflicts-with' do
url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip"
homepage 'http://example.com/with-conflicts-with'
conflicts_with formula: 'unar'
conflicts_with cask: 'local-caffeine'
app 'Caffeine.app'
end