diff --git a/Library/Homebrew/livecheck/livecheck.rb b/Library/Homebrew/livecheck/livecheck.rb index 7c832bf4e5..07c2cec10d 100644 --- a/Library/Homebrew/livecheck/livecheck.rb +++ b/Library/Homebrew/livecheck/livecheck.rb @@ -524,7 +524,7 @@ module Homebrew if debug puts "URL (strategy): #{strategy_data[:url]}" if strategy_data[:url] != url - puts "URL (final): #{strategy_data[:final_url]}" if strategy_data[:final_url] + puts "URL (final): #{strategy_data[:final_url]}" if strategy_data[:final_url] puts "Regex (strategy): #{strategy_data[:regex].inspect}" if strategy_data[:regex] != livecheck_regex end diff --git a/Library/Homebrew/livecheck/strategy/apache.rb b/Library/Homebrew/livecheck/strategy/apache.rb index 194cb25266..c4f5b704db 100644 --- a/Library/Homebrew/livecheck/strategy/apache.rb +++ b/Library/Homebrew/livecheck/strategy/apache.rb @@ -59,7 +59,7 @@ module Homebrew # * `/href=["']?example-v?(\d+(?:\.\d+)+)-bin\.zip/i` regex ||= /href=["']?#{Regexp.escape(prefix)}v?(\d+(?:\.\d+)+)#{Regexp.escape(suffix)}/i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/bitbucket.rb b/Library/Homebrew/livecheck/strategy/bitbucket.rb index 48d20a7860..b3dd77376f 100644 --- a/Library/Homebrew/livecheck/strategy/bitbucket.rb +++ b/Library/Homebrew/livecheck/strategy/bitbucket.rb @@ -71,7 +71,7 @@ module Homebrew # * `/href=.*?example-v?(\d+(?:\.\d+)+)\.t/i` regex ||= /href=.*?#{Regexp.escape(match[:prefix])}v?(\d+(?:\.\d+)+)#{Regexp.escape(suffix)}/i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/cpan.rb b/Library/Homebrew/livecheck/strategy/cpan.rb index 5b74154c28..18d6b2c55d 100644 --- a/Library/Homebrew/livecheck/strategy/cpan.rb +++ b/Library/Homebrew/livecheck/strategy/cpan.rb @@ -54,7 +54,7 @@ module Homebrew # Example regex: `/href=.*?Brew[._-]v?(\d+(?:\.\d+)*)\.t/i` regex ||= /href=.*?#{prefix}[._-]v?(\d+(?:\.\d+)*)#{Regexp.escape(suffix)}/i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/github_latest.rb b/Library/Homebrew/livecheck/strategy/github_latest.rb index d3afcddbf4..a1e7c051d6 100644 --- a/Library/Homebrew/livecheck/strategy/github_latest.rb +++ b/Library/Homebrew/livecheck/strategy/github_latest.rb @@ -65,7 +65,7 @@ module Homebrew # The default regex is the same for all URLs using this strategy regex ||= %r{href=.*?/tag/v?(\d+(?:\.\d+)+)["' >]}i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/gnome.rb b/Library/Homebrew/livecheck/strategy/gnome.rb index 9432015a61..73c3430818 100644 --- a/Library/Homebrew/livecheck/strategy/gnome.rb +++ b/Library/Homebrew/livecheck/strategy/gnome.rb @@ -53,7 +53,7 @@ module Homebrew # Example regex: `/example-(\d+\.([0-8]\d*?)?[02468](?:\.\d+)*?)\.t/i` regex ||= /#{Regexp.escape(package_name)}-(\d+\.([0-8]\d*?)?[02468](?:\.\d+)*?)\.t/i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/gnu.rb b/Library/Homebrew/livecheck/strategy/gnu.rb index 1d181d3992..427d08d8b1 100644 --- a/Library/Homebrew/livecheck/strategy/gnu.rb +++ b/Library/Homebrew/livecheck/strategy/gnu.rb @@ -89,7 +89,7 @@ module Homebrew # Example regex: `%r{href=.*?example[._-]v?(\d+(?:\.\d+)*)(?:\.[a-z]+|/)}i` regex ||= %r{href=.*?#{project_name}[._-]v?(\d+(?:\.\d+)*)(?:\.[a-z]+|/)}i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/hackage.rb b/Library/Homebrew/livecheck/strategy/hackage.rb index 968a41f344..49240e752a 100644 --- a/Library/Homebrew/livecheck/strategy/hackage.rb +++ b/Library/Homebrew/livecheck/strategy/hackage.rb @@ -43,7 +43,7 @@ module Homebrew # Example regex: `%r{

