From 99635bf3aeeb40cdc6764cf17bdf872d642ce8e9 Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Fri, 6 Aug 2021 13:02:25 -0400 Subject: [PATCH] Remove need for homebrew/cask to be tapped --- Library/Homebrew/cask/cask.rb | 12 ++++++++++-- Library/Homebrew/cli/named_args.rb | 25 +++++++++++++++---------- Library/Homebrew/cmd/install.rb | 2 +- Library/Homebrew/cmd/reinstall.rb | 3 +++ Library/Homebrew/cmd/update.sh | 3 ++- Library/Homebrew/cmd/upgrade.rb | 9 +++++++++ Library/Homebrew/extend/os/mac/tap.rb | 2 +- 7 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Library/Homebrew/cask/cask.rb b/Library/Homebrew/cask/cask.rb index 2e1856d471..20bff3b592 100644 --- a/Library/Homebrew/cask/cask.rb +++ b/Library/Homebrew/cask/cask.rb @@ -6,6 +6,7 @@ require "cask/config" require "cask/dsl" require "cask/metadata" require "searchable" +require "api" module Cask # An instance of a cask. @@ -130,14 +131,21 @@ module Cask return [] end + latest_version = if ENV["HOMEBREW_JSON_CORE"].present? && + (latest_cask_version = Homebrew::API::Versions.latest_cask_version(token)) + DSL::Version.new latest_cask_version.to_s + else + version + end + installed = versions current = installed.last # not outdated unless there is a different version on tap - return [] if current == version + return [] if current == latest_version # collect all installed versions that are different than tap version and return them - installed.reject { |v| v == version } + installed.reject { |v| v == latest_version } end def outdated_info(greedy, verbose, json, greedy_latest, greedy_auto_updates) diff --git a/Library/Homebrew/cli/named_args.rb b/Library/Homebrew/cli/named_args.rb index 79c7fd822d..7ef5b5a695 100644 --- a/Library/Homebrew/cli/named_args.rb +++ b/Library/Homebrew/cli/named_args.rb @@ -45,18 +45,18 @@ module Homebrew # the formula and prints a warning unless `only` is specified. sig { params( - only: T.nilable(Symbol), - ignore_unavailable: T.nilable(T::Boolean), - method: T.nilable(Symbol), - uniq: T::Boolean, - prefer_loading_from_json: T::Boolean, + only: T.nilable(Symbol), + ignore_unavailable: T.nilable(T::Boolean), + method: T.nilable(Symbol), + uniq: T::Boolean, + prefer_loading_from_api: T::Boolean, ).returns(T::Array[T.any(Formula, Keg, Cask::Cask)]) } def to_formulae_and_casks(only: parent&.only_formula_or_cask, ignore_unavailable: nil, method: nil, uniq: true, - prefer_loading_from_json: false) + prefer_loading_from_api: false) @to_formulae_and_casks ||= {} @to_formulae_and_casks[only] ||= downcased_unique_named.flat_map do |name| - load_formula_or_cask(name, only: only, method: method, prefer_loading_from_json: prefer_loading_from_json) + load_formula_or_cask(name, only: only, method: method, prefer_loading_from_api: prefer_loading_from_api) rescue FormulaUnreadableError, FormulaClassUnavailableError, TapFormulaUnreadableError, TapFormulaClassUnavailableError, Cask::CaskUnreadableError @@ -90,11 +90,11 @@ module Homebrew end.uniq.freeze end - def load_formula_or_cask(name, only: nil, method: nil, prefer_loading_from_json: false) + def load_formula_or_cask(name, only: nil, method: nil, prefer_loading_from_api: false) unreadable_error = nil if only != :cask - if prefer_loading_from_json && ENV["HOMEBREW_JSON_CORE"].present? && + if prefer_loading_from_api && ENV["HOMEBREW_JSON_CORE"].present? && Homebrew::API::Bottle.available?(name) Homebrew::API::Bottle.fetch_bottles(name) end @@ -133,9 +133,14 @@ module Homebrew end if only != :formula + if prefer_loading_from_api && ENV["HOMEBREW_JSON_CORE"].present? && + Homebrew::API::CaskSource.available?(name) + contents = Homebrew::API::CaskSource.fetch(name) + end + begin config = Cask::Config.from_args(@parent) if @cask_options - cask = Cask::CaskLoader.load(name, config: config) + cask = Cask::CaskLoader.load(contents || name, config: config) if unreadable_error.present? onoe <<~EOS diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index e04ced8c99..7c102bb598 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -155,7 +155,7 @@ module Homebrew end begin - formulae, casks = args.named.to_formulae_and_casks(prefer_loading_from_json: true) + formulae, casks = args.named.to_formulae_and_casks(prefer_loading_from_api: true) .partition { |formula_or_cask| formula_or_cask.is_a?(Formula) } rescue FormulaOrCaskUnavailableError, Cask::CaskUnavailableError => e retry if Tap.install_default_cask_tap_if_necessary(force: args.cask?) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index c95693917e..791b299ed3 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -85,6 +85,9 @@ module Homebrew def reinstall args = reinstall_args.parse + # We need to use the bottle API instead of just using the formula file + # from an installed keg because it will not contain bottle information. + # As a consequence, `brew reinstall` will also upgrade outdated formulae if ENV["HOMEBREW_JSON_CORE"].present? args.named.each do |name| formula = Formulary.factory(name) diff --git a/Library/Homebrew/cmd/update.sh b/Library/Homebrew/cmd/update.sh index cc4ae0d1c2..4c7918ab39 100644 --- a/Library/Homebrew/cmd/update.sh +++ b/Library/Homebrew/cmd/update.sh @@ -648,7 +648,8 @@ EOS # HOMEBREW_UPDATE_PREINSTALL wasn't modified in subshell. # shellcheck disable=SC2031 if [[ -n "${HOMEBREW_JSON_CORE}" ]] && [[ -n "${HOMEBREW_UPDATE_PREINSTALL}" ]] && - [[ "${DIR}" = "${HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core" ]] + [[ "${DIR}" = "${HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core" || + "${DIR}" = "${HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-cask" ]] then continue fi diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index cbc10fb6b1..c673975f63 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -225,6 +225,15 @@ module Homebrew def upgrade_outdated_casks(casks, args:) return false if args.formula? + if ENV["HOMEBREW_JSON_CORE"].present? + casks = casks.map do |cask| + next cask if cask.tap.present? && cask.tap != "homebrew/cask" + next cask unless Homebrew::API::CaskSource.available?(cask.token) + + Cask::CaskLoader.load Homebrew::API::CaskSource.fetch(cask.token) + end + end + Cask::Cmd::Upgrade.upgrade_casks( *casks, force: args.force?, diff --git a/Library/Homebrew/extend/os/mac/tap.rb b/Library/Homebrew/extend/os/mac/tap.rb index ca2701238a..d2e5b89212 100644 --- a/Library/Homebrew/extend/os/mac/tap.rb +++ b/Library/Homebrew/extend/os/mac/tap.rb @@ -4,7 +4,7 @@ class Tap def self.install_default_cask_tap_if_necessary(force: false) return false if default_cask_tap.installed? - + return false if ENV["HOMEBREW_JSON_CORE"].present? return false if !force && Tap.untapped_official_taps.include?(default_cask_tap.name) default_cask_tap.install