diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb index d4d06da622..4499f1bffc 100644 --- a/Library/Homebrew/cask/dsl.rb +++ b/Library/Homebrew/cask/dsl.rb @@ -243,6 +243,17 @@ 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 + + on_arch_conditional(arm: arm, intel: intel) + 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/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/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/cask_spec.rb b/Library/Homebrew/test/cask/cask_spec.rb index f52ba3cb66..5b912ae3ca 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.0/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.0.0/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.0.0/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 f8f3c0ecf7..6572836ace 100644 --- a/Library/Homebrew/test/cask/dsl_spec.rb +++ b/Library/Homebrew/test/cask/dsl_spec.rb @@ -305,6 +305,38 @@ 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 no intel value is specified" do + let(:token) { "arch-arm-only" } + + 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 + end + describe "appcast stanza" do let(:token) { "with-appcast" } diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb new file mode 100644 index 0000000000..c40235d15d --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/arch-arm-only.rb @@ -0,0 +1,10 @@ +cask "arch-arm-only" 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 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..f4e112f956 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,9 @@ cask "multiple-versions" do - arch = "arm" version "1.2.3" sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" + arch arm: "arm", intel: "intel" - on_intel do - arch = "intel" - end + platform = on_arch_conditional arm: "darwin-arm64", intel: "darwin" on_big_sur do version "1.2.0" @@ -17,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"