diff --git a/Library/Homebrew/livecheck/strategy/apache.rb b/Library/Homebrew/livecheck/strategy/apache.rb index c4f5b704db..1ab87092d5 100644 --- a/Library/Homebrew/livecheck/strategy/apache.rb +++ b/Library/Homebrew/livecheck/strategy/apache.rb @@ -38,7 +38,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) %r{ path= (?.+?)/ # Path to directory of files or version directories @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/bitbucket.rb b/Library/Homebrew/livecheck/strategy/bitbucket.rb index b3dd77376f..dfa3539836 100644 --- a/Library/Homebrew/livecheck/strategy/bitbucket.rb +++ b/Library/Homebrew/livecheck/strategy/bitbucket.rb @@ -52,7 +52,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) match = url.match(URL_MATCH_REGEX) # Use `\.t` instead of specific tarball extensions (e.g. .tar.gz) @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/cpan.rb b/Library/Homebrew/livecheck/strategy/cpan.rb index 18d6b2c55d..5bf242830b 100644 --- a/Library/Homebrew/livecheck/strategy/cpan.rb +++ b/Library/Homebrew/livecheck/strategy/cpan.rb @@ -37,7 +37,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) %r{ (?/authors/id(?:/[^/]+){3,}/) # Path before the filename (?[^/]+) # Filename text before the version @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/git.rb b/Library/Homebrew/livecheck/strategy/git.rb index 4cd216bf58..f57e047666 100644 --- a/Library/Homebrew/livecheck/strategy/git.rb +++ b/Library/Homebrew/livecheck/strategy/git.rb @@ -74,7 +74,7 @@ module Homebrew # @param url [String] the URL of the Git repository to check # @param regex [Regexp] the regex to use for matching versions # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) match_data = { matches: {}, regex: regex, url: url } tags_data = tag_info(url, regex) @@ -86,6 +86,21 @@ module Homebrew tags_only_debian = tags_data[:tags].all? { |tag| tag.start_with?("debian/") } + if block + case (value = block.call(tags_data[:tags], regex)) + when String + match_data[:matches][value] = Version.new(value) + when Array + value.each do |tag| + match_data[:matches][tag] = Version.new(tag) + end + else + raise TypeError, "Return value of `strategy :git` block must be a string or array of strings." + end + + return match_data + end + tags_data[:tags].each do |tag| # Skip tag if it has a 'debian/' prefix and upstream does not do # only 'debian/' prefixed tags diff --git a/Library/Homebrew/livecheck/strategy/github_latest.rb b/Library/Homebrew/livecheck/strategy/github_latest.rb index a1e7c051d6..714e761fd5 100644 --- a/Library/Homebrew/livecheck/strategy/github_latest.rb +++ b/Library/Homebrew/livecheck/strategy/github_latest.rb @@ -56,7 +56,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) %r{github\.com/(?:downloads/)?(?[^/]+)/(?[^/]+)}i =~ url.sub(/\.git$/i, "") # Example URL: `https://github.com/example/example/releases/latest` @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/gnome.rb b/Library/Homebrew/livecheck/strategy/gnome.rb index 73c3430818..ea2a468155 100644 --- a/Library/Homebrew/livecheck/strategy/gnome.rb +++ b/Library/Homebrew/livecheck/strategy/gnome.rb @@ -36,7 +36,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) %r{/sources/(?.*?)/}i =~ url page_url = "https://download.gnome.org/sources/#{package_name}/cache.json" @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/gnu.rb b/Library/Homebrew/livecheck/strategy/gnu.rb index 427d08d8b1..35fb951475 100644 --- a/Library/Homebrew/livecheck/strategy/gnu.rb +++ b/Library/Homebrew/livecheck/strategy/gnu.rb @@ -59,7 +59,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) project_names = PROJECT_NAME_REGEXES.map do |project_name_regex| m = url.match(project_name_regex) m["project_name"] if m @@ -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 - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/hackage.rb b/Library/Homebrew/livecheck/strategy/hackage.rb index 49240e752a..0796762c6d 100644 --- a/Library/Homebrew/livecheck/strategy/hackage.rb +++ b/Library/Homebrew/livecheck/strategy/hackage.rb @@ -34,7 +34,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) /^(?.+?)-\d+/i =~ File.basename(url) # A page containing a directory listing of the latest source tarball @@ -43,7 +43,7 @@ module Homebrew # Example regex: `%r{

example-(.*?)/?

}i` regex ||= %r{

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

}i - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/header_match.rb b/Library/Homebrew/livecheck/strategy/header_match.rb index 22d3ea7e49..b413d0a1ba 100644 --- a/Library/Homebrew/livecheck/strategy/header_match.rb +++ b/Library/Homebrew/livecheck/strategy/header_match.rb @@ -45,7 +45,7 @@ module Homebrew merged_headers = headers.reduce(&:merge) if block - match = block.call(merged_headers) + match = block.call(merged_headers, regex) else match = nil diff --git a/Library/Homebrew/livecheck/strategy/launchpad.rb b/Library/Homebrew/livecheck/strategy/launchpad.rb index b0611f474d..cf5c286c54 100644 --- a/Library/Homebrew/livecheck/strategy/launchpad.rb +++ b/Library/Homebrew/livecheck/strategy/launchpad.rb @@ -40,7 +40,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) %r{launchpad\.net/(?[^/]+)}i =~ url # The main page for the project on Launchpad @@ -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*.+)/-/}i =~ url page_url = "https://www.npmjs.com/package/#{package_name}?activeTab=versions" @@ -46,7 +46,7 @@ module Homebrew # * `%r{href=.*?/package/@example/example/v/(\d+(?:\.\d+)+)"}i` regex ||= %r{href=.*?/package/#{Regexp.escape(package_name)}/v/(\d+(?:\.\d+)+)"}i - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/page_match.rb b/Library/Homebrew/livecheck/strategy/page_match.rb index 6aaa470dab..7e3b8f9dae 100644 --- a/Library/Homebrew/livecheck/strategy/page_match.rb +++ b/Library/Homebrew/livecheck/strategy/page_match.rb @@ -49,7 +49,7 @@ module Homebrew # @return [Array] def self.page_matches(content, regex, &block) if block - case (value = block.call(content)) + case (value = block.call(content, regex)) when String return [value] when Array diff --git a/Library/Homebrew/livecheck/strategy/pypi.rb b/Library/Homebrew/livecheck/strategy/pypi.rb index 8f3f69a61a..2b588a165f 100644 --- a/Library/Homebrew/livecheck/strategy/pypi.rb +++ b/Library/Homebrew/livecheck/strategy/pypi.rb @@ -36,7 +36,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) / (?.+)- # The package name followed by a hyphen .*? # The version string @@ -55,7 +55,7 @@ module Homebrew %r{href=.*?/packages.*?/#{Regexp.escape(package_name)}[._-] v?(\d+(?:\.\d+)*(.post\d+)?)#{Regexp.escape(suffix)}}ix - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/sourceforge.rb b/Library/Homebrew/livecheck/strategy/sourceforge.rb index 1e6e9c0f2a..e58a118ae5 100644 --- a/Library/Homebrew/livecheck/strategy/sourceforge.rb +++ b/Library/Homebrew/livecheck/strategy/sourceforge.rb @@ -50,7 +50,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex = nil) + def self.find_versions(url, regex = nil, &block) if url.include?("/project") %r{/projects?/(?[^/]+)/}i =~ url elsif url.include?(".net/p/") @@ -66,7 +66,7 @@ module Homebrew # create something that works for most URLs. regex ||= %r{url=.*?/#{Regexp.escape(project_name)}/files/.*?[-_/](\d+(?:[-.]\d+)+)[-_/%.]}i - PageMatch.find_versions(page_url, regex) + PageMatch.find_versions(page_url, regex, &block) end end end diff --git a/Library/Homebrew/livecheck/strategy/xorg.rb b/Library/Homebrew/livecheck/strategy/xorg.rb index 19b0655009..7800d96696 100644 --- a/Library/Homebrew/livecheck/strategy/xorg.rb +++ b/Library/Homebrew/livecheck/strategy/xorg.rb @@ -70,7 +70,7 @@ module Homebrew # @param url [String] the URL of the content to check # @param regex [Regexp] a regex used for matching versions in content # @return [Hash] - def self.find_versions(url, regex) + def self.find_versions(url, regex = nil, &block) file_name = File.basename(url) /^(?.+)-\d+/i =~ file_name @@ -84,7 +84,7 @@ module Homebrew # 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) + match_data = PageMatch.find_versions(page_url, regex, cached_content, &block) # Cache any new page content @page_data[page_url] = match_data[:content] if match_data[:content].present?