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

Improve cask --adopt to only care about the installed version if auto… #18420

Merged
merged 2 commits into from
Sep 26, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 29 additions & 27 deletions Library/Homebrew/cask/artifact/moved.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

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."
Expand All @@ -51,38 +51,40 @@
if adopt
ohai "Adopting existing #{self.class.english_name} at '#{target}'"

source_plist = Pathname("#{source}/Contents/Info.plist")
target_plist = Pathname("#{target}/Contents/Info.plist")
same = if source_plist.size? &&
(source_bundle_version = Homebrew::BundleVersion.from_info_plist(source_plist)) &&
target_plist.size? &&
(target_bundle_version = Homebrew::BundleVersion.from_info_plist(target_plist))
if source_bundle_version.short_version == target_bundle_version.short_version
if source_bundle_version.version == target_bundle_version.version
true
unless auto_updates
source_plist = Pathname("#{source}/Contents/Info.plist")
target_plist = Pathname("#{target}/Contents/Info.plist")
same = if source_plist.size? &&
(source_bundle_version = Homebrew::BundleVersion.from_info_plist(source_plist)) &&

Check warning on line 58 in Library/Homebrew/cask/artifact/moved.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cask/artifact/moved.rb#L58

Added line #L58 was not covered by tests
target_plist.size? &&
(target_bundle_version = Homebrew::BundleVersion.from_info_plist(target_plist))

Check warning on line 60 in Library/Homebrew/cask/artifact/moved.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cask/artifact/moved.rb#L60

Added line #L60 was not covered by tests
if source_bundle_version.short_version == target_bundle_version.short_version
if source_bundle_version.version == target_bundle_version.version
true
else
onoe "The bundle version of #{source} is #{source_bundle_version.version} but " \
"is #{target_bundle_version.version} for #{target}!"
false

Check warning on line 67 in Library/Homebrew/cask/artifact/moved.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cask/artifact/moved.rb#L67

Added line #L67 was not covered by tests
end
else
onoe "The bundle version of #{source} is #{source_bundle_version.version} but " \
"is #{target_bundle_version.version} for #{target}!"
onoe "The bundle short version of #{source} is #{source_bundle_version.short_version} but " \
"is #{target_bundle_version.short_version} for #{target}!"
false
end
else
onoe "The bundle short version of #{source} is #{source_bundle_version.short_version} but " \
"is #{target_bundle_version.short_version} for #{target}!"
false
command.run(
"/usr/bin/diff",
args: ["--recursive", "--brief", source, target],
verbose:,
print_stdout: verbose,
).success?
end
else
command.run(
"/usr/bin/diff",
args: ["--recursive", "--brief", source, target],
verbose:,
print_stdout: verbose,
).success?
end

unless same
raise CaskError,
"It seems the existing #{self.class.english_name} is different from " \
"the one being installed."
unless same
raise CaskError,
"It seems the existing #{self.class.english_name} is different from " \
"the one being installed."
end
end

# Remove the source as we don't need to move it to the target location
Expand Down
3 changes: 2 additions & 1 deletion Library/Homebrew/cask/installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,8 @@ def install_artifacts(predecessor: nil)
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
Expand Down
64 changes: 48 additions & 16 deletions Library/Homebrew/test/cask/artifact/app_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
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
Expand Down Expand Up @@ -83,24 +84,55 @@
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(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
end
end

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.",
)
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

expect(source_path).to be_a_directory
expect(target_path).to be_a_directory
expect(File.identical?(source_path, target_path)).to be false
let(:auto_updates) { true }

contents_path = target_path.join("Contents/Info.plist")
expect(contents_path).not_to exist
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

Expand Down