formula_installer: avoid irrelevant build deps.

If dependents are already installed ensure their build dependencies (and
requirements) don't end up in the dependency/requirement tree.

Fixes #3033.
This commit is contained in:
Mike McQuaid 2017-12-07 14:56:12 +00:00
parent 286d74eec2
commit b9cf7b2bbc
2 changed files with 20 additions and 3 deletions

View File

@ -417,8 +417,9 @@ class FormulaInstaller
raise UnsatisfiedRequirements, fatals raise UnsatisfiedRequirements, fatals
end end
def install_requirement_formula?(req_dependency, req, install_bottle_for_dependent) def install_requirement_formula?(req_dependency, req, dependent, install_bottle_for_dependent)
return false unless req_dependency return false unless req_dependency
return false if req.build? && dependent.installed?
return true unless req.satisfied? return true unless req.satisfied?
return false if req.run? return false if req.run?
return true if build_bottle? return true if build_bottle?
@ -451,7 +452,7 @@ class FormulaInstaller
Requirement.prune Requirement.prune
elsif req.build? && use_default_formula && req_dependency.installed? elsif req.build? && use_default_formula && req_dependency.installed?
Requirement.prune Requirement.prune
elsif install_requirement_formula?(req_dependency, req, install_bottle_for_dependent) elsif install_requirement_formula?(req_dependency, req, dependent, install_bottle_for_dependent)
deps.unshift(req_dependency) deps.unshift(req_dependency)
formulae.unshift(req_dependency.to_formula) formulae.unshift(req_dependency.to_formula)
Requirement.prune Requirement.prune
@ -485,6 +486,8 @@ class FormulaInstaller
Dependency.prune Dependency.prune
elsif dep.build? && install_bottle_for?(dependent, build) elsif dep.build? && install_bottle_for?(dependent, build)
Dependency.prune Dependency.prune
elsif dep.build? && dependent.installed?
Dependency.prune
elsif dep.satisfied?(inherited_options[dep.name]) elsif dep.satisfied?(inherited_options[dep.name])
Dependency.skip Dependency.skip
end end

View File

@ -140,19 +140,22 @@ describe FormulaInstaller do
@install_bottle_for_dependent = false @install_bottle_for_dependent = false
allow(@requirement).to receive(:satisfied?).and_return(satisfied?) allow(@requirement).to receive(:satisfied?).and_return(satisfied?)
allow(@requirement).to receive(:satisfied_by_formula?).and_return(satisfied_by_formula?) allow(@requirement).to receive(:satisfied_by_formula?).and_return(satisfied_by_formula?)
allow(@requirement).to receive(:build?).and_return(build?)
@dependent = formula do @dependent = formula do
url "foo" url "foo"
version "0.1" version "0.1"
depends_on :python3 depends_on :python3
end end
allow(@dependent).to receive(:installed?).and_return(installed?)
@fi = FormulaInstaller.new(@dependent) @fi = FormulaInstaller.new(@dependent)
end end
subject { @fi.install_requirement_formula?(@requirement_dependency, @requirement, @install_bottle_for_dependent) } subject { @fi.install_requirement_formula?(@requirement_dependency, @requirement, @dependent, @install_bottle_for_dependent) }
context "it returns false when requirement is satisfied" do context "it returns false when requirement is satisfied" do
let(:satisfied?) { true } let(:satisfied?) { true }
let(:satisfied_by_formula?) { false } let(:satisfied_by_formula?) { false }
let(:build?) { false }
let(:installed?) { false } let(:installed?) { false }
it { is_expected.to be false } it { is_expected.to be false }
end end
@ -160,6 +163,15 @@ describe FormulaInstaller do
context "it returns false when requirement is satisfied but default formula is installed" do context "it returns false when requirement is satisfied but default formula is installed" do
let(:satisfied?) { true } let(:satisfied?) { true }
let(:satisfied_by_formula?) { false } let(:satisfied_by_formula?) { false }
let(:build?) { false }
let(:installed?) { false }
it { is_expected.to be false }
end
context "it returns false when requirement is :build and dependent is installed" do
let(:satisfied?) { false }
let(:satisfied_by_formula?) { false }
let(:build?) { true }
let(:installed?) { true } let(:installed?) { true }
it { is_expected.to be false } it { is_expected.to be false }
end end
@ -167,6 +179,7 @@ describe FormulaInstaller do
context "it returns true when requirement isn't satisfied" do context "it returns true when requirement isn't satisfied" do
let(:satisfied?) { false } let(:satisfied?) { false }
let(:satisfied_by_formula?) { false } let(:satisfied_by_formula?) { false }
let(:build?) { false }
let(:installed?) { false } let(:installed?) { false }
it { is_expected.to be true } it { is_expected.to be true }
end end
@ -174,6 +187,7 @@ describe FormulaInstaller do
context "it returns true when requirement is satisfied by a formula" do context "it returns true when requirement is satisfied by a formula" do
let(:satisfied?) { true } let(:satisfied?) { true }
let(:satisfied_by_formula?) { true } let(:satisfied_by_formula?) { true }
let(:build?) { false }
let(:installed?) { false } let(:installed?) { false }
it { is_expected.to be true } it { is_expected.to be true }
end end