From b58fa4ebb1e6b918d8556cba629cb55b79d423f5 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Wed, 10 Jun 2020 10:06:46 +0100 Subject: [PATCH] Drop Mavericks support. Companion to https://github.com/Homebrew/brew/pull/7698. Provide better, `odeprecated` messaging for `depends_on :macos => :mavericks` and otherwise just fix up the code that relied on `:mavericks`. --- Library/Homebrew/exceptions.rb | 9 +++++ .../extend/os/mac/formula_cellar_checks.rb | 4 --- .../Homebrew/extend/os/mac/utils/bottles.rb | 4 +-- Library/Homebrew/formula.rb | 8 ++--- Library/Homebrew/os/mac/version.rb | 5 +-- Library/Homebrew/os/mac/xcode.rb | 8 +---- .../requirements/macos_requirement.rb | 14 +++++--- Library/Homebrew/software_spec.rb | 2 +- .../test/os/mac/software_spec_spec.rb | 2 +- Library/Homebrew/test/os/mac/version_spec.rb | 34 +++++++++---------- .../requirements/macos_requirement_spec.rb | 4 +-- ...alid-depends-on-macos-conflicting-forms.rb | 16 +++++---- .../cask/Casks/with-depends-on-macos-array.rb | 14 ++++---- .../Casks/with-depends-on-macos-comparison.rb | 14 ++++---- .../Casks/with-depends-on-macos-failure.rb | 2 +- .../test/utils/bottles/bottles_spec.rb | 6 ++-- .../test/utils/bottles/collector_spec.rb | 26 +++++++------- docs/Formula-Cookbook.md | 2 +- 18 files changed, 91 insertions(+), 83 deletions(-) diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 6172f4fa9d..94bcc05245 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -612,3 +612,12 @@ class ChildProcessError < RuntimeError set_backtrace inner["b"] end end + +class MacOSVersionError < RuntimeError + attr_reader :version + + def initialize(version) + @version = version + super "unknown or unsupported macOS version: #{version.inspect}" + end +end diff --git a/Library/Homebrew/extend/os/mac/formula_cellar_checks.rb b/Library/Homebrew/extend/os/mac/formula_cellar_checks.rb index 975311ca78..60c9649408 100644 --- a/Library/Homebrew/extend/os/mac/formula_cellar_checks.rb +++ b/Library/Homebrew/extend/os/mac/formula_cellar_checks.rb @@ -10,10 +10,6 @@ module FormulaCellarChecks end return if formula.name&.match?(Version.formula_optionally_versioned_regex(:php)) - - return if MacOS.version < :mavericks && formula.name.start_with?("postgresql") - return if MacOS.version < :yosemite && formula.name.start_with?("memcached") - return if formula.keg_only? || !formula.include.directory? files = relative_glob(formula.include, "**/*.h") diff --git a/Library/Homebrew/extend/os/mac/utils/bottles.rb b/Library/Homebrew/extend/os/mac/utils/bottles.rb index b6c6bd3efe..08e4fb2611 100644 --- a/Library/Homebrew/extend/os/mac/utils/bottles.rb +++ b/Library/Homebrew/extend/os/mac/utils/bottles.rb @@ -30,13 +30,13 @@ module Utils def find_older_compatible_tag(tag) tag_version = begin MacOS::Version.from_symbol(tag) - rescue ArgumentError + rescue MacOSVersionError return end keys.find do |key| MacOS::Version.from_symbol(key) <= tag_version - rescue ArgumentError + rescue MacOSVersionError false end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index af04819838..2a37b445dc 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2327,9 +2327,9 @@ class Formula # prefix "/opt/homebrew" # Optional HOMEBREW_PREFIX in which the bottles were built. # cellar "/opt/homebrew/Cellar" # Optional HOMEBREW_CELLAR in which the bottles were built. # rebuild 1 # Making the old bottle outdated without bumping the version/revision of the formula. - # sha256 "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" => :el_capitan - # sha256 "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" => :yosemite - # sha256 "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" => :mavericks + # sha256 "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c" => :catalina + # sha256 "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f" => :mojave + # sha256 "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f" => :high_sierra # end # # Only formulae where the upstream URL breaks or moves frequently, require compiling @@ -2452,7 +2452,7 @@ class Formula #
# Optional and enforce that boost is built with `--with-c++11`.
     # depends_on "boost" => [:optional, "with-c++11"]
