diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 9d621eb8f6425..8fd5697067a43 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -912,7 +912,7 @@ def self.tap_formula_name_path(tapped_name, warn:) new_tap = Tap.fetch new_tap_name new_tap.ensure_installed! new_tapped_name = "#{new_tap_name}/#{name}" - name, path = Formulary.tap_formula_name_path(new_tapped_name, warn: false) + name, path, tap = Formulary.tap_formula_name_path(new_tapped_name, warn: false) old_name = tapped_name new_name = new_tap.core_tap? ? name : new_tapped_name end @@ -926,7 +926,7 @@ def self.tap_formula_name_path(tapped_name, warn:) def self.tap_loader_for(tapped_name, warn:) name, path, tap = Formulary.tap_formula_name_path(tapped_name, warn: warn) - if name.exclude?("/") && !Homebrew::EnvConfig.no_install_from_api? && + if tap.core_tap? && !Homebrew::EnvConfig.no_install_from_api? && Homebrew::API::Formula.all_formulae.key?(name) FormulaAPILoader.new(name) else diff --git a/Library/Homebrew/test/formulary_spec.rb b/Library/Homebrew/test/formulary_spec.rb index 7c237cc4b429b..9dfe65d4c3d1f 100644 --- a/Library/Homebrew/test/formulary_spec.rb +++ b/Library/Homebrew/test/formulary_spec.rb @@ -186,6 +186,48 @@ class Wrong#{described_class.class_s(formula_name)} < Formula end end + context "when migrating from a Tap" do + let(:tap) { Tap.new("homebrew", "foo") } + let(:another_tap) { Tap.new("homebrew", "bar") } + let(:tap_migrations_path) { tap.path/"tap_migrations.json" } + let(:another_tap_formula_path) { another_tap.path/"Formula/#{formula_name}.rb" } + + before do + tap.path.mkpath + another_tap_formula_path.dirname.mkpath + another_tap_formula_path.write formula_content + end + + after do + FileUtils.rm_rf tap.path + FileUtils.rm_rf another_tap.path + end + + it "returns a Formula that has gone through a tap migration into homebrew/core" do + tap_migrations_path.write <<~EOS + { + "#{formula_name}": "homebrew/core" + } + EOS + formula = described_class.factory("#{tap}/#{formula_name}") + expect(formula).to be_a(Formula) + expect(formula.tap).to eq(CoreTap.instance) + expect(formula.path).to eq(formula_path) + end + + it "returns a Formula that has gone through a tap migration into another tap" do + tap_migrations_path.write <<~EOS + { + "#{formula_name}": "#{another_tap}" + } + EOS + formula = described_class.factory("#{tap}/#{formula_name}") + expect(formula).to be_a(Formula) + expect(formula.tap).to eq(another_tap) + expect(formula.path).to eq(another_tap_formula_path) + end + end + context "when loading from Tap" do let(:tap) { Tap.new("homebrew", "foo") } let(:another_tap) { Tap.new("homebrew", "bar") }