aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Reiter2017-08-20 17:50:54 +0200
committerGitHub2017-08-20 17:50:54 +0200
commit4b34ca5b35b095e538b6e3bfe642eb57dad924ee (patch)
treecaa848ae38b83e9055427d7e09625e0d5b98cda9
parent5b965d6a79fcf47d5abcb6006de84fddb558328b (diff)
parentf89e09b7857e8e3a6f6cd30258aa5927a1ac2872 (diff)
downloadbrew-4b34ca5b35b095e538b6e3bfe642eb57dad924ee.tar.bz2
Merge pull request #3001 from reitermarkus/cask-conflicts-with
Implement `conflicts_with :cask`.
-rw-r--r--Library/Homebrew/cask/lib/hbc/dsl/conflicts_with.rb19
-rw-r--r--Library/Homebrew/cask/lib/hbc/exceptions.rb13
-rw-r--r--Library/Homebrew/cask/lib/hbc/installer.rb17
-rw-r--r--Library/Homebrew/test/cask/conflicts_with_spec.rb23
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/with-conflicts-with.rb2
5 files changed, 61 insertions, 13 deletions
diff --git a/Library/Homebrew/cask/lib/hbc/dsl/conflicts_with.rb b/Library/Homebrew/cask/lib/hbc/dsl/conflicts_with.rb
index 948348239..dfaa55a5c 100644
--- a/Library/Homebrew/cask/lib/hbc/dsl/conflicts_with.rb
+++ b/Library/Homebrew/cask/lib/hbc/dsl/conflicts_with.rb
@@ -10,25 +10,20 @@ 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)
+ instance_variable_set("@#{key}", instance_variable_get("@#{key}").merge([*value]))
end
end
-
- def to_yaml
- @pairs.to_yaml
- end
-
- def to_s
- @pairs.inspect
- end
end
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/exceptions.rb b/Library/Homebrew/cask/lib/hbc/exceptions.rb
index 1a246be65..f7f9e43b6 100644
--- a/Library/Homebrew/cask/lib/hbc/exceptions.rb
+++ b/Library/Homebrew/cask/lib/hbc/exceptions.rb
@@ -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}")
diff --git a/Library/Homebrew/cask/lib/hbc/installer.rb b/Library/Homebrew/cask/lib/hbc/installer.rb
index 53210ed4b..37cc4e561 100644
--- a/Library/Homebrew/cask/lib/hbc/installer.rb
+++ b/Library/Homebrew/cask/lib/hbc/installer.rb
@@ -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
diff --git a/Library/Homebrew/test/cask/conflicts_with_spec.rb b/Library/Homebrew/test/cask/conflicts_with_spec.rb
new file mode 100644
index 000000000..0dc51cb2d
--- /dev/null
+++ b/Library/Homebrew/test/cask/conflicts_with_spec.rb
@@ -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
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/with-conflicts-with.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/with-conflicts-with.rb
index ab3631743..13d1fc4fc 100644
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/with-conflicts-with.rb
+++ b/Library/Homebrew/test/support/fixtures/cask/Casks/with-conflicts-with.rb
@@ -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