#
# If a dependency is only needed in certain cases:
-    # depends_on "sqlite" if MacOS.version == :mavericks
+    # depends_on "sqlite" if MacOS.version == :catalina
     # depends_on :xcode # If the formula really needs full Xcode.
     # depends_on :macos => :mojave # Needs at least macOS Mojave (10.14).
     # depends_on :x11 => :optional # X11/XQuartz components.
diff --git a/Library/Homebrew/os/mac/version.rb b/Library/Homebrew/os/mac/version.rb
index 07a2bb0c54..9fcfc926a1 100644
--- a/Library/Homebrew/os/mac/version.rb
+++ b/Library/Homebrew/os/mac/version.rb
@@ -12,13 +12,10 @@ module OS
         sierra:      "10.12",
         el_capitan:  "10.11",
         yosemite:    "10.10",
-        mavericks:   "10.9",
       }.freeze
 
       def self.from_symbol(sym)
-        str = SYMBOLS.fetch(sym) do
-          raise ArgumentError, "unknown version #{sym.inspect}"
-        end
+        str = SYMBOLS.fetch(sym) { raise MacOSVersionError, sym }
         new(str)
       end
 
diff --git a/Library/Homebrew/os/mac/xcode.rb b/Library/Homebrew/os/mac/xcode.rb
index 15ba578256..1ef83bff62 100644
--- a/Library/Homebrew/os/mac/xcode.rb
+++ b/Library/Homebrew/os/mac/xcode.rb
@@ -287,13 +287,7 @@ module OS
       end
 
       def detect_clang_version
-        path = if MacOS.version >= :mavericks
-          "#{PKG_PATH}/usr/bin/clang"
-        else
-          "/usr/bin/clang"
-        end
-
-        version_output = Utils.popen_read("#{path} --version")
+        version_output = Utils.popen_read("#{PKG_PATH}/usr/bin/clang --version")
         version_output[/clang-(\d+\.\d+\.\d+(\.\d+)?)/, 1]
       end
 
diff --git a/Library/Homebrew/requirements/macos_requirement.rb b/Library/Homebrew/requirements/macos_requirement.rb
index c8427dd767..194215d6ad 100644
--- a/Library/Homebrew/requirements/macos_requirement.rb
+++ b/Library/Homebrew/requirements/macos_requirement.rb
@@ -8,10 +8,16 @@ class MacOSRequirement < Requirement
   attr_reader :comparator, :version
 
   def initialize(tags = [], comparator: ">=")
-    if comparator == "==" && tags.first.respond_to?(:map)
-      @version = tags.shift.map { |s| MacOS::Version.from_symbol(s) }
-    else
-      @version = MacOS::Version.from_symbol(tags.shift) unless tags.empty?
+    begin
+      @version = if comparator == "==" && tags.first.respond_to?(:map)
+        tags.shift.map { |s| MacOS::Version.from_symbol(s) }
+      else
+        MacOS::Version.from_symbol(tags.shift) unless tags.empty?
+      end
+    rescue MacOSVersionError => e
+      raise if e.version != :mavericks
+
+      odeprecated "depends_on :macos => :mavericks"
     end
 
     @comparator = comparator
diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb
index 72da2a2da1..3635edd3df 100644
--- a/Library/Homebrew/software_spec.rb
+++ b/Library/Homebrew/software_spec.rb
@@ -386,7 +386,7 @@ class BottleSpecification
       # Sort non-MacOS tags below MacOS tags.
 
       OS::Mac::Version.from_symbol tag
-    rescue ArgumentError
+    rescue MacOSVersionError
       "0.#{tag}"
     end
     checksums = {}
diff --git a/Library/Homebrew/test/os/mac/software_spec_spec.rb b/Library/Homebrew/test/os/mac/software_spec_spec.rb
index aaacc7ce05..1d6501ed91 100644
--- a/Library/Homebrew/test/os/mac/software_spec_spec.rb
+++ b/Library/Homebrew/test/os/mac/software_spec_spec.rb
@@ -46,7 +46,7 @@ describe SoftwareSpec do
     it "raises an error if passing invalid OS versions" do
       expect {
         spec.uses_from_macos("foo", since: :bar)
-      }.to raise_error(ArgumentError, "unknown version :bar")
+      }.to raise_error(MacOSVersionError, "unknown or unsupported macOS version: :bar")
     end
   end
 end
