From e3818ee51e2ea350385bf2a7fbd3aae91732acc6 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Mon, 14 Dec 2020 15:16:03 +0100 Subject: [PATCH] Fix parsing version from `PackageInfo` files. --- Library/Homebrew/Gemfile | 1 + Library/Homebrew/Gemfile.lock | 1 + Library/Homebrew/unversioned_cask_checker.rb | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index 0be5af4669..bc2bd31373 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -5,6 +5,7 @@ source "https://rubygems.org" # installed gems (should all be require: false) gem "byebug", require: false gem "codecov", require: false +gem "nokogiri", require: false gem "parallel_tests", require: false gem "ronn", require: false gem "rspec", require: false diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock index 070a79eabd..59d4c2b577 100644 --- a/Library/Homebrew/Gemfile.lock +++ b/Library/Homebrew/Gemfile.lock @@ -169,6 +169,7 @@ DEPENDENCIES codecov concurrent-ruby mechanize + nokogiri parallel_tests patchelf plist diff --git a/Library/Homebrew/unversioned_cask_checker.rb b/Library/Homebrew/unversioned_cask_checker.rb index 1b9b4ccac3..d6e18c6e37 100644 --- a/Library/Homebrew/unversioned_cask_checker.rb +++ b/Library/Homebrew/unversioned_cask_checker.rb @@ -57,10 +57,19 @@ module Homebrew sig { params(package_info_path: Pathname).returns(T.nilable(String)) } def self.version_from_package_info(package_info_path) - contents = package_info_path.read + Homebrew.install_bundler_gems! + require "nokogiri" - short_version = contents[/CFBundleShortVersionString="([^"]*)"/, 1].presence - version = contents[/CFBundleVersion="([^"]*)"/, 1].presence + xml = Nokogiri::XML(package_info_path.read) + + bundle_id = xml.xpath("//pkg-info//bundle-version//bundle").first&.attr("id") + return unless bundle_id + + bundle = xml.xpath("//pkg-info//bundle").find { |b| b["id"] == bundle_id } + return unless bundle + + short_version = bundle["CFBundleShortVersionString"] + version = bundle["CFBundleVersion"] return decide_between_versions(short_version, version) if short_version && version end