From dd72f1ac95375835408f4524e5a3f9bba86e19cc Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Fri, 5 Aug 2022 15:51:02 -0400 Subject: [PATCH 1/3] Add `arch` cask DSL --- Library/Homebrew/cask/dsl.rb | 18 ++++++ Library/Homebrew/livecheck.rb | 3 +- .../rubocops/cask/constants/stanza.rb | 2 +- Library/Homebrew/test/cask/dsl_spec.rb | 56 +++++++++++++++++++ .../cask/Casks/invalid/invalid-two-arch.rb | 11 ++++ .../fixtures/cask/Casks/multiple-versions.rb | 6 +- .../fixtures/cask/Casks/one-array-arch.rb | 10 ++++ .../fixtures/cask/Casks/one-string-arch.rb | 10 ++++ 8 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-two-arch.rb create mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb create mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb index d4d06da622..ef2ba0483c 100644 --- a/Library/Homebrew/cask/dsl.rb +++ b/Library/Homebrew/cask/dsl.rb @@ -243,6 +243,24 @@ module Cask end end + # @api public + def arch(arm: nil, intel: nil) + should_return = arm.blank? && intel.blank? + + set_unique_stanza(:arch, should_return) do + @on_system_blocks_exist = true + + # If arm and intel are arrays and one isn't specified, default to an array that is the same size as the other + empty_value = Array.new(arm&.count || intel&.count) if arm.is_a?(Array) || intel.is_a?(Array) + + if OnSystem.arch_condition_met? :arm + arm || empty_value + elsif OnSystem.arch_condition_met? :intel + intel || empty_value + end + end + end + # `depends_on` uses a load method so that multiple stanzas can be merged. # @api public def depends_on(*args) diff --git a/Library/Homebrew/livecheck.rb b/Library/Homebrew/livecheck.rb index 66abd5142f..f02eef7e1e 100644 --- a/Library/Homebrew/livecheck.rb +++ b/Library/Homebrew/livecheck.rb @@ -143,7 +143,8 @@ class Livecheck end delegate version: :@package_or_resource - private :version + delegate arch: :@package_or_resource + private :version, :arch # Returns a `Hash` of all instance variable values. # @return [Hash] diff --git a/Library/Homebrew/rubocops/cask/constants/stanza.rb b/Library/Homebrew/rubocops/cask/constants/stanza.rb index 93a9b67d55..959beda606 100644 --- a/Library/Homebrew/rubocops/cask/constants/stanza.rb +++ b/Library/Homebrew/rubocops/cask/constants/stanza.rb @@ -6,7 +6,7 @@ module RuboCop # Constants available globally for use in all cask cops. module Constants STANZA_GROUPS = [ - [:version, :sha256], + [:version, :sha256, :arch], [:language], [:url, :appcast, :name, :desc, :homepage], [:livecheck], diff --git a/Library/Homebrew/test/cask/dsl_spec.rb b/Library/Homebrew/test/cask/dsl_spec.rb index f8f3c0ecf7..5700c869b5 100644 --- a/Library/Homebrew/test/cask/dsl_spec.rb +++ b/Library/Homebrew/test/cask/dsl_spec.rb @@ -305,6 +305,62 @@ describe Cask::DSL, :cask do end end + describe "arch stanza" do + let(:token) { "invalid/invalid-two-arch" } + + it "prevents defining multiple arches" do + expect { cask }.to raise_error(Cask::CaskInvalidError, /'arch' stanza may only appear once/) + end + + context "when only one string value is passed for intel" do + let(:token) { "one-string-arch" } + + context "when running on arm" do + before do + allow(Hardware::CPU).to receive(:type).and_return(:arm) + end + + it "returns the value" do + expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/caffeine-arm.zip" + end + end + + context "when running on intel" do + before do + allow(Hardware::CPU).to receive(:type).and_return(:intel) + end + + it "defaults to `nil` for the other when no arrays are passed" do + expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip" + end + end + end + + context "when only one array arch value is passed for intel" do + let(:token) { "one-array-arch" } + + context "when running on arm" do + before do + allow(Hardware::CPU).to receive(:type).and_return(:arm) + end + + it "defaults to an array of the same size as the other when an array is passed" do + expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip" + end + end + + context "when running on intel" do + before do + allow(Hardware::CPU).to receive(:type).and_return(:intel) + end + + it "returns the value" do + expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/intel-caffeine-x86_64.zip" + end + end + end + end + describe "appcast stanza" do let(:token) { "with-appcast" } diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-two-arch.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-two-arch.rb new file mode 100644 index 0000000000..15112831e6 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/invalid/invalid-two-arch.rb @@ -0,0 +1,11 @@ +cask "invalid-two-arch" do + version "1.2.3" + sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" + arch arm: "arm", intel: "intel" + arch arm: "amd64", intel: "x86_64" + + url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip" + homepage "https://brew.sh/" + + app "Caffeine.app" +end diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb index ad05491a2d..a98420ab5b 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb @@ -1,11 +1,7 @@ cask "multiple-versions" do - arch = "arm" version "1.2.3" sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" - - on_intel do - arch = "intel" - end + arch arm: "arm", intel: "intel" on_big_sur do version "1.2.0" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb new file mode 100644 index 0000000000..7151fd9fbe --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb @@ -0,0 +1,10 @@ +cask "one-array-arch" do + version "1.2.3" + sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" + arch intel: ["intel-", "-x86_64"] + + url "file://#{TEST_FIXTURE_DIR}/cask/#{arch.first}caffeine#{arch.last}.zip" + homepage "https://brew.sh/" + + app "Caffeine.app" +end diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb new file mode 100644 index 0000000000..b808cdb4f5 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb @@ -0,0 +1,10 @@ +cask "one-string-arch" do + version "1.2.3" + sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" + arch arm: "-arm" + + url "file://#{TEST_FIXTURE_DIR}/cask/caffeine#{arch}.zip" + homepage "https://brew.sh/" + + app "Caffeine.app" +end From 76ae20a12f2b377406ae2af14f2f23f3085e9a0e Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Tue, 9 Aug 2022 11:34:52 -0400 Subject: [PATCH 2/3] Re-add `on_arch_conditional` DSL --- Library/Homebrew/cask/dsl.rb | 9 +----- Library/Homebrew/extend/on_system.rb | 7 +++++ Library/Homebrew/test/cask/cask_spec.rb | 10 +++---- Library/Homebrew/test/cask/cmd/list_spec.rb | 2 +- Library/Homebrew/test/cask/dsl_spec.rb | 28 ++----------------- .../{one-string-arch.rb => arch-arm-only.rb} | 2 +- .../fixtures/cask/Casks/multiple-versions.rb | 4 ++- .../fixtures/cask/Casks/one-array-arch.rb | 10 ------- 8 files changed, 20 insertions(+), 52 deletions(-) rename Library/Homebrew/test/support/fixtures/cask/Casks/{one-string-arch.rb => arch-arm-only.rb} (89%) delete mode 100644 Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb index ef2ba0483c..4499f1bffc 100644 --- a/Library/Homebrew/cask/dsl.rb +++ b/Library/Homebrew/cask/dsl.rb @@ -250,14 +250,7 @@ module Cask set_unique_stanza(:arch, should_return) do @on_system_blocks_exist = true - # If arm and intel are arrays and one isn't specified, default to an array that is the same size as the other - empty_value = Array.new(arm&.count || intel&.count) if arm.is_a?(Array) || intel.is_a?(Array) - - if OnSystem.arch_condition_met? :arm - arm || empty_value - elsif OnSystem.arch_condition_met? :intel - intel || empty_value - end + on_arch_conditional(arm: arm, intel: intel) end end diff --git a/Library/Homebrew/extend/on_system.rb b/Library/Homebrew/extend/on_system.rb index 77f323f24c..8ba6415b99 100644 --- a/Library/Homebrew/extend/on_system.rb +++ b/Library/Homebrew/extend/on_system.rb @@ -65,6 +65,13 @@ module OnSystem result end end + + base.define_method(:on_arch_conditional) do |arm:, intel:| + @on_system_blocks_exist = true + + return arm if OnSystem.arch_condition_met? :arm + return intel if OnSystem.arch_condition_met? :intel + end end sig { params(base: Class).void } diff --git a/Library/Homebrew/test/cask/cask_spec.rb b/Library/Homebrew/test/cask/cask_spec.rb index f52ba3cb66..77837880cf 100644 --- a/Library/Homebrew/test/cask/cask_spec.rb +++ b/Library/Homebrew/test/cask/cask_spec.rb @@ -218,25 +218,25 @@ describe Cask::Cask, :cask do <<~JSON { "arm64_big_sur": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.2.0/arm.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin-arm64/1.2.0/arm.zip", "version": "1.2.0", "sha256": "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" }, "monterey": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.2.3/intel.zip" + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip" }, "big_sur": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.2.0/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", "version": "1.2.0", "sha256": "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" }, "catalina": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.0.0/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", "version": "1.0.0", "sha256": "1866dfa833b123bb8fe7fa7185ebf24d28d300d0643d75798bc23730af734216" }, "mojave": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.0.0/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", "version": "1.0.0", "sha256": "1866dfa833b123bb8fe7fa7185ebf24d28d300d0643d75798bc23730af734216" } diff --git a/Library/Homebrew/test/cask/cmd/list_spec.rb b/Library/Homebrew/test/cask/cmd/list_spec.rb index 86704bc041..0ce95eb216 100644 --- a/Library/Homebrew/test/cask/cmd/list_spec.rb +++ b/Library/Homebrew/test/cask/cmd/list_spec.rb @@ -160,7 +160,7 @@ describe Cask::Cmd::List, :cask do ], "desc": null, "homepage": "https://brew.sh/", - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/1.2.3/arm.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin-arm64/1.2.3/arm.zip", "appcast": null, "version": "1.2.3", "versions": { diff --git a/Library/Homebrew/test/cask/dsl_spec.rb b/Library/Homebrew/test/cask/dsl_spec.rb index 5700c869b5..6572836ace 100644 --- a/Library/Homebrew/test/cask/dsl_spec.rb +++ b/Library/Homebrew/test/cask/dsl_spec.rb @@ -312,8 +312,8 @@ describe Cask::DSL, :cask do expect { cask }.to raise_error(Cask::CaskInvalidError, /'arch' stanza may only appear once/) end - context "when only one string value is passed for intel" do - let(:token) { "one-string-arch" } + context "when no intel value is specified" do + let(:token) { "arch-arm-only" } context "when running on arm" do before do @@ -335,30 +335,6 @@ describe Cask::DSL, :cask do end end end - - context "when only one array arch value is passed for intel" do - let(:token) { "one-array-arch" } - - context "when running on arm" do - before do - allow(Hardware::CPU).to receive(:type).and_return(:arm) - end - - it "defaults to an array of the same size as the other when an array is passed" do - expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip" - end - end - - context "when running on intel" do - before do - allow(Hardware::CPU).to receive(:type).and_return(:intel) - end - - it "returns the value" do - expect(cask.url.to_s).to eq "file://#{TEST_FIXTURE_DIR}/cask/intel-caffeine-x86_64.zip" - end - end - end end describe "appcast stanza" do diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb similarity index 89% rename from Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb rename to Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb index b808cdb4f5..c40235d15d 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/one-string-arch.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb @@ -1,4 +1,4 @@ -cask "one-string-arch" do +cask "arch-arm-only" do version "1.2.3" sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" arch arm: "-arm" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb index a98420ab5b..f4e112f956 100644 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/multiple-versions.rb @@ -3,6 +3,8 @@ cask "multiple-versions" do sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" arch arm: "arm", intel: "intel" + platform = on_arch_conditional arm: "darwin-arm64", intel: "darwin" + on_big_sur do version "1.2.0" sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" @@ -13,7 +15,7 @@ cask "multiple-versions" do sha256 "1866dfa833b123bb8fe7fa7185ebf24d28d300d0643d75798bc23730af734216" end - url "file://#{TEST_FIXTURE_DIR}/cask/caffeine/#{version}/#{arch}.zip" + url "file://#{TEST_FIXTURE_DIR}/cask/caffeine/#{platform}/#{version}/#{arch}.zip" homepage "https://brew.sh/" app "Caffeine.app" diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb deleted file mode 100644 index 7151fd9fbe..0000000000 --- a/Library/Homebrew/test/support/fixtures/cask/Casks/one-array-arch.rb +++ /dev/null @@ -1,10 +0,0 @@ -cask "one-array-arch" do - version "1.2.3" - sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" - arch intel: ["intel-", "-x86_64"] - - url "file://#{TEST_FIXTURE_DIR}/cask/#{arch.first}caffeine#{arch.last}.zip" - homepage "https://brew.sh/" - - app "Caffeine.app" -end From 19c955d19a6372d12c639634e99e104f8c37a9f5 Mon Sep 17 00:00:00 2001 From: Rylan Polster Date: Tue, 9 Aug 2022 14:54:33 -0400 Subject: [PATCH 3/3] Fix tests --- Library/Homebrew/test/cask/cask_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/test/cask/cask_spec.rb b/Library/Homebrew/test/cask/cask_spec.rb index 77837880cf..5b912ae3ca 100644 --- a/Library/Homebrew/test/cask/cask_spec.rb +++ b/Library/Homebrew/test/cask/cask_spec.rb @@ -226,17 +226,17 @@ describe Cask::Cask, :cask do "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip" }, "big_sur": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.0/intel.zip", "version": "1.2.0", "sha256": "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" }, "catalina": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.0.0/intel.zip", "version": "1.0.0", "sha256": "1866dfa833b123bb8fe7fa7185ebf24d28d300d0643d75798bc23730af734216" }, "mojave": { - "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.2.3/intel.zip", + "url": "file://#{TEST_FIXTURE_DIR}/cask/caffeine/darwin/1.0.0/intel.zip", "version": "1.0.0", "sha256": "1866dfa833b123bb8fe7fa7185ebf24d28d300d0643d75798bc23730af734216" }