From d506645667a51d6a23f67757f5435bf546b79d4c Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 13 Feb 2024 20:44:54 +0100 Subject: [PATCH 1/4] Add separate loader for default tap. --- Library/Homebrew/cask/cask_loader.rb | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/cask/cask_loader.rb b/Library/Homebrew/cask/cask_loader.rb index 1a3cd08ec3..a1ff102991 100644 --- a/Library/Homebrew/cask/cask_loader.rb +++ b/Library/Homebrew/cask/cask_loader.rb @@ -437,6 +437,23 @@ module Cask end end + # Loader which tries loading casks from the default tap. + class FromDefaultNameLoader < FromTapLoader + sig { + params(ref: T.any(String, Pathname, Cask, URI::Generic), warn: T::Boolean) + .returns(T.nilable(T.attached_class)) + } + def self.try_new(ref, warn: false) + return unless ref.is_a?(String) + return if ref.include?("/") + return unless (tap = CoreCaskTap.instance).installed? + + return unless (loader = super("#{tap}/#{ref}", warn: warn)) + + loader if loader.path.exist? + end + end + # Loader which tries loading casks from tap paths, failing # if the same token exists in multiple taps. class FromNameLoader < FromTapLoader @@ -458,11 +475,6 @@ module Cask when 1 loaders.first when 2..Float::INFINITY - # Always prefer the default tap, i.e. behave the same as if loading from the API. - if (default_tap_loader = loaders.find { _1.tap.core_cask_tap? }) - return default_tap_loader - end - raise TapCaskAmbiguityError.new(token, loaders.map(&:tap)) end end @@ -555,6 +567,7 @@ module Cask FromURILoader, FromAPILoader, FromTapLoader, + FromDefaultNameLoader, FromNameLoader, FromPathLoader, FromInstalledPathLoader, From c8058a3859ce487c60e1182fb1c8557336ff5c9f Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 13 Feb 2024 21:12:51 +0100 Subject: [PATCH 2/4] Add tests for cask migrations to default tap. --- .../Homebrew/test/cask/cask_loader_spec.rb | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Library/Homebrew/test/cask/cask_loader_spec.rb b/Library/Homebrew/test/cask/cask_loader_spec.rb index 184343dd03..ccaa8d16aa 100644 --- a/Library/Homebrew/test/cask/cask_loader_spec.rb +++ b/Library/Homebrew/test/cask/cask_loader_spec.rb @@ -66,5 +66,45 @@ describe Cask::CaskLoader, :cask do end end end + + context "when not using the API" do + before do + ENV["HOMEBREW_NO_INSTALL_FROM_API"] = "1" + end + + context "when a cask is migrated to the default tap" do + let(:token) { "local-caffeine" } + let(:tap_migrations) do + { + token => default_tap.name, + } + end + let(:old_tap) { CoreTap.instance } + let(:default_tap) { CoreCaskTap.instance } + + before do + (old_tap.path/"tap_migrations.json").write tap_migrations.to_json + old_tap.clear_cache + end + + it "does not warn when loading the short token" do + expect do + described_class.for(token) + end.not_to output.to_stderr + end + + it "does not warn when loading the full token in the default tap" do + expect do + described_class.for("#{default_tap}/#{token}") + end.not_to output.to_stderr + end + + it "warns when loading the full token in the old tap" do + expect do + described_class.for("#{old_tap}/#{token}") + end.to output(%r{Cask #{old_tap}/#{token} was renamed to #{token}\.}).to_stderr + end + end + end end end From 228ebe0c32b9aaf9fe62a36f0d5fc8b9c1156cfb Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 13 Feb 2024 21:23:37 +0100 Subject: [PATCH 3/4] Add tests for formula migration warnings to default tap. --- Library/Homebrew/test/formulary_spec.rb | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Library/Homebrew/test/formulary_spec.rb b/Library/Homebrew/test/formulary_spec.rb index d7d056a406..411f17574f 100644 --- a/Library/Homebrew/test/formulary_spec.rb +++ b/Library/Homebrew/test/formulary_spec.rb @@ -528,4 +528,47 @@ describe Formulary do expect(described_class.convert_to_string_or_symbol(":foo")).to eq :foo end end + + describe "::loader_for" do + context "when not using the API" do + before do + ENV["HOMEBREW_NO_INSTALL_FROM_API"] = "1" + end + + context "when a formula is migrated to the default tap" do + let(:token) { "local-caffeine" } + let(:tap_migrations) do + { + token => default_tap.name, + } + end + let(:old_tap) { CoreCaskTap.instance } + let(:default_tap) { CoreTap.instance } + + before do + old_tap.path.mkpath + (old_tap.path/"tap_migrations.json").write tap_migrations.to_json + old_tap.clear_cache + end + + it "does not warn when loading the short token" do + expect do + described_class.loader_for(token) + end.not_to output.to_stderr + end + + it "does not warn when loading the full token in the default tap" do + expect do + described_class.loader_for("#{default_tap}/#{token}") + end.not_to output.to_stderr + end + + it "warns when loading the full token in the old tap" do + expect do + described_class.loader_for("#{old_tap}/#{token}") + end.to output(%r{Formula #{old_tap}/#{token} was renamed to #{token}\.}).to_stderr + end + end + end + end end From 876535c670444e701b15d3dcdc4aaa0feee9b0d2 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 13 Feb 2024 21:52:45 +0100 Subject: [PATCH 4/4] Use `HOMEBREW_DEFAULT_TAP_CASK_REGEX` in `FromDefaultNameLoader`. --- Library/Homebrew/cask/cask_loader.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/cask/cask_loader.rb b/Library/Homebrew/cask/cask_loader.rb index a1ff102991..42b57f98e3 100644 --- a/Library/Homebrew/cask/cask_loader.rb +++ b/Library/Homebrew/cask/cask_loader.rb @@ -445,10 +445,10 @@ module Cask } def self.try_new(ref, warn: false) return unless ref.is_a?(String) - return if ref.include?("/") + return unless (token = ref[HOMEBREW_DEFAULT_TAP_CASK_REGEX, :token]) return unless (tap = CoreCaskTap.instance).installed? - return unless (loader = super("#{tap}/#{ref}", warn: warn)) + return unless (loader = super("#{tap}/#{token}", warn: warn)) loader if loader.path.exist? end