From e3c3f5a35679f271bc54ed5ca18564eeb69a98d9 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Wed, 30 Jul 2025 08:32:22 +0100 Subject: [PATCH] Deprecate/disable/remove code for Homebrew 4.6 The next minor release will be Homebrew 4.6.0 so let's do the usual deprecation/disable/remove code cycle. --- Library/Homebrew/bundle/whalebrew_dumper.rb | 2 +- .../Homebrew/bundle/whalebrew_installer.rb | 2 +- Library/Homebrew/cask/audit.rb | 13 -- Library/Homebrew/cask/dsl.rb | 5 +- Library/Homebrew/cask/url.rb | 115 +----------------- Library/Homebrew/dev-cmd/audit.rb | 3 +- Library/Homebrew/extend/pathname.rb | 15 --- Library/Homebrew/extend/time.rb | 2 +- Library/Homebrew/formula.rb | 41 ++----- Library/Homebrew/git_repository.rb | 7 -- Library/Homebrew/resource.rb | 2 +- Library/Homebrew/tap.rb | 24 ---- .../utils/string_inreplace_extension.rb | 6 +- 13 files changed, 22 insertions(+), 215 deletions(-) diff --git a/Library/Homebrew/bundle/whalebrew_dumper.rb b/Library/Homebrew/bundle/whalebrew_dumper.rb index 8f7edfd48e..0fe8f99af6 100644 --- a/Library/Homebrew/bundle/whalebrew_dumper.rb +++ b/Library/Homebrew/bundle/whalebrew_dumper.rb @@ -13,7 +13,7 @@ module Homebrew def self.images return [] unless Bundle.whalebrew_installed? - odeprecated "`brew bundle` `whalebrew` support", "using `whalebrew` directly" + odisabled "`brew bundle` `whalebrew` support", "using `whalebrew` directly" @images ||= T.let( `whalebrew list 2>/dev/null`.split("\n") .reject { |line| line.start_with?("COMMAND ") } diff --git a/Library/Homebrew/bundle/whalebrew_installer.rb b/Library/Homebrew/bundle/whalebrew_installer.rb index a5566c4923..f8a6221463 100644 --- a/Library/Homebrew/bundle/whalebrew_installer.rb +++ b/Library/Homebrew/bundle/whalebrew_installer.rb @@ -24,7 +24,7 @@ module Homebrew end def self.install!(name, preinstall: true, verbose: false, force: false, **_options) - odeprecated "`brew bundle` `whalebrew` support", "using `whalebrew` directly" + odisabled "`brew bundle` `whalebrew` support", "using `whalebrew` directly" return true unless preinstall puts "Installing #{name} image. It is not currently installed." if verbose diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb index aea4b25200..bd9be728b4 100644 --- a/Library/Homebrew/cask/audit.rb +++ b/Library/Homebrew/cask/audit.rb @@ -324,7 +324,6 @@ module Cask return if cask.deprecated? || cask.disabled? return if cask.version&.latest? return if (url = cask.url).nil? - return if block_url_offline? return if cask.livecheck_defined? return if livecheck_result == :auto_detected @@ -348,7 +347,6 @@ module Cask sig { void } def audit_download_url_format return if (url = cask.url).nil? - return if block_url_offline? odebug "Auditing URL format" return unless bad_sourceforge_url? @@ -360,7 +358,6 @@ module Cask sig { void } def audit_download_url_is_osdn return if (url = cask.url).nil? - return if block_url_offline? return unless bad_osdn_url? add_error "OSDN download urls are disabled.", location: url.location, strict_only: true @@ -372,7 +369,6 @@ module Cask sig { void } def audit_unnecessary_verified return unless cask.url - return if block_url_offline? return unless verified_present? return unless url_match_homepage? return unless verified_matches_url? @@ -385,7 +381,6 @@ module Cask sig { void } def audit_missing_verified return unless cask.url - return if block_url_offline? return if file_url? return if url_match_homepage? return if verified_present? @@ -398,7 +393,6 @@ module Cask sig { void } def audit_no_match return if (url = cask.url).nil? - return if block_url_offline? return unless verified_present? return if verified_matches_url? @@ -1191,13 +1185,6 @@ module Cask URI(cask.url.to_s).scheme == "file" end - sig { returns(T::Boolean) } - def block_url_offline? - return false if online? - - !!cask.url&.from_block? - end - sig { returns(Tap) } def core_tap @core_tap ||= T.let(CoreTap.instance, T.nilable(Tap)) diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb index 22a55c4f1f..fdd29a2ed3 100644 --- a/Library/Homebrew/cask/dsl.rb +++ b/Library/Homebrew/cask/dsl.rb @@ -98,10 +98,9 @@ module Cask :disable_reason, :disable_replacement_cask, :disable_replacement_formula, - :discontinued?, # TODO: remove once discontinued? is removed (4.5.0) :livecheck, :livecheck_defined?, - :livecheckable?, # TODO: remove once `#livecheckable?` is removed + :livecheckable?, # TODO: remove once `#livecheckable?` was odisabled and is now removed :no_autobump!, :autobump?, :no_autobump_message, @@ -556,7 +555,7 @@ module Cask # for `#livecheck_defined?`. sig { returns(T::Boolean) } def livecheckable? - odeprecated "`livecheckable?`", "`livecheck_defined?`" + odisabled "`livecheckable?`", "`livecheck_defined?`" @livecheck_defined == true end diff --git a/Library/Homebrew/cask/url.rb b/Library/Homebrew/cask/url.rb index 0f82c65abf..6bc19deae8 100644 --- a/Library/Homebrew/cask/url.rb +++ b/Library/Homebrew/cask/url.rb @@ -7,10 +7,6 @@ require "utils/curl" module Cask # Class corresponding to the `url` stanza. class URL < SimpleDelegator - BlockReturn = T.type_alias do - T.any(URI::Generic, String, [T.any(URI::Generic, String), T::Hash[Symbol, T.untyped]]) - end - # Methods for the `url` stanza. class DSL sig { returns(T.any(URI::Generic, String)) } @@ -102,96 +98,6 @@ module Cask end end - # Allow passing a block to the `url` stanza. - class BlockDSL - # Allow accessing the URL associated with page contents. - class PageWithURL < SimpleDelegator - # Get the URL of the fetched page. - # - # ### Example - # - # ```ruby - # url "https://example.org/download" do |page| - # file_path = page[/href="([^"]+\.dmg)"/, 1] - # URI.join(page.url, file_path) - # end - # ``` - # - # @api public - sig { returns(URI::Generic) } - attr_accessor :url - - sig { params(str: String, url: URI::Generic).void } - def initialize(str, url) - super(str) - @url = T.let(url, URI::Generic) - end - end - - sig { - params( - uri: T.nilable(T.any(URI::Generic, String)), - dsl: ::Cask::DSL, - block: T.proc.params(arg0: T.all(String, PageWithURL)).returns(BlockReturn), - ).void - } - def initialize(uri, dsl:, &block) - @uri = T.let(uri, T.nilable(T.any(URI::Generic, String))) - @dsl = T.let(dsl, ::Cask::DSL) - @block = T.let(block, T.proc.params(arg0: T.all(String, PageWithURL)).returns(BlockReturn)) - - odisabled "cask `url do` blocks" if @block - end - - sig { returns(BlockReturn) } - def call - if @uri - result = ::Utils::Curl.curl_output("--fail", "--silent", "--location", @uri.to_s) - result.assert_success! - - page = PageWithURL.new(result.stdout, URI(@uri)) - instance_exec(page, &@block) - else - instance_exec(&@block) - end - end - - private - - # Allows calling a nested `url` stanza in a `url do` block. - # - # @api public - sig { - params( - uri: T.any(URI::Generic, String), - block: T.proc.params(arg0: T.all(String, PageWithURL)).returns(BlockReturn), - ).returns(BlockReturn) - } - def url(uri, &block) - self.class.new(uri, dsl: @dsl, &block).call - end - - # This allows calling DSL methods from inside a `url` block. - # - # @api public - sig { - override.params(method: Symbol, args: T.untyped, block: T.nilable(T.proc.returns(T.untyped))) - .returns(T.anything) - } - def method_missing(method, *args, &block) - if @dsl.respond_to?(method) - @dsl.public_send(method, *args, &block) - else - super - end - end - - sig { override.params(method_name: T.any(Symbol, String), include_private: T::Boolean).returns(T::Boolean) } - def respond_to_missing?(method_name, include_private = false) - @dsl.respond_to?(method_name, include_private) || super - end - end - sig { params( uri: T.nilable(T.any(URI::Generic, String)), @@ -210,28 +116,18 @@ module Cask only_path: T.nilable(String), caller_location: Thread::Backtrace::Location, dsl: T.nilable(::Cask::DSL), - block: T.nilable(T.proc.params(arg0: T.all(String, BlockDSL::PageWithURL)).returns(BlockReturn)), ).void } def initialize( uri = nil, verified: nil, using: nil, tag: nil, branch: nil, revisions: nil, revision: nil, trust_cert: nil, cookies: nil, referer: nil, header: nil, user_agent: nil, data: nil, only_path: nil, - caller_location: caller_locations.fetch(0), dsl: nil, &block + caller_location: caller_locations.fetch(0), dsl: nil ) super( - if block - LazyObject.new do - uri2, options = *BlockDSL.new(uri, dsl: T.must(dsl), &block).call - options ||= {} - DSL.new(uri2, **options) - end - else - DSL.new(T.must(uri), verified:, using:, tag:, branch:, revisions:, revision:, trust_cert:, cookies:, - referer:, header:, user_agent:, data:, only_path:) - end + DSL.new(T.must(uri), verified:, using:, tag:, branch:, revisions:, revision:, trust_cert:, cookies:, + referer:, header:, user_agent:, data:, only_path:) ) - @from_block = T.let(!block.nil?, T::Boolean) @caller_location = T.let(caller_location, Thread::Backtrace::Location) end @@ -252,11 +148,6 @@ module Cask interpolated_url.exclude?('#{') end - sig { returns(T::Boolean) } - def from_block? - @from_block - end - private sig { returns(T.nilable(String)) } diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 1563b1b953..bde583810d 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -58,7 +58,6 @@ module Homebrew hidden: true switch "--[no-]signing", description: "Audit for app signatures, which are required by macOS on ARM." - # should be odeprecated in future switch "--token-conflicts", description: "Audit for token conflicts.", hidden: true @@ -105,6 +104,8 @@ module Homebrew sig { override.void } def run + odeprecated "brew audit --token-conflicts" if args.token_conflicts? + Formulary.enable_factory_cache! os_arch_combinations = args.os_arch_combinations diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index f65ac07a07..8af0f3ccc6 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -439,20 +439,5 @@ class Pathname .encode(Encoding::UTF_8, invalid: :replace) .split("\n") end - - # Like regular `rmtree`, except it never ignores errors. - # - # This was the default behaviour in Ruby 3.1 and earlier. - # - # @api public - def rmtree(noop: nil, verbose: nil, secure: nil) - # Ideally we'd odeprecate this but probably can't given gems so let's - # create a RuboCop autocorrect instead soon. - # This is why monkeypatching is non-ideal (but right solution to get - # Ruby 3.3 over the line). - odisabled "rmtree", "FileUtils#rm_r" - FileUtils.rm_r(T.must(@path), noop:, verbose:, secure:) - nil - end end require "extend/os/pathname" diff --git a/Library/Homebrew/extend/time.rb b/Library/Homebrew/extend/time.rb index 2d266db5ff..55302feacc 100644 --- a/Library/Homebrew/extend/time.rb +++ b/Library/Homebrew/extend/time.rb @@ -7,7 +7,7 @@ class Time # Backwards compatibility for formulae that used this ActiveSupport extension sig { returns(String) } def rfc3339 - odeprecated "Time#rfc3339", "Time#xmlschema" + odisabled "Time#rfc3339", "Time#xmlschema" xmlschema end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index ee5356193a..564f0909e7 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2796,24 +2796,6 @@ class Formula self.class.on_system_blocks_exist? || @on_system_blocks_exist end - sig { - params( - verify_download_integrity: T::Boolean, - timeout: T.nilable(T.any(Integer, Float)), - quiet: T::Boolean, - ).returns(Pathname) - } - def fetch(verify_download_integrity: true, timeout: nil, quiet: false) - odisabled "Formula#fetch", "Resource#fetch on Formula#resource" - active_spec.fetch(verify_download_integrity:, timeout:, quiet:) - end - - sig { params(filename: T.any(Pathname, String)).void } - def verify_download_integrity(filename) - odisabled "Formula#verify_download_integrity", "Resource#verify_download_integrity on Formula#resource" - active_spec.verify_download_integrity(filename) - end - sig { params(keep_tmp: T::Boolean).returns(T.untyped) } def run_test(keep_tmp: false) @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean)) @@ -2909,22 +2891,15 @@ class Formula # @api public sig { params( - paths: T.any(T::Enumerable[T.any(String, Pathname)], String, Pathname), - before: T.nilable(T.any(Pathname, Regexp, String)), - after: T.nilable(T.any(Pathname, String, Symbol)), - old_audit_result: T.nilable(T::Boolean), - audit_result: T::Boolean, - global: T::Boolean, - block: T.nilable(T.proc.params(s: StringInreplaceExtension).void), + paths: T.any(T::Enumerable[T.any(String, Pathname)], String, Pathname), + before: T.nilable(T.any(Pathname, Regexp, String)), + after: T.nilable(T.any(Pathname, String, Symbol)), + audit_result: T::Boolean, + global: T::Boolean, + block: T.nilable(T.proc.params(s: StringInreplaceExtension).void), ).void } - def inreplace(paths, before = nil, after = nil, old_audit_result = nil, audit_result: true, global: true, &block) - # NOTE: must check for `#nil?` and not `#blank?`, or else `old_audit_result = false` will not call `odeprecated`. - unless old_audit_result.nil? - odisabled "inreplace(paths, before, after, #{old_audit_result})", - "inreplace(paths, before, after, audit_result: #{old_audit_result})" - audit_result = old_audit_result - end + def inreplace(paths, before = nil, after = nil, audit_result: true, global: true, &block) Utils::Inreplace.inreplace(paths, before, after, audit_result:, global:, &block) rescue Utils::Inreplace::Error => e onoe e.to_s @@ -3558,7 +3533,7 @@ class Formula # and `false` otherwise. sig { returns(T::Boolean) } def livecheckable? - odeprecated "`livecheckable?`", "`livecheck_defined?`" + odisabled "`livecheckable?`", "`livecheck_defined?`" @livecheck_defined == true end diff --git a/Library/Homebrew/git_repository.rb b/Library/Homebrew/git_repository.rb index d1871ae908..792f3c001d 100644 --- a/Library/Homebrew/git_repository.rb +++ b/Library/Homebrew/git_repository.rb @@ -20,13 +20,6 @@ class GitRepository pathname.join(".git").exist? end - sig { returns(T::Boolean) } - def git_repo? - # delete this whole function when removing odisabled - odisabled "GitRepository#git_repo?", "GitRepository#git_repository?" - git_repository? - end - # Gets the URL of the Git origin remote. sig { returns(T.nilable(String)) } def origin_url diff --git a/Library/Homebrew/resource.rb b/Library/Homebrew/resource.rb index 383a68e825..6b0e4fb4ca 100644 --- a/Library/Homebrew/resource.rb +++ b/Library/Homebrew/resource.rb @@ -182,7 +182,7 @@ class Resource # and `false` otherwise. sig { returns(T::Boolean) } def livecheckable? - odeprecated "`livecheckable?`", "`livecheck_defined?`" + odisabled "`livecheckable?`", "`livecheck_defined?`" @livecheck_defined == true end diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb index 077bdadb73..e6c01674ee 100644 --- a/Library/Homebrew/tap.rb +++ b/Library/Homebrew/tap.rb @@ -155,14 +155,6 @@ class Tap # @api public attr_reader :repository - # @deprecated - sig { returns(T::Boolean) } - def repo - # delete this whole function when removing odisabled - odisabled "Tap#repo", "Tap#repository" - repository - end - # The name of this {Tap}. It combines {#user} and {#repository} with a slash. # {#name} is always in lowercase. # e.g. `user/repository` @@ -277,14 +269,6 @@ class Tap @remote_repository ||= T.must(match[:remote_repository]) end - # @deprecated - sig { returns(T.nilable(String)) } - def remote_repo - # delete this whole function when removing odisabled - odisabled "Tap#remote_repo", "Tap#remote_repository" - remote_repository - end - # The default remote path to this {Tap}. sig { returns(String) } def default_remote @@ -299,14 +283,6 @@ class Tap .upcase end - # @deprecated - sig { returns(String) } - def repo_var_suffix - # delete this whole function when removing odisabled - odisabled "Tap#repo_var_suffix", "Tap#repository_var_suffix" - repository_var_suffix - end - # Check whether this {Tap} is a Git repository. # # @api public diff --git a/Library/Homebrew/utils/string_inreplace_extension.rb b/Library/Homebrew/utils/string_inreplace_extension.rb index 872a252a31..71e9b5f331 100644 --- a/Library/Homebrew/utils/string_inreplace_extension.rb +++ b/Library/Homebrew/utils/string_inreplace_extension.rb @@ -37,10 +37,10 @@ class StringInreplaceExtension ).returns(T.nilable(String)) } def gsub!(before, after, old_audit_result = nil, audit_result: true) - # NOTE: must check for `#nil?` and not `#blank?`, or else `old_audit_result = false` will not call `odeprecated`. + # NOTE: must check for `#nil?` and not `#blank?`, or else `old_audit_result = false` will not call `odisabled`. unless old_audit_result.nil? - odeprecated "gsub!(before, after, #{old_audit_result})", - "gsub!(before, after, audit_result: #{old_audit_result})" + odisabled "gsub!(before, after, #{old_audit_result})", + "gsub!(before, after, audit_result: #{old_audit_result})" audit_result = old_audit_result end before = before.to_s if before.is_a?(Pathname)