From 5c9f5b95064bd25f959f42a3cefc85d186cb453d Mon Sep 17 00:00:00 2001 From: Sam Ford <1584702+samford@users.noreply.github.com> Date: Wed, 23 Dec 2020 09:12:53 -0500 Subject: [PATCH 1/3] Xorg: Use PageMatch#find_versions --- .../Homebrew/livecheck/strategy/page_match.rb | 25 ++++++++++++++++--- Library/Homebrew/livecheck/strategy/xorg.rb | 17 +++++-------- .../livecheck/strategy/page_match_spec.rb | 23 +++++++++++++++++ 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/Library/Homebrew/livecheck/strategy/page_match.rb b/Library/Homebrew/livecheck/strategy/page_match.rb index ac910a7ff8..0d611936f7 100644 --- a/Library/Homebrew/livecheck/strategy/page_match.rb +++ b/Library/Homebrew/livecheck/strategy/page_match.rb @@ -71,12 +71,29 @@ module Homebrew # Checks the content at the URL for new versions, using the provided # regex for matching. - sig { params(url: String, regex: T.nilable(Regexp)).returns(T::Hash[Symbol, T.untyped]) } - def self.find_versions(url, regex, &block) + # + # @param url [String] the URL of the content to check + # @param regex [Regexp] a regex used for matching versions in content + # @param provided_content [String] page content to use in place of + # fetching via Strategy#page_content + # @return [Hash] + sig do + params( + url: String, + regex: T.nilable(Regexp), + provided_content: T.nilable(String), + block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))), + ).returns(T::Hash[Symbol, T.untyped]) + end + def self.find_versions(url, regex, provided_content = nil, &block) match_data = { matches: {}, regex: regex, url: url } - match_data.merge!(Strategy.page_content(url)) - content = match_data.delete(:content) + content = if provided_content.present? + provided_content + else + match_data.merge!(Strategy.page_content(url)) + match_data.delete(:content) + end return match_data if content.blank? page_matches(content, regex, &block).each do |match_text| diff --git a/Library/Homebrew/livecheck/strategy/xorg.rb b/Library/Homebrew/livecheck/strategy/xorg.rb index 18417207b0..abe9a36e1d 100644 --- a/Library/Homebrew/livecheck/strategy/xorg.rb +++ b/Library/Homebrew/livecheck/strategy/xorg.rb @@ -1,8 +1,6 @@ # typed: false # frozen_string_literal: true -require "open-uri" - module Homebrew module Livecheck module Strategy @@ -74,7 +72,6 @@ module Homebrew # @return [Hash] def self.find_versions(url, regex) file_name = File.basename(url) - /^(?.+)-\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 = Homebrew::Livecheck::Strategy::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 From ea259da9c731ae54588e82cdf28fb3da96e22f08 Mon Sep 17 00:00:00 2001 From: Sam Ford <1584702+samford@users.noreply.github.com> Date: Wed, 23 Dec 2020 14:35:12 -0500 Subject: [PATCH 2/3] Livecheck: Demodulize PageMatch name in calls Co-authored-by: Markus Reiter --- Library/Homebrew/livecheck/strategy/apache.rb | 2 +- Library/Homebrew/livecheck/strategy/bitbucket.rb | 2 +- Library/Homebrew/livecheck/strategy/cpan.rb | 2 +- Library/Homebrew/livecheck/strategy/github_latest.rb | 2 +- Library/Homebrew/livecheck/strategy/gnome.rb | 2 +- Library/Homebrew/livecheck/strategy/gnu.rb | 2 +- Library/Homebrew/livecheck/strategy/hackage.rb | 2 +- Library/Homebrew/livecheck/strategy/launchpad.rb | 2 +- Library/Homebrew/livecheck/strategy/npm.rb | 2 +- Library/Homebrew/livecheck/strategy/pypi.rb | 2 +- Library/Homebrew/livecheck/strategy/sourceforge.rb | 2 +- Library/Homebrew/livecheck/strategy/xorg.rb | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) 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* Date: Thu, 24 Dec 2020 15:00:57 -0500 Subject: [PATCH 3/3] Livecheck: Fix final url spacing in debug output --- Library/Homebrew/livecheck/livecheck.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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