diff --git a/Library/Homebrew/cask/artifact/moved.rb b/Library/Homebrew/cask/artifact/moved.rb index b8be1ecd69..1a4e1629f8 100644 --- a/Library/Homebrew/cask/artifact/moved.rb +++ b/Library/Homebrew/cask/artifact/moved.rb @@ -31,7 +31,7 @@ module Cask private - def move(adopt: false, force: false, verbose: false, predecessor: nil, reinstall: false, + def move(adopt: false, auto_updates: false, force: false, verbose: false, predecessor: nil, reinstall: false, command: nil, **options) unless source.exist? raise CaskError, "It seems the #{self.class.english_name} source '#{source}' is not there." @@ -79,6 +79,8 @@ module Cask ).success? end + same = true if auto_updates + unless same raise CaskError, "It seems the existing #{self.class.english_name} is different from " \ diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index 6877f13ee6..729f014711 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -253,7 +253,8 @@ on_request: true) next if artifact.is_a?(Artifact::Binary) && !binaries? artifact.install_phase( - command: @command, verbose: verbose?, adopt: adopt?, force: force?, predecessor:, + command: @command, verbose: verbose?, adopt: adopt?, auto_updates: @cask.auto_updates, + force: force?, predecessor: ) already_installed_artifacts.unshift(artifact) end diff --git a/Library/Homebrew/test/cask/artifact/app_spec.rb b/Library/Homebrew/test/cask/artifact/app_spec.rb index 72f644cd45..b4f0e800a3 100644 --- a/Library/Homebrew/test/cask/artifact/app_spec.rb +++ b/Library/Homebrew/test/cask/artifact/app_spec.rb @@ -5,12 +5,13 @@ RSpec.describe Cask::Artifact::App, :cask do let(:command) { NeverSudoSystemCommand } let(:adopt) { false } let(:force) { false } + let(:auto_updates) { false } let(:app) { cask.artifacts.find { |a| a.is_a?(described_class) } } let(:source_path) { cask.staged_path.join("Caffeine.app") } let(:target_path) { cask.config.appdir.join("Caffeine.app") } - let(:install_phase) { app.install_phase(command:, adopt:, force:) } + let(:install_phase) { app.install_phase(command:, adopt:, force:, auto_updates:) } let(:uninstall_phase) { app.uninstall_phase(command:, force:) } before do @@ -83,24 +84,55 @@ RSpec.describe Cask::Artifact::App, :cask do let(:adopt) { true } describe "when the target compares different from the source" do - it "avoids clobbering the existing app" do - stdout = <<~EOS - ==> Adopting existing App at '#{target_path}' - EOS + describe "when the cask does not auto_updates" do + it "avoids clobbering the existing app if brew manages updates" do + stdout = <<~EOS + ==> Adopting existing App at '#{target_path}' + EOS - expect { install_phase } - .to output(stdout).to_stdout - .and raise_error( - Cask::CaskError, - "It seems the existing App is different from the one being installed.", - ) + expect { install_phase } + .to output(stdout).to_stdout + .and raise_error( + Cask::CaskError, + "It seems the existing App is different from the one being installed.", + ) - expect(source_path).to be_a_directory - expect(target_path).to be_a_directory - expect(File.identical?(source_path, target_path)).to be false + expect(source_path).to be_a_directory + expect(target_path).to be_a_directory + expect(File.identical?(source_path, target_path)).to be false - contents_path = target_path.join("Contents/Info.plist") - expect(contents_path).not_to exist + contents_path = target_path.join("Contents/Info.plist") + expect(contents_path).not_to exist + end + end + + describe "when the cask auto_updates" do + before do + target_path.delete + FileUtils.cp_r source_path, target_path + File.write(target_path.join("Contents/Info.plist"), "different") + end + + let(:auto_updates) { true } + + it "adopts the existing app" do + stdout = <<~EOS + ==> Adopting existing App at '#{target_path}' + EOS + + stderr = "" + + expect { install_phase } + .to output(stdout).to_stdout + .and output(stderr).to_stderr + + expect(source_path).to be_a_symlink + expect(target_path).to be_a_directory + + contents_path = target_path.join("Contents/Info.plist") + expect(contents_path).to exist + expect(File.read(contents_path)).to eq("different") + end end end