Merge pull request #5101 from MikeMcQuaid/requirements_cleanup

Cleanup Requirements
This commit is contained in:
Mike McQuaid 2018-10-20 12:13:26 +01:00 committed by GitHub
commit 99749cbe9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 130 additions and 96 deletions

View File

@ -1,4 +1,6 @@
require "compat/os/mac"
require "compat/requirements/x11_requirement"
require "compat/requirements/xcode_requirement"
require "compat/dependable"
require "compat/dependency_collector"
require "compat/download_strategy"

View File

@ -0,0 +1,17 @@
require "requirement"
class X11Requirement < Requirement
module Compat
def initialize(tags = [])
if tags.first.to_s.match?(/(\d\.)+\d/)
# TODO: deprecate when Homebrew/homebrew-core is fixed.
# odeprecated('depends_on :x11 => "X.Y.Z"')
tags.shift
end
super(tags)
end
end
prepend Compat
end

View File

@ -0,0 +1,22 @@
require "requirement"
class XcodeRequirement < Requirement
module Compat
def initialize(tags = [])
@version = if tags.first.to_s.match?(/(\d\.)+\d/)
tags.shift
else
tags.find do |tag|
next unless tag.to_s.match?(/(\d\.)+\d/)
# TODO: deprecate when Homebrew/homebrew-core is fixed.
# odeprecated('depends_on :xcode => [..., "X.Y.Z"]')
tags.delete(tag)
end
end
super(tags)
end
end
prepend Compat
end

View File

@ -116,14 +116,16 @@ class DependencyCollector
def parse_symbol_spec(spec, tags)
case spec
when :x11 then X11Requirement.new(spec.to_s, tags)
when :xcode then XcodeRequirement.new(tags)
when :arch then ArchRequirement.new(tags)
when :codesign then CodesignRequirement.new(tags)
when :java then JavaRequirement.new(tags)
when :linux then LinuxRequirement.new(tags)
when :macos then MacOSRequirement.new(tags)
when :arch then ArchRequirement.new(tags)
when :java then JavaRequirement.new(tags)
when :maximum_macos then MaximumMacOSRequirement.new(tags)
when :osxfuse then OsxfuseRequirement.new(tags)
when :tuntap then TuntapRequirement.new(tags)
when :x11 then X11Requirement.new(tags)
when :xcode then XcodeRequirement.new(tags)
when :ld64 then ld64_dep_if_needed(tags)
else
raise ArgumentError, "Unsupported special dependency #{spec.inspect}"

View File

@ -1,15 +0,0 @@
require "requirement"
class NonBinaryOsxfuseRequirement < Requirement
fatal true
satisfy(build_env: false) do
HOMEBREW_PREFIX.to_s != "/usr/local" || !OsxfuseRequirement.binary_osxfuse_installed?
end
def message
<<~EOS
osxfuse is already installed from the binary distribution and
conflicts with this formula.
EOS
end
end

View File

@ -1,3 +0,0 @@
if OS.mac?
require "extend/os/mac/requirements/non_binary_osxfuse_requirement"
end

View File

@ -1,11 +1,11 @@
require "requirement"
require "requirements/arch_requirement"
require "requirements/codesign_requirement"
require "requirements/java_requirement"
require "requirements/linux_requirement"
require "requirements/macos_requirement"
require "requirements/maximum_macos_requirement"
require "requirements/osxfuse_requirement"
require "requirements/java_requirement"
require "requirements/tuntap_requirement"
require "requirements/unsigned_kext_requirement"
require "requirements/x11_requirement"
require "requirements/arch_requirement"
require "requirements/xcode_requirement"

View File

@ -3,9 +3,9 @@ require "requirement"
class ArchRequirement < Requirement
fatal true
def initialize(arch)
@arch = arch.pop
super
def initialize(tags)
@arch = tags.shift
super(tags)
end
satisfy(build_env: false) do

View File

@ -0,0 +1,32 @@
class CodesignRequirement < Requirement
fatal true
def initialize(tags)
options = tags.shift
unless options.is_a?(Hash)
raise ArgumentError("CodesignRequirement requires an options Hash!")
end
unless options.key?(:identity)
raise ArgumentError("CodesignRequirement requires an identity key!")
end
@identity = options.fetch(:identity)
@with = options.fetch(:with, "code signing")
@url = options.fetch(:url, nil)
super(tags)
end
satisfy(build_env: false) do
mktemp do
FileUtils.cp "/usr/bin/false", "codesign_check"
quiet_system "/usr/bin/codesign", "-f", "-s", @identity,
"--dryrun", "codesign_check"
end
end
def message
message = "#{@identity} identity must be available to build with #{@with}"
message += ":\n#{@url}" if @url.present?
message
end
end

View File

@ -27,7 +27,7 @@ class JavaRequirement < Requirement
def initialize(tags = [])
@version = tags.shift if /(\d+\.)+\d/ =~ tags.first
super
super(tags)
end
def message
@ -39,7 +39,7 @@ class JavaRequirement < Requirement
end
def inspect
"#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>"
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>"
end
def display_s

View File

@ -4,8 +4,8 @@ class MacOSRequirement < Requirement
fatal true
def initialize(tags = [])
@version = MacOS::Version.from_symbol(tags.first) unless tags.empty?
super
@version = MacOS::Version.from_symbol(tags.shift) unless tags.empty?
super(tags)
end
def minimum_version_specified?