diff --git a/Library/Homebrew/test/os/mac/version_spec.rb b/Library/Homebrew/test/os/mac/version_spec.rb
index 0901b0aae3..1d57fdbe0d 100644
--- a/Library/Homebrew/test/os/mac/version_spec.rb
+++ b/Library/Homebrew/test/os/mac/version_spec.rb
@@ -4,13 +4,13 @@ require "version"
 require "os/mac/version"
 
 describe OS::Mac::Version do
-  subject { described_class.new("10.10") }
+  subject { described_class.new("10.14") }
 
   specify "comparison with Symbol" do
-    expect(subject).to be > :mavericks
-    expect(subject).to be == :yosemite
-    expect(subject).to be === :yosemite # rubocop:disable Style/CaseEquality
-    expect(subject).to be < :el_capitan
+    expect(subject).to be > :high_sierra
+    expect(subject).to be == :mojave
+    expect(subject).to be === :mojave # rubocop:disable Style/CaseEquality
+    expect(subject).to be < :catalina
   end
 
   specify "comparison with Fixnum" do
@@ -19,28 +19,28 @@ describe OS::Mac::Version do
   end
 
   specify "comparison with Float" do
-    expect(subject).to be > 10.9
-    expect(subject).to be < 10.11
+    expect(subject).to be > 10.13
+    expect(subject).to be < 10.15
   end
 
   specify "comparison with String" do
-    expect(subject).to be > "10.9"
-    expect(subject).to be == "10.10"
-    expect(subject).to be === "10.10" # rubocop:disable Style/CaseEquality
-    expect(subject).to be < "10.11"
+    expect(subject).to be > "10.3"
+    expect(subject).to be == "10.14"
+    expect(subject).to be === "10.14" # rubocop:disable Style/CaseEquality
+    expect(subject).to be < "10.15"
   end
 
   specify "comparison with Version" do
-    expect(subject).to be > Version.create("10.9")
-    expect(subject).to be == Version.create("10.10")
-    expect(subject).to be === Version.create("10.10") # rubocop:disable Style/CaseEquality
-    expect(subject).to be < Version.create("10.11")
+    expect(subject).to be > Version.create("10.3")
+    expect(subject).to be == Version.create("10.14")
+    expect(subject).to be === Version.create("10.14") # rubocop:disable Style/CaseEquality
+    expect(subject).to be < Version.create("10.15")
   end
 
   specify "#from_symbol" do
-    expect(described_class.from_symbol(:yosemite)).to eq(subject)
+    expect(described_class.from_symbol(:mojave)).to eq(subject)
     expect { described_class.from_symbol(:foo) }
-      .to raise_error(ArgumentError)
+      .to raise_error(MacOSVersionError, "unknown or unsupported macOS version: :foo")
   end
 
   specify "#pretty_name" do
diff --git a/Library/Homebrew/test/requirements/macos_requirement_spec.rb b/Library/Homebrew/test/requirements/macos_requirement_spec.rb
index 0e48a62f47..c4dc2affbf 100644
--- a/Library/Homebrew/test/requirements/macos_requirement_spec.rb
+++ b/Library/Homebrew/test/requirements/macos_requirement_spec.rb
@@ -16,8 +16,8 @@ describe MacOSRequirement do
     end
 
     it "supports maximum versions", :needs_macos do
-      requirement = described_class.new([:mavericks], comparator: "<=")
-      expect(requirement.satisfied?).to eq MacOS.version <= :mavericks
+      requirement = described_class.new([:catalina], comparator: "<=")
+      expect(requirement.satisfied?).to eq MacOS.version <= :catalina
     end
   end
 end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-depends-on-macos-conflicting-forms.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-depends-on-macos-conflicting-forms.rb
