Skip to content

Commit 03e583e

Browse files
cask: read bundle version from Info.plist when sensible.
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]>
1 parent ea40447 commit 03e583e

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

Library/Homebrew/cask/cask.rb

+24-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "attrable"
5+
require "bundle_version"
56
require "cask/cask_loader"
67
require "cask/config"
78
require "cask/dsl"
@@ -176,8 +177,20 @@ def installed_caskfile
176177

177178
sig { returns(T.nilable(String)) }
178179
def installed_version
180+
return unless (installed_caskfile = self.installed_caskfile)
181+
179182
# <caskroom_path>/.metadata/<version>/<timestamp>/Casks/<token>.{rb,json} -> <version>
180-
installed_caskfile&.dirname&.dirname&.dirname&.basename&.to_s
183+
installed_caskfile.dirname.dirname.dirname.basename.to_s
184+
end
185+
186+
sig { returns(T.nilable(String)) }
187+
def bundle_short_version
188+
bundle_version&.short_version
189+
end
190+
191+
sig { returns(T.nilable(String)) }
192+
def bundle_long_version
193+
bundle_version&.version
181194
end
182195

183196
def config_path
@@ -326,6 +339,8 @@ def to_h
326339
"version" => version,
327340
"installed" => installed_version,
328341
"installed_time" => install_time&.to_i,
342+
"bundle_version" => bundle_long_version,
343+
"bundle_short_version" => bundle_short_version,
329344
"outdated" => outdated?,
330345
"sha256" => sha256,
331346
"artifacts" => artifacts_list,
@@ -386,6 +401,14 @@ def to_hash_with_variations
386401

387402
private
388403

404+
sig { returns(T.nilable(Homebrew::BundleVersion)) }
405+
def bundle_version
406+
@bundle_version ||= if (bundle = artifacts.find { |a| a.is_a?(Artifact::App) }&.target) &&
407+
(plist = Pathname("#{bundle}/Contents/Info.plist")) && plist.exist?
408+
Homebrew::BundleVersion.from_info_plist(plist)
409+
end
410+
end
411+
389412
def api_to_local_hash(hash)
390413
hash["token"] = token
391414
hash["installed"] = installed_version

Library/Homebrew/test/support/fixtures/cask/everything.json

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
"version": "1.2.3",
2222
"installed": null,
2323
"installed_time": null,
24+
"bundle_version": null,
25+
"bundle_short_version": null,
2426
"outdated": false,
2527
"sha256": "c64c05bdc0be845505d6e55e69e696a7f50d40846e76155f0c85d5ff5e7bbb84",
2628
"artifacts": [

Library/Homebrew/version.rb

+6
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ def numeric?
9494
def null?
9595
false
9696
end
97+
98+
sig { returns(T::Boolean) }
99+
def blank? = null?
97100
end
98101

99102
# A pseudo-token representing the absence of a token.
@@ -127,6 +130,9 @@ def null?
127130
true
128131
end
129132

133+
sig { returns(T::Boolean) }
134+
def blank? = true
135+
130136
sig { override.returns(String) }
131137
def inspect
132138
"#<#{self.class.name}>"

0 commit comments

Comments
 (0)