From 71d51faa55085df918cb891c977980a723151233 Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Mon, 19 Jun 2023 06:06:15 +0100 Subject: [PATCH] Introduce tag for implicit dependencies --- Library/Homebrew/cmd/deps.rb | 1 + Library/Homebrew/dependable.rb | 6 +++- Library/Homebrew/dependency.rb | 15 ++++++--- Library/Homebrew/dependency_collector.rb | 32 ++++++++++--------- .../extend/os/linux/dependency_collector.rb | 4 +-- .../extend/os/mac/dependency_collector.rb | 4 +-- .../test/dependency_collector_spec.rb | 12 +++---- .../os/linux/dependency_collector_spec.rb | 6 ++-- .../test/os/mac/dependency_collector_spec.rb | 2 +- 9 files changed, 47 insertions(+), 35 deletions(-) diff --git a/Library/Homebrew/cmd/deps.rb b/Library/Homebrew/cmd/deps.rb index 09736b135d..ab840001b5 100644 --- a/Library/Homebrew/cmd/deps.rb +++ b/Library/Homebrew/cmd/deps.rb @@ -191,6 +191,7 @@ module Homebrew str = "#{str} [test]" if dep.test? str = "#{str} [optional]" if dep.optional? str = "#{str} [recommended]" if dep.recommended? + str = "#{str} [implicit]" if dep.implicit? end str diff --git a/Library/Homebrew/dependable.rb b/Library/Homebrew/dependable.rb index bbea4446db..516cfa2e32 100644 --- a/Library/Homebrew/dependable.rb +++ b/Library/Homebrew/dependable.rb @@ -9,7 +9,7 @@ require "options" module Dependable # `:run` and `:linked` are no longer used but keep them here to avoid their # misuse in future. - RESERVED_TAGS = [:build, :optional, :recommended, :run, :test, :linked].freeze + RESERVED_TAGS = [:build, :optional, :recommended, :run, :test, :linked, :implicit].freeze attr_reader :tags @@ -29,6 +29,10 @@ module Dependable tags.include? :test end + def implicit? + tags.include? :implicit + end + def required? !build? && !test? && !optional? && !recommended? end diff --git a/Library/Homebrew/dependency.rb b/Library/Homebrew/dependency.rb index 55bd655125..d85303b492 100644 --- a/Library/Homebrew/dependency.rb +++ b/Library/Homebrew/dependency.rb @@ -180,7 +180,12 @@ class Dependency option_names = deps.flat_map(&:option_names).uniq kwargs = {} kwargs[:bounds] = dep.bounds if dep.uses_from_macos? - dep.class.new(name, tags, dep.env_proc, option_names, **kwargs) + # TODO: simpify to just **kwargs when we require Ruby >= 2.7 + if kwargs.empty? + dep.class.new(name, tags, dep.env_proc, option_names) + else + dep.class.new(name, tags, dep.env_proc, option_names, **kwargs) + end end end @@ -208,10 +213,10 @@ class Dependency end def merge_temporality(deps) - # Means both build and runtime dependency. - return [] unless deps.all?(&:build?) - - [:build] + new_tags = [] + new_tags << :build if deps.all?(&:build?) + new_tags << :implicit if deps.all?(&:implicit?) + new_tags end end end diff --git a/Library/Homebrew/dependency_collector.rb b/Library/Homebrew/dependency_collector.rb index 6288462cb3..6a1021ef57 100644 --- a/Library/Homebrew/dependency_collector.rb +++ b/Library/Homebrew/dependency_collector.rb @@ -84,37 +84,37 @@ class DependencyCollector def git_dep_if_needed(tags) return if Utils::Git.available? - Dependency.new("git", tags) + Dependency.new("git", [*tags, :implicit]) end def curl_dep_if_needed(tags) - Dependency.new("curl", tags) + Dependency.new("curl", [*tags, :implicit]) end def subversion_dep_if_needed(tags) return if Utils::Svn.available? - Dependency.new("subversion", tags) + Dependency.new("subversion", [*tags, :implicit]) end def cvs_dep_if_needed(tags) - Dependency.new("cvs", tags) unless which("cvs") + Dependency.new("cvs", [*tags, :implicit]) unless which("cvs") end def xz_dep_if_needed(tags) - Dependency.new("xz", tags) unless which("xz") + Dependency.new("xz", [*tags, :implicit]) unless which("xz") end def zstd_dep_if_needed(tags) - Dependency.new("zstd", tags) unless which("zstd") + Dependency.new("zstd", [*tags, :implicit]) unless which("zstd") end def unzip_dep_if_needed(tags) - Dependency.new("unzip", tags) unless which("unzip") + Dependency.new("unzip", [*tags, :implicit]) unless which("unzip") end def bzip2_dep_if_needed(tags) - Dependency.new("bzip2", tags) unless which("bzip2") + Dependency.new("bzip2", [*tags, :implicit]) unless which("bzip2") end def self.tar_needs_xz_dependency? @@ -127,6 +127,8 @@ class DependencyCollector def init_global_dep_tree_if_needed!; end def parse_spec(spec, tags) + raise ArgumentError, "Implicit dependencies cannot be manually specified" if tags.include?(:implicit) + case spec when String parse_string_spec(spec, tags) @@ -184,11 +186,11 @@ class DependencyCollector elsif strategy <= SubversionDownloadStrategy subversion_dep_if_needed(tags) elsif strategy <= MercurialDownloadStrategy - Dependency.new("mercurial", tags) + Dependency.new("mercurial", [*tags, :implicit]) elsif strategy <= FossilDownloadStrategy - Dependency.new("fossil", tags) + Dependency.new("fossil", [*tags, :implicit]) elsif strategy <= BazaarDownloadStrategy - Dependency.new("breezy", tags) + Dependency.new("breezy", [*tags, :implicit]) elsif strategy <= CVSDownloadStrategy cvs_dep_if_needed(tags) elsif strategy < AbstractDownloadStrategy @@ -204,10 +206,10 @@ class DependencyCollector when ".zst" then zstd_dep_if_needed(tags) when ".zip" then unzip_dep_if_needed(tags) when ".bz2" then bzip2_dep_if_needed(tags) - when ".lha", ".lzh" then Dependency.new("lha", tags) - when ".lz" then Dependency.new("lzip", tags) - when ".rar" then Dependency.new("libarchive", tags) - when ".7z" then Dependency.new("p7zip", tags) + when ".lha", ".lzh" then Dependency.new("lha", [*tags, :implicit]) + when ".lz" then Dependency.new("lzip", [*tags, :implicit]) + when ".rar" then Dependency.new("libarchive", [*tags, :implicit]) + when ".7z" then Dependency.new("p7zip", [*tags, :implicit]) end end end diff --git a/Library/Homebrew/extend/os/linux/dependency_collector.rb b/Library/Homebrew/extend/os/linux/dependency_collector.rb index e049afcaf6..2e0952b4bc 100644 --- a/Library/Homebrew/extend/os/linux/dependency_collector.rb +++ b/Library/Homebrew/extend/os/linux/dependency_collector.rb @@ -17,7 +17,7 @@ class DependencyCollector return if global_dep_tree[GCC]&.intersect?(related_formula_names) return unless formula_for(GCC) - Dependency.new(GCC) + Dependency.new(GCC, [:implicit]) end sig { params(related_formula_names: T::Set[String]).returns(T.nilable(Dependency)) } @@ -28,7 +28,7 @@ class DependencyCollector return if global_dep_tree[GLIBC]&.intersect?(related_formula_names) return unless formula_for(GLIBC) - Dependency.new(GLIBC) + Dependency.new(GLIBC, [:implicit]) end private diff --git a/Library/Homebrew/extend/os/mac/dependency_collector.rb b/Library/Homebrew/extend/os/mac/dependency_collector.rb index 9387bbe50f..6f97069e70 100644 --- a/Library/Homebrew/extend/os/mac/dependency_collector.rb +++ b/Library/Homebrew/extend/os/mac/dependency_collector.rb @@ -8,11 +8,11 @@ class DependencyCollector def git_dep_if_needed(tags); end def subversion_dep_if_needed(tags) - Dependency.new("subversion", tags) + Dependency.new("subversion", [*tags, :implicit]) end def cvs_dep_if_needed(tags) - Dependency.new("cvs", tags) + Dependency.new("cvs", [*tags, :implicit]) end def xz_dep_if_needed(tags); end diff --git a/Library/Homebrew/test/dependency_collector_spec.rb b/Library/Homebrew/test/dependency_collector_spec.rb index 672812277c..1af0d4f05f 100644 --- a/Library/Homebrew/test/dependency_collector_spec.rb +++ b/Library/Homebrew/test/dependency_collector_spec.rb @@ -52,13 +52,13 @@ describe DependencyCollector do it "creates a resource dependency from a CVS URL" do resource = Resource.new resource.url(":pserver:anonymous:@brew.sh:/cvsroot/foo/bar", using: :cvs) - expect(collector.add(resource)).to eq(Dependency.new("cvs", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("cvs", [:build, :test, :implicit])) end it "creates a resource dependency from a '.7z' URL" do resource = Resource.new resource.url("https://brew.sh/foo.7z") - expect(collector.add(resource)).to eq(Dependency.new("p7zip", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("p7zip", [:build, :test, :implicit])) end it "creates a resource dependency from a '.gz' URL" do @@ -70,25 +70,25 @@ describe DependencyCollector do it "creates a resource dependency from a '.lz' URL" do resource = Resource.new resource.url("https://brew.sh/foo.lz") - expect(collector.add(resource)).to eq(Dependency.new("lzip", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("lzip", [:build, :test, :implicit])) end it "creates a resource dependency from a '.lha' URL" do resource = Resource.new resource.url("https://brew.sh/foo.lha") - expect(collector.add(resource)).to eq(Dependency.new("lha", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("lha", [:build, :test, :implicit])) end it "creates a resource dependency from a '.lzh' URL" do resource = Resource.new resource.url("https://brew.sh/foo.lzh") - expect(collector.add(resource)).to eq(Dependency.new("lha", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("lha", [:build, :test, :implicit])) end it "creates a resource dependency from a '.rar' URL" do resource = Resource.new resource.url("https://brew.sh/foo.rar") - expect(collector.add(resource)).to eq(Dependency.new("libarchive", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("libarchive", [:build, :test, :implicit])) end it "raises a TypeError for unknown classes" do diff --git a/Library/Homebrew/test/os/linux/dependency_collector_spec.rb b/Library/Homebrew/test/os/linux/dependency_collector_spec.rb index b213e77e6c..15a149abe4 100644 --- a/Library/Homebrew/test/os/linux/dependency_collector_spec.rb +++ b/Library/Homebrew/test/os/linux/dependency_collector_spec.rb @@ -14,19 +14,19 @@ describe DependencyCollector do it "creates a resource dependency from a '.xz' URL" do resource.url("https://brew.sh/foo.xz") allow_any_instance_of(Object).to receive(:which).with("xz") - expect(collector.add(resource)).to eq(Dependency.new("xz", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("xz", [:build, :test, :implicit])) end it "creates a resource dependency from a '.zip' URL" do resource.url("https://brew.sh/foo.zip") allow_any_instance_of(Object).to receive(:which).with("unzip") - expect(collector.add(resource)).to eq(Dependency.new("unzip", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("unzip", [:build, :test, :implicit])) end it "creates a resource dependency from a '.bz2' URL" do resource.url("https://brew.sh/foo.tar.bz2") allow_any_instance_of(Object).to receive(:which).with("bzip2") - expect(collector.add(resource)).to eq(Dependency.new("bzip2", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("bzip2", [:build, :test, :implicit])) end end diff --git a/Library/Homebrew/test/os/mac/dependency_collector_spec.rb b/Library/Homebrew/test/os/mac/dependency_collector_spec.rb index fe0af3a0a4..db369ac998 100644 --- a/Library/Homebrew/test/os/mac/dependency_collector_spec.rb +++ b/Library/Homebrew/test/os/mac/dependency_collector_spec.rb @@ -34,6 +34,6 @@ describe DependencyCollector do specify "Resource dependency from a Subversion URL" do resource = Resource.new resource.url("svn://brew.sh/foo/bar") - expect(collector.add(resource)).to eq(Dependency.new("subversion", [:build, :test])) + expect(collector.add(resource)).to eq(Dependency.new("subversion", [:build, :test, :implicit])) end end