Livecheck: Extend strategy block support
This commit is contained in:
		
							parent
							
								
									da0d7eff9b
								
							
						
					
					
						commit
						361743e1fb
					
				@ -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>.+?)/ # 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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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{
 | 
			
		||||
            (?<path>/authors/id(?:/[^/]+){3,}/) # Path before the filename
 | 
			
		||||
            (?<prefix>[^/]+) # 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
 | 
			
		||||
 | 
			
		||||
@ -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]))
 | 
			
		||||
            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
 | 
			
		||||
 | 
			
		||||
@ -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/)?(?<username>[^/]+)/(?<repository>[^/]+)}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
 | 
			
		||||
 | 
			
		||||
@ -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/(?<package_name>.*?)/}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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
          /^(?<package_name>.+?)-\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{<h3>example-(.*?)/?</h3>}i`
 | 
			
		||||
          regex ||= %r{<h3>#{Regexp.escape(package_name)}-(.*?)/?</h3>}i
 | 
			
		||||
 | 
			
		||||
          PageMatch.find_versions(page_url, regex)
 | 
			
		||||
          PageMatch.find_versions(page_url, regex, &block)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -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/(?<project_name>[^/]+)}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*</}
 | 
			
		||||
 | 
			
		||||
          PageMatch.find_versions(page_url, regex)
 | 
			
		||||
          PageMatch.find_versions(page_url, regex, &block)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -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{registry\.npmjs\.org/(?<package_name>.+)/-/}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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
          /
 | 
			
		||||
            (?<package_name>.+)- # 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
 | 
			
		||||
 | 
			
		||||
@ -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?/(?<project_name>[^/]+)/}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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
          /^(?<module_name>.+)-\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?
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user