Skip to content

Commit

Permalink
cask: read bundle version from Info.plist when sensible.
Browse files Browse the repository at this point in the history
If you're trying to use `brew info --json=v2` to get an installed
version and figure out if it is outdated: you're going to have a bad
time with `auto_updates` casks because `installed_version` alone is not
enough to get the actually currently installed version of the app.

Instead, in these cases, try to read from `Info.plist` if there is one
and use that version.

While we're here, add a `blank?` method to `Version` so we can use it
for `present?` checks (making a `null?` `Version` object `blank?`).
  • Loading branch information
MikeMcQuaid committed Mar 5, 2024
1 parent a436f7b commit 178b930
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
25 changes: 24 additions & 1 deletion Library/Homebrew/cask/cask.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# frozen_string_literal: true

require "attrable"
require "bundle_version"
require "cask/cask_loader"
require "cask/config"
require "cask/dsl"
Expand Down Expand Up @@ -176,8 +177,20 @@ def installed_caskfile

sig { returns(T.nilable(String)) }
def installed_version
return unless (installed_caskfile = self.installed_caskfile)

# <caskroom_path>/.metadata/<version>/<timestamp>/Casks/<token>.{rb,json} -> <version>
installed_caskfile&.dirname&.dirname&.dirname&.basename&.to_s
installed_caskfile.dirname.dirname.dirname.basename.to_s

Check warning on line 183 in Library/Homebrew/cask/cask.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cask/cask.rb#L183

Added line #L183 was not covered by tests
end

sig { returns(T.nilable(String)) }
def bundle_short_version
bundle_version&.short_version
end

sig { returns(T.nilable(String)) }
def bundle_long_version
bundle_version&.version
end

def config_path
Expand Down Expand Up @@ -326,6 +339,8 @@ def to_h
"version" => version,
"installed" => installed_version,
"installed_time" => install_time&.to_i,
"bundle_version" => bundle_long_version,
"bundle_short_version" => bundle_short_version,
"outdated" => outdated?,
"sha256" => sha256,
"artifacts" => artifacts_list,
Expand Down Expand Up @@ -386,6 +401,14 @@ def to_hash_with_variations

private

sig { returns(T.nilable(Homebrew::BundleVersion)) }
def bundle_version
@bundle_version ||= if (bundle = artifacts.find { |a| a.is_a?(Artifact::App) }&.target) &&
(plist = Pathname("#{bundle}/Contents/Info.plist")) && plist.exist?

Check warning on line 407 in Library/Homebrew/cask/cask.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/cask/cask.rb#L407

Added line #L407 was not covered by tests
::Homebrew::BundleVersion.from_info_plist(plist)
end
end

def api_to_local_hash(hash)
hash["token"] = token
hash["installed"] = installed_version
Expand Down
6 changes: 6 additions & 0 deletions Library/Homebrew/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ def numeric?
def null?
false
end

sig { returns(T::Boolean) }
def blank? = null?
end

# A pseudo-token representing the absence of a token.
Expand Down Expand Up @@ -127,6 +130,9 @@ def null?
true
end

sig { returns(T::Boolean) }
def blank? = true

sig { override.returns(String) }
def inspect
"#<#{self.class.name}>"
Expand Down

0 comments on commit 178b930

Please sign in to comment.