Improve cask --adopt to only care about the installed version if auto_update is false

This commit is contained in:
Case Taintor 2024-09-26 11:14:30 +02:00
parent d1509cbef0
commit 31c560e578
3 changed files with 53 additions and 18 deletions

View File

@ -31,7 +31,7 @@ module Cask
private 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) command: nil, **options)
unless source.exist? unless source.exist?
raise CaskError, "It seems the #{self.class.english_name} source '#{source}' is not there." raise CaskError, "It seems the #{self.class.english_name} source '#{source}' is not there."
@ -79,6 +79,8 @@ module Cask
).success? ).success?
end end
same = true if auto_updates
unless same unless same
raise CaskError, raise CaskError,
"It seems the existing #{self.class.english_name} is different from " \ "It seems the existing #{self.class.english_name} is different from " \

View File

@ -253,7 +253,8 @@ on_request: true)
next if artifact.is_a?(Artifact::Binary) && !binaries? next if artifact.is_a?(Artifact::Binary) && !binaries?
artifact.install_phase( 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) already_installed_artifacts.unshift(artifact)
end end

View File

@ -5,12 +5,13 @@ RSpec.describe Cask::Artifact::App, :cask do
let(:command) { NeverSudoSystemCommand } let(:command) { NeverSudoSystemCommand }
let(:adopt) { false } let(:adopt) { false }
let(:force) { false } let(:force) { false }
let(:auto_updates) { false }
let(:app) { cask.artifacts.find { |a| a.is_a?(described_class) } } let(:app) { cask.artifacts.find { |a| a.is_a?(described_class) } }
let(:source_path) { cask.staged_path.join("Caffeine.app") } let(:source_path) { cask.staged_path.join("Caffeine.app") }
let(:target_path) { cask.config.appdir.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:) } let(:uninstall_phase) { app.uninstall_phase(command:, force:) }
before do before do
@ -83,24 +84,55 @@ RSpec.describe Cask::Artifact::App, :cask do
let(:adopt) { true } let(:adopt) { true }
describe "when the target compares different from the source" do describe "when the target compares different from the source" do
it "avoids clobbering the existing app" do describe "when the cask does not auto_updates" do
stdout = <<~EOS it "avoids clobbering the existing app if brew manages updates" do
==> Adopting existing App at '#{target_path}' stdout = <<~EOS
EOS ==> Adopting existing App at '#{target_path}'
EOS
expect { install_phase } expect { install_phase }
.to output(stdout).to_stdout .to output(stdout).to_stdout
.and raise_error( .and raise_error(
Cask::CaskError, Cask::CaskError,
"It seems the existing App is different from the one being installed.", "It seems the existing App is different from the one being installed.",
) )
expect(source_path).to be_a_directory expect(source_path).to be_a_directory
expect(target_path).to be_a_directory expect(target_path).to be_a_directory
expect(File.identical?(source_path, target_path)).to be false expect(File.identical?(source_path, target_path)).to be false
contents_path = target_path.join("Contents/Info.plist") contents_path = target_path.join("Contents/Info.plist")
expect(contents_path).not_to exist 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
end end