diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 0ca6a8033e..1e2aca4d43 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -141,6 +141,12 @@ module Formulary json_formula = json_formula.merge(json_formula["variations"][bottle_tag]) end + uses_from_macos_names = json_formula["uses_from_macos"].map do |dep| + next dep unless dep.is_a? Hash + + dep.keys.first + end + klass = Class.new(::Formula) do desc json_formula["desc"] homepage json_formula["homepage"] @@ -181,20 +187,18 @@ module Formulary disable! date: disable_date, because: reason end - json_formula["build_dependencies"].each do |dep| - depends_on dep => :build - end - json_formula["dependencies"].each do |dep| + next if uses_from_macos_names.include? dep + depends_on dep end - json_formula["recommended_dependencies"].each do |dep| - depends_on dep => :recommended - end + [:build, :recommended, :optional].each do |type| + json_formula["#{type}_dependencies"].each do |dep| + next if uses_from_macos_names.include? dep - json_formula["optional_dependencies"].each do |dep| - depends_on dep => :optional + depends_on dep => type + end end json_formula["uses_from_macos"].each do |dep| diff --git a/Library/Homebrew/test/formulary_spec.rb b/Library/Homebrew/test/formulary_spec.rb index 68eb82733e..b303cb3ec0 100644 --- a/Library/Homebrew/test/formulary_spec.rb +++ b/Library/Homebrew/test/formulary_spec.rb @@ -270,6 +270,16 @@ describe Formulary do } end + let(:linux_variations_json) do + { + "variations" => { + "x86_64_linux" => { + "dependencies" => ["dep", "uses_from_macos_dep"], + }, + }, + } + end + before do allow(described_class).to receive(:loader_for).and_return(described_class::FormulaAPILoader.new(formula_name)) end @@ -323,6 +333,16 @@ describe Formulary do expect(formula.deps.count).to eq 5 expect(formula.deps.map(&:name).include?("variations_dep")).to be true end + + it "returns a Formula without duplicated deps and uses_from_macos with variations on Linux", :needs_linux do + allow(Homebrew::API::Formula).to receive(:all_formulae).and_return formula_json_contents(linux_variations_json) + allow(Utils::Bottles).to receive(:tag).and_return(:arm64_monterey) + + formula = described_class.factory(formula_name) + expect(formula).to be_kind_of(Formula) + expect(formula.deps.count).to eq 5 + expect(formula.deps.map(&:name).include?("variations_dep")).to be true + end end end