View File

@ -4,8 +4,8 @@ class MaximumMacOSRequirement < Requirement
fatal true
def initialize(tags)
@version = MacOS::Version.from_symbol(tags.first)
super
@version = MacOS::Version.from_symbol(tags.shift)
super(tags)
end
satisfy(build_env: false) { MacOS.version <= @version }

View File

@ -1,7 +0,0 @@
require "requirement"
class NonBinaryOsxfuseRequirement < Requirement
fatal false
end
require "extend/os/requirements/non_binary_osxfuse_requirement"

View File

@ -1,16 +0,0 @@
require "requirement"
class UnsignedKextRequirement < Requirement
fatal true
satisfy(build_env: false) { MacOS.version < :yosemite }
def message
s = <<~EOS
Building this formula from source isn't possible due to OS X
Yosemite (10.10) and above's strict unsigned kext ban.
EOS
s += super
s
end
end

View File

@ -10,13 +10,6 @@ class X11Requirement < Requirement
env { ENV.x11 }
def initialize(name = "x11", tags = [])
@name = name
# no-op on version specified as a tag argument
tags.shift if /(\d\.)+\d/ =~ tags.first
super(tags)
end
def min_version
"1.12.2"
end
@ -51,7 +44,7 @@ class X11Requirement < Requirement
end
def inspect
"#<#{self.class.name}: #{name.inspect} #{tags.inspect}>"
"#<#{self.class.name}: #{tags.inspect}>"
end
end

View File

@ -6,8 +6,8 @@ class XcodeRequirement < Requirement
satisfy(build_env: false) { xcode_installed_version }
def initialize(tags = [])
@version = tags.find { |tag| tags.delete(tag) if tag =~ /(\d\.)+\d/ }
super
@version = tags.shift if tags.first.to_s.match?(/(\d\.)+\d/)
super(tags)
end
def xcode_installed_version
@ -40,6 +40,6 @@ class XcodeRequirement < Requirement
end
def inspect
"#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>"
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>"
end
end

View File

@ -38,7 +38,7 @@ describe DependencyCollector do
end
specify "requirement tags" do
subject.add x11: "2.5.1"
subject.add :x11
subject.add xcode: :build
expect(find_requirement(X11Requirement).tags).to be_empty
expect(find_requirement(XcodeRequirement)).to be_a_build_requirement

View File

@ -798,7 +798,7 @@ describe Formula do
stub_formula_loader(f1)
java = JavaRequirement.new
x11 = X11Requirement.new("x11", [:recommended])
x11 = X11Requirement.new([:recommended])
xcode = XcodeRequirement.new(["1.0", :optional])
expect(Set.new(f1.recursive_requirements)).to eq(Set[java, x11])

View File

@ -14,7 +14,7 @@ describe JavaRequirement do
describe "#inspect" do
subject { described_class.new(%w[1.7+]) }
its(:inspect) { is_expected.to eq('#<JavaRequirement: "java" [] version="1.7+">') }
its(:inspect) { is_expected.to eq('#<JavaRequirement: [] version="1.7+">') }
end
describe "#display_s" do

View File

@ -0,0 +1,21 @@
require "requirements/codesign_requirement"
describe CodesignRequirement do
subject(:requirement) {
described_class.new([{ identity: identity, with: with, url: url }])
}
let(:identity) { "lldb_codesign" }
let(:with) { "LLDB" }
let(:url) {
"https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt"
}
describe "#message" do
it "includes all parameters" do
expect(requirement.message).to include(identity)
expect(requirement.message).to include(with)
expect(requirement.message).to include(url)
end
end
end

View File

@ -1,9 +0,0 @@
require "requirements/non_binary_osxfuse_requirement"
describe NonBinaryOsxfuseRequirement, :needs_macos do
subject { described_class.new([]) }
describe "#message" do
its(:message) { is_expected.to match("osxfuse is already installed from the binary distribution") }
end
end

View File

@ -14,13 +14,13 @@ describe Requirements do
end
it "prefers the larger requirement when merging duplicates" do
subject << X11Requirement.new << X11Requirement.new("x11", %w[2.6])
expect(subject.to_a).to eq([X11Requirement.new("x11", %w[2.6])])
subject << X11Requirement.new << X11Requirement.new(%w[2.6])
expect(subject.to_a).to eq([X11Requirement.new(%w[2.6])])
end
it "does not use the smaller requirement when merging duplicates" do
subject << X11Requirement.new("x11", %w[2.6]) << X11Requirement.new
expect(subject.to_a).to eq([X11Requirement.new("x11", %w[2.6])])
subject << X11Requirement.new(%w[2.6]) << X11Requirement.new
expect(subject.to_a).to eq([X11Requirement.new(%w[2.6])])
end
end
end

View File

@ -10,15 +10,10 @@ describe X11Requirement do
end
describe "#eql?" do
it "returns true if the names are equal" do
other = described_class.new(default_name)
it "returns true if the requirements are equal" do
other = described_class.new
expect(subject).to eql(other)
end
it "and returns false if the names differ" do
other = described_class.new("foo")
expect(subject).not_to eql(other)
end
end
describe "#modify_build_environment" do