From 8b04bcb9944d2675a31acf73fe1c1a3879fdad73 Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Wed, 16 Jun 2021 10:27:15 -0400 Subject: [PATCH] Only allow mapping with environment variable Co-authored-by: Mike McQuaid --- Library/Homebrew/formulary.rb | 32 +++++++++++++++---------- Library/Homebrew/test/formulary_spec.rb | 10 ++++++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index e7deac7174..867d7237ee 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -395,7 +395,11 @@ module Formulary ) raise ArgumentError, "Formulae must have a ref!" unless ref - ref = @name_mappings[ref] if @name_mappings.present? && @name_mappings.key?(ref) + if ENV["HOMEBREW_BOTTLE_JSON"].present? && + @formula_name_local_bottle_path_map.present? && + @formula_name_local_bottle_path_map.key?(ref) + ref = @formula_name_local_bottle_path_map[ref] + end cache_key = "#{ref}-#{spec}-#{alias_path}-#{from}" if factory_cached? && cache[:formulary_factory] && @@ -413,18 +417,22 @@ module Formulary formula end - # Map a formula name to a bottle archive. This mapping will be used by {Formulary::factory} - # to allow formulae to be loaded automatically from their bottle archive without - # needing to exist in a tap or be passed as a complete filepath. For example, - # to map `foo` to the `hello` formula from its bottle archive: - #
Formulary.map_name_to_bottle "foo", HOMEBREW_CACHE/"hello--2.10"
-  # Formulary.factory "foo" # returns the hello formula from the bottle archive
+  # Map a formula name to a local/fetched bottle archive. This mapping will be used by {Formulary::factory}
+  # to allow formulae to be loaded automatically from their local bottle archive without
+  # needing to exist in a tap or be passed as a complete path. For example,
+  # to map `hello` from its bottle archive:
+  # 
Formulary.map_formula_name_to_local_bottle_path "hello", HOMEBREW_CACHE/"hello--2.10"
+  # Formulary.factory "hello" # returns the hello formula from the local bottle archive
   # 
- # @param name the string to map. - # @param bottle a path pointing to the target bottle archive. - def self.map_name_to_bottle(name, bottle) - @name_mappings ||= {} - @name_mappings[name] = Pathname(bottle).realpath + # @param formula_name the formula name string to map. + # @param local_bottle_path a path pointing to the target bottle archive. + def self.map_formula_name_to_local_bottle_path(formula_name, local_bottle_path) + if ENV["HOMEBREW_BOTTLE_JSON"].blank? + raise UsageError, "HOMEBREW_BOTTLE_JSON not set but required for #{__method__}!" + end + + @formula_name_local_bottle_path_map ||= {} + @formula_name_local_bottle_path_map[formula_name] = Pathname(local_bottle_path).realpath end # Return a {Formula} instance for the given rack. diff --git a/Library/Homebrew/test/formulary_spec.rb b/Library/Homebrew/test/formulary_spec.rb index e9f750a4b9..c98916820a 100644 --- a/Library/Homebrew/test/formulary_spec.rb +++ b/Library/Homebrew/test/formulary_spec.rb @@ -205,7 +205,7 @@ describe Formulary do end end - describe "::map_name_to_bottle" do + describe "::map_formula_name_to_local_bottle_path" do before do formula_path.dirname.mkpath formula_path.write formula_content @@ -216,7 +216,13 @@ describe Formulary do described_class.factory("formula-to-map") }.to raise_error(FormulaUnavailableError) - described_class.map_name_to_bottle "formula-to-map", formula_path + ENV["HOMEBREW_BOTTLE_JSON"] = nil + expect { + described_class.map_formula_name_to_local_bottle_path "formula-to-map", formula_path + }.to raise_error(UsageError, /HOMEBREW_BOTTLE_JSON not set/) + + ENV["HOMEBREW_BOTTLE_JSON"] = "1" + described_class.map_formula_name_to_local_bottle_path "formula-to-map", formula_path expect(described_class.factory("formula-to-map")).to be_kind_of(Formula) end