example-(.*?)/?

}i` regex ||= %r{

#{Regexp.escape(package_name)}-(.*?)/?

}i - Homebrew::Livecheck::Strategy::PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex) end end end diff --git a/Library/Homebrew/livecheck/strategy/launchpad.rb b/Library/Homebrew/livecheck/strategy/launchpad.rb index 8a820cf8aa..b0611f474d 100644 --- a/Library/Homebrew/livecheck/strategy/launchpad.rb +++ b/Library/Homebrew/livecheck/strategy/launchpad.rb @@ -49,7 +49,7 @@ module Homebrew # The default regex is the same for all URLs using this strategy regex ||= %r{class="[^"]*version[^"]*"[^>]*>\s*Latest version is (.+)\s*.+)-\d+/i =~ file_name # /pub/ URLs redirect to the same URL with /archive/, so we replace @@ -82,17 +79,15 @@ module Homebrew # the URL gives us the relevant directory listing page. page_url = url.sub("x.org/pub/", "x.org/archive/").delete_suffix(file_name) + # Example regex: /href=.*?example[._-]v?(\d+(?:\.\d+)+)\.t/i regex ||= /href=.*?#{Regexp.escape(module_name)}[._-]v?(\d+(?:\.\d+)+)\.t/i - match_data = { matches: {}, regex: regex, url: page_url } + # Use the cached page content to avoid duplicate fetches + cached_content = @page_data[page_url] + match_data = PageMatch.find_versions(page_url, regex, cached_content) - # Cache responses to avoid unnecessary duplicate fetches - @page_data[page_url] = URI.parse(page_url).open.read unless @page_data.key?(page_url) - - matches = @page_data[page_url].scan(regex) - matches.map(&:first).uniq.each do |match| - match_data[:matches][match] = Version.new(match) - end + # Cache any new page content + @page_data[page_url] = match_data[:content] if match_data[:content].present? match_data end diff --git a/Library/Homebrew/test/livecheck/strategy/page_match_spec.rb b/Library/Homebrew/test/livecheck/strategy/page_match_spec.rb index 4f853fee17..4c364f1d8a 100644 --- a/Library/Homebrew/test/livecheck/strategy/page_match_spec.rb +++ b/Library/Homebrew/test/livecheck/strategy/page_match_spec.rb @@ -34,7 +34,24 @@ describe Homebrew::Livecheck::Strategy::PageMatch do EOS } + let(:page_content_matches) { ["2.6.0", "2.5.0", "2.4.0", "2.3.0", "2.2.0", "2.1.0", "2.0.0", "1.9.0"] } + let(:find_versions_return_hash) { + { + matches: { + "2.6.0" => Version.new("2.6.0"), + "2.5.0" => Version.new("2.5.0"), + "2.4.0" => Version.new("2.4.0"), + "2.3.0" => Version.new("2.3.0"), + "2.2.0" => Version.new("2.2.0"), + "2.1.0" => Version.new("2.1.0"), + "2.0.0" => Version.new("2.0.0"), + "1.9.0" => Version.new("1.9.0"), + }, + regex: regex, + url: url, + } + } describe "::match?" do it "returns true for any URL" do @@ -52,4 +69,10 @@ describe Homebrew::Livecheck::Strategy::PageMatch do .to eq(page_content_matches) end end + + describe "::find_versions?" do + it "finds versions in provided_content" do + expect(page_match.find_versions(url, regex, page_content)).to eq(find_versions_return_hash) + end + end end