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?`).

Co-authored-by: Markus Reiter <[email protected]>
  • Loading branch information
MikeMcQuaid and reitermarkus committed Mar 6, 2024
1 parent d55fa09 commit ff5dd33
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
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: 3 additions & 3 deletions Library/Homebrew/test/support/fixtures/cask/everything.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
{
"token": "everything",
"full_token": "everything",
"old_tokens": [

],
"old_tokens": [],
"tap": "homebrew/cask",
"name": [
"Everything"
Expand All @@ -21,6 +19,8 @@
"version": "1.2.3",
"installed": null,
"installed_time": null,
"bundle_version": null,
"bundle_short_version": null,
"outdated": false,
"sha256": "c64c05bdc0be845505d6e55e69e696a7f50d40846e76155f0c85d5ff5e7bbb84",
"artifacts": [
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 ff5dd33

Please sign in to comment.