index e32bbb733a..487d1311c6 100644
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-depends-on-macos-conflicting-forms.rb
+++ b/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-depends-on-macos-conflicting-forms.rb
@@ -1,12 +1,14 @@
-cask 'invalid-depends-on-macos-conflicting-forms' do
-  version '1.2.3'
-  sha256 '67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94'
+# frozen_string_literal: true
+
+cask "invalid-depends-on-macos-conflicting-forms" do
+  version "1.2.3"
+  sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94"
 
   url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip"
-  homepage 'https://brew.sh/invalid-depends-on-macos-conflicting-forms'
+  homepage "https://brew.sh/invalid-depends-on-macos-conflicting-forms"
 
-  depends_on macos: :yosemite
-  depends_on macos: '>= :mavericks'
+  depends_on macos: :catalina
+  depends_on macos: ">= :mojave"
 
-  app 'Caffeine.app'
+  app "Caffeine.app"
 end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-array.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-array.rb
index 8d7135c0d9..fb899ab46e 100644
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-array.rb
+++ b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-array.rb
@@ -1,12 +1,14 @@
-cask 'with-depends-on-macos-array' do
-  version '1.2.3'
-  sha256 '67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94'
+# frozen_string_literal: true
+
+cask "with-depends-on-macos-array" do
+  version "1.2.3"
+  sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94"
 
   url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip"
-  homepage 'https://brew.sh/with-depends-on-macos-array'
+  homepage "https://brew.sh/with-depends-on-macos-array"
 
   # since all OS releases are included, this should always pass
-  depends_on macos: [:mavericks, :sierra, MacOS.version.to_sym]
+  depends_on macos: [:catalina, MacOS.version.to_sym]
 
-  app 'Caffeine.app'
+  app "Caffeine.app"
 end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-comparison.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-comparison.rb
index c7dff81b39..1d1112a987 100644
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-comparison.rb
+++ b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-comparison.rb
@@ -1,11 +1,13 @@
-cask 'with-depends-on-macos-comparison' do
-  version '1.2.3'
-  sha256 '67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94'
+# frozen_string_literal: true
+
+cask "with-depends-on-macos-comparison" do
+  version "1.2.3"
+  sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94"
 
   url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip"
-  homepage 'https://brew.sh/with-depends-on-macos-comparison'
+  homepage "https://brew.sh/with-depends-on-macos-comparison"
 
-  depends_on macos: '>= :mavericks'
+  depends_on macos: ">= :catalina"
 
-  app 'Caffeine.app'
+  app "Caffeine.app"
 end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-failure.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-failure.rb
index c35b584007..195edfae4c 100644
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-failure.rb
+++ b/Library/Homebrew/test/support/fixtures/cask/Casks/with-depends-on-macos-failure.rb
@@ -6,7 +6,7 @@ cask 'with-depends-on-macos-failure' do
   homepage 'https://brew.sh/with-depends-on-macos-failure'
 
   # guarantee a mismatched release
-  depends_on macos: MacOS.version == :mavericks ? :sierra : :mavericks
+  depends_on macos: MacOS.version == :catalina ? :mojave : :catalina
 
   app 'Caffeine.app'
 end
diff --git a/Library/Homebrew/test/utils/bottles/bottles_spec.rb b/Library/Homebrew/test/utils/bottles/bottles_spec.rb
index 3cb3e76974..897bbb57fe 100644
--- a/Library/Homebrew/test/utils/bottles/bottles_spec.rb
+++ b/Library/Homebrew/test/utils/bottles/bottles_spec.rb
@@ -4,9 +4,9 @@ require "utils/bottles"
 
 describe Utils::Bottles do
   describe "#tag", :needs_macos do
-    it "returns :mavericks on Mavericks" do
-      allow(MacOS).to receive(:version).and_return(MacOS::Version.new("10.9"))
-      expect(described_class.tag).to eq(:mavericks)
+    it "returns :catalina on Catalina" do
+      allow(MacOS).to receive(:version).and_return(MacOS::Version.new("10.15"))
+      expect(described_class.tag).to eq(:catalina)
     end
   end
 end
diff --git a/Library/Homebrew/test/utils/bottles/collector_spec.rb b/Library/Homebrew/test/utils/bottles/collector_spec.rb
index 5df7bd45a5..f83ca75ea8 100644
--- a/Library/Homebrew/test/utils/bottles/collector_spec.rb
+++ b/Library/Homebrew/test/utils/bottles/collector_spec.rb
@@ -5,9 +5,9 @@ require "utils/bottles"
 describe Utils::Bottles::Collector do
   describe "#fetch_checksum_for" do
     it "returns passed tags" do
