diff --git a/Library/Homebrew/compat.rb b/Library/Homebrew/compat.rb index 7c444615b2..b860f73d03 100644 --- a/Library/Homebrew/compat.rb +++ b/Library/Homebrew/compat.rb @@ -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" diff --git a/Library/Homebrew/compat/requirements/x11_requirement.rb b/Library/Homebrew/compat/requirements/x11_requirement.rb new file mode 100644 index 0000000000..bad1f2c73c --- /dev/null +++ b/Library/Homebrew/compat/requirements/x11_requirement.rb @@ -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 diff --git a/Library/Homebrew/compat/requirements/xcode_requirement.rb b/Library/Homebrew/compat/requirements/xcode_requirement.rb new file mode 100644 index 0000000000..1ceebd2e05 --- /dev/null +++ b/Library/Homebrew/compat/requirements/xcode_requirement.rb @@ -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 diff --git a/Library/Homebrew/dependency_collector.rb b/Library/Homebrew/dependency_collector.rb index 9f22429ca5..b1fb6e4f92 100644 --- a/Library/Homebrew/dependency_collector.rb +++ b/Library/Homebrew/dependency_collector.rb @@ -116,15 +116,17 @@ 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 :linux then LinuxRequirement.new(tags) - when :macos then MacOSRequirement.new(tags) - when :arch then ArchRequirement.new(tags) - when :java then JavaRequirement.new(tags) - when :osxfuse then OsxfuseRequirement.new(tags) - when :tuntap then TuntapRequirement.new(tags) - when :ld64 then ld64_dep_if_needed(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 :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}" end diff --git a/Library/Homebrew/extend/os/mac/requirements/non_binary_osxfuse_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/non_binary_osxfuse_requirement.rb deleted file mode 100644 index 39d638cf88..0000000000 --- a/Library/Homebrew/extend/os/mac/requirements/non_binary_osxfuse_requirement.rb +++ /dev/null @@ -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 diff --git a/Library/Homebrew/extend/os/requirements/non_binary_osxfuse_requirement.rb b/Library/Homebrew/extend/os/requirements/non_binary_osxfuse_requirement.rb deleted file mode 100644 index 099f29382c..0000000000 --- a/Library/Homebrew/extend/os/requirements/non_binary_osxfuse_requirement.rb +++ /dev/null @@ -1,3 +0,0 @@ -if OS.mac? - require "extend/os/mac/requirements/non_binary_osxfuse_requirement" -end diff --git a/Library/Homebrew/requirements.rb b/Library/Homebrew/requirements.rb index 6128db5163..0173017e87 100644 --- a/Library/Homebrew/requirements.rb +++ b/Library/Homebrew/requirements.rb @@ -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" diff --git a/Library/Homebrew/requirements/arch_requirement.rb b/Library/Homebrew/requirements/arch_requirement.rb index 0ff52dfa82..0fff93a9ef 100644 --- a/Library/Homebrew/requirements/arch_requirement.rb +++ b/Library/Homebrew/requirements/arch_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/codesign_requirement.rb b/Library/Homebrew/requirements/codesign_requirement.rb new file mode 100644 index 0000000000..ed6c6988e8 --- /dev/null +++ b/Library/Homebrew/requirements/codesign_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index fce7f57dbd..9c6062f0a3 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/macos_requirement.rb b/Library/Homebrew/requirements/macos_requirement.rb index 37c53cf108..7f40d37fed 100644 --- a/Library/Homebrew/requirements/macos_requirement.rb +++ b/Library/Homebrew/requirements/macos_requirement.rb @@ -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? diff --git a/Library/Homebrew/requirements/maximum_macos_requirement.rb b/Library/Homebrew/requirements/maximum_macos_requirement.rb index 9a8851390f..4dd7fd73d5 100644 --- a/Library/Homebrew/requirements/maximum_macos_requirement.rb +++ b/Library/Homebrew/requirements/maximum_macos_requirement.rb @@ -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 } diff --git a/Library/Homebrew/requirements/non_binary_osxfuse_requirement.rb b/Library/Homebrew/requirements/non_binary_osxfuse_requirement.rb deleted file mode 100644 index bb7788f487..0000000000 --- a/Library/Homebrew/requirements/non_binary_osxfuse_requirement.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "requirement" - -class NonBinaryOsxfuseRequirement < Requirement - fatal false -end - -require "extend/os/requirements/non_binary_osxfuse_requirement" diff --git a/Library/Homebrew/requirements/unsigned_kext_requirement.rb b/Library/Homebrew/requirements/unsigned_kext_requirement.rb deleted file mode 100644 index b58a20ea6c..0000000000 --- a/Library/Homebrew/requirements/unsigned_kext_requirement.rb +++ /dev/null @@ -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 diff --git a/Library/Homebrew/requirements/x11_requirement.rb b/Library/Homebrew/requirements/x11_requirement.rb index b7de5a2848..539d374804 100644 --- a/Library/Homebrew/requirements/x11_requirement.rb +++ b/Library/Homebrew/requirements/x11_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/xcode_requirement.rb b/Library/Homebrew/requirements/xcode_requirement.rb index ac6744e2a5..2cafe29d50 100644 --- a/Library/Homebrew/requirements/xcode_requirement.rb +++ b/Library/Homebrew/requirements/xcode_requirement.rb @@ -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 diff --git a/Library/Homebrew/test/dependency_collector_spec.rb b/Library/Homebrew/test/dependency_collector_spec.rb index a09d51eacc..37ee477b75 100644 --- a/Library/Homebrew/test/dependency_collector_spec.rb +++ b/Library/Homebrew/test/dependency_collector_spec.rb @@ -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 diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index 060315fb03..3d4cb84cdf 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -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]) diff --git a/Library/Homebrew/test/java_requirement_spec.rb b/Library/Homebrew/test/java_requirement_spec.rb index b47593ab12..859c2d9fbb 100644 --- a/Library/Homebrew/test/java_requirement_spec.rb +++ b/Library/Homebrew/test/java_requirement_spec.rb @@ -14,7 +14,7 @@ describe JavaRequirement do describe "#inspect" do subject { described_class.new(%w[1.7+]) } - its(:inspect) { is_expected.to eq('#') } + its(:inspect) { is_expected.to eq('#') } end describe "#display_s" do diff --git a/Library/Homebrew/test/requirements/codesign_requirement_spec.rb b/Library/Homebrew/test/requirements/codesign_requirement_spec.rb new file mode 100644 index 0000000000..5940c6d6f5 --- /dev/null +++ b/Library/Homebrew/test/requirements/codesign_requirement_spec.rb @@ -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 diff --git a/Library/Homebrew/test/requirements/non_binary_osxfuse_requirement_spec.rb b/Library/Homebrew/test/requirements/non_binary_osxfuse_requirement_spec.rb deleted file mode 100644 index 84fb448740..0000000000 --- a/Library/Homebrew/test/requirements/non_binary_osxfuse_requirement_spec.rb +++ /dev/null @@ -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 diff --git a/Library/Homebrew/test/requirements_spec.rb b/Library/Homebrew/test/requirements_spec.rb index 3111a7c9c9..a4c9af3ad9 100644 --- a/Library/Homebrew/test/requirements_spec.rb +++ b/Library/Homebrew/test/requirements_spec.rb @@ -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 diff --git a/Library/Homebrew/test/x11_requirement_spec.rb b/Library/Homebrew/test/x11_requirement_spec.rb index ef50fdc761..342394bb34 100644 --- a/Library/Homebrew/test/x11_requirement_spec.rb +++ b/Library/Homebrew/test/x11_requirement_spec.rb @@ -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