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