-      subject[:yosemite] = "foo"
-      subject[:el_captain] = "bar"
-      expect(subject.fetch_checksum_for(:el_captain)).to eq(["bar", :el_captain])
+      subject[:mojave] = "foo"
+      subject[:catalina] = "bar"
+      expect(subject.fetch_checksum_for(:catalina)).to eq(["bar", :catalina])
     end
 
     it "returns nil if empty" do
@@ -15,31 +15,31 @@ describe Utils::Bottles::Collector do
     end
 
     it "returns nil when there is no match" do
-      subject[:yosemite] = "foo"
+      subject[:catalina] = "foo"
       expect(subject.fetch_checksum_for(:foo)).to be nil
     end
 
     it "uses older tags when needed", :needs_macos do
-      subject[:mavericks] = "foo"
-      expect(subject.send(:find_matching_tag, :mavericks)).to eq(:mavericks)
-      expect(subject.send(:find_matching_tag, :yosemite)).to eq(:mavericks)
+      subject[:mojave] = "foo"
+      expect(subject.send(:find_matching_tag, :mojave)).to eq(:mojave)
+      expect(subject.send(:find_matching_tag, :catalina)).to eq(:mojave)
     end
 
     it "does not use older tags when requested not to", :needs_macos do
       allow(Homebrew::EnvConfig).to receive(:developer?).and_return(true)
       allow(Homebrew::EnvConfig).to receive(:skip_or_later_bottles?).and_return(true)
       allow(OS::Mac).to receive(:prerelease?).and_return(true)
-      subject[:mavericks] = "foo"
-      expect(subject.send(:find_matching_tag, :mavericks)).to eq(:mavericks)
-      expect(subject.send(:find_matching_tag, :yosemite)).to be_nil
+      subject[:mojave] = "foo"
+      expect(subject.send(:find_matching_tag, :mojave)).to eq(:mojave)
+      expect(subject.send(:find_matching_tag, :catalina)).to be_nil
     end
 
     it "ignores HOMEBREW_SKIP_OR_LATER_BOTTLES on release versions", :needs_macos do
       allow(Homebrew::EnvConfig).to receive(:skip_or_later_bottles?).and_return(true)
       allow(OS::Mac).to receive(:prerelease?).and_return(false)
-      subject[:mavericks] = "foo"
-      expect(subject.send(:find_matching_tag, :mavericks)).to eq(:mavericks)
-      expect(subject.send(:find_matching_tag, :yosemite)).to eq(:mavericks)
+      subject[:mojave] = "foo"
+      expect(subject.send(:find_matching_tag, :mojave)).to eq(:mojave)
+      expect(subject.send(:find_matching_tag, :catalina)).to eq(:mojave)
     end
   end
 end
diff --git a/docs/Formula-Cookbook.md b/docs/Formula-Cookbook.md
index 712078f4f8..242899eb1e 100644
--- a/docs/Formula-Cookbook.md
+++ b/docs/Formula-Cookbook.md
@@ -11,7 +11,7 @@ A *formula* is a package definition written in Ruby. It can be created with `bre
 | **opt prefix** | A symlink to the active version of a **Keg**               | `/usr/local/opt/foo `                                           |
 | **Cellar**     | All **Kegs** are installed here                            | `/usr/local/Cellar`                                             |
 | **Tap**        | A Git repository of **Formulae** and/or commands | `/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core`   |
-| **Bottle**     | Pre-built **Keg** used instead of building from source     | `qt-4.8.4.mavericks.bottle.tar.gz`                              |
+| **Bottle**     | Pre-built **Keg** used instead of building from source     | `qt-4.8.4.catalina.bottle.tar.gz`                              |
 | **Cask**       | An [extension of Homebrew](https://github.com/Homebrew/homebrew-cask) to install macOS native apps  | `/Applications/MacDown.app/Contents/SharedSupport/bin/macdown` |
 | **Brew Bundle**| An [extension of Homebrew](https://github.com/Homebrew/homebrew-bundle) to describe dependencies    | `brew 'myservice', restart_service: true` |