diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 5bac71b555..005d0b38ae 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -3278,6 +3278,7 @@ class Formula def livecheck(&block) return @livecheck unless block + include Homebrew::Livecheck::Constants @livecheckable = true @livecheck.instance_eval(&block) end diff --git a/Library/Homebrew/livecheck.rb b/Library/Homebrew/livecheck.rb index f02eef7e1e..07d2787472 100644 --- a/Library/Homebrew/livecheck.rb +++ b/Library/Homebrew/livecheck.rb @@ -1,6 +1,8 @@ # typed: true # frozen_string_literal: true +require "livecheck/constants" + # The {Livecheck} class implements the DSL methods used in a formula's, cask's # or resource's `livecheck` block and stores related instance variables. Most # of these methods also return the related instance variable when no argument diff --git a/Library/Homebrew/livecheck/constants.rb b/Library/Homebrew/livecheck/constants.rb new file mode 100644 index 0000000000..f203ab67b5 --- /dev/null +++ b/Library/Homebrew/livecheck/constants.rb @@ -0,0 +1,14 @@ +# typed: true +# frozen_string_literal: true + +module Homebrew + module Livecheck + # The {Constants} module provides constants that are intended to be used + # in `livecheck` block values (e.g. `url`, `regex`). + module Constants + # A placeholder string used in resource `livecheck` block URLs that will + # be replaced with the latest version from the main formula check. + LATEST_VERSION = "" + end + end +end diff --git a/Library/Homebrew/livecheck/livecheck.rb b/Library/Homebrew/livecheck/livecheck.rb index f4ae28f06a..bd3e7d4ec7 100644 --- a/Library/Homebrew/livecheck/livecheck.rb +++ b/Library/Homebrew/livecheck/livecheck.rb @@ -1,6 +1,7 @@ # typed: true # frozen_string_literal: true +require "livecheck/constants" require "livecheck/error" require "livecheck/livecheck_version" require "livecheck/skip_conditions" @@ -295,6 +296,7 @@ module Homebrew else res_version_info = resource_version( resource, + latest.to_s, json: json, debug: debug, quiet: quiet, @@ -836,15 +838,17 @@ module Homebrew # version information. Returns nil if a latest version couldn't be found. sig { params( - resource: Resource, - json: T::Boolean, - debug: T::Boolean, - quiet: T::Boolean, - verbose: T::Boolean, + resource: Resource, + formula_latest: String, + json: T::Boolean, + debug: T::Boolean, + quiet: T::Boolean, + verbose: T::Boolean, ).returns(Hash) } def resource_version( resource, + formula_latest, json: false, debug: false, quiet: false, @@ -874,12 +878,11 @@ module Homebrew checked_urls = [] # rubocop:disable Metrics/BlockLength urls.each_with_index do |original_url, i| + url = original_url.gsub(Constants::LATEST_VERSION, formula_latest) + # Only preprocess the URL when it's appropriate - url = if STRATEGY_SYMBOLS_TO_SKIP_PREPROCESS_URL.include?(livecheck_strategy) - original_url - else - preprocess_url(original_url) - end + url = preprocess_url(url) unless STRATEGY_SYMBOLS_TO_SKIP_PREPROCESS_URL.include?(livecheck_strategy) + next if checked_urls.include?(url) strategies = Strategy.from_url(