Class: Homebrew::Livecheck::Strategy::GithubLatest

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
livecheck/strategy/github_latest.rb

Overview

The GithubLatest strategy identifies versions of software at github.com by checking a repository’s “latest” release page.

GitHub URLs take a few different formats:

  • https://github.com/example/example/releases/download/1.2.3/example-1.2.3.tar.gz
  • https://github.com/example/example/archive/v1.2.3.tar.gz
  • https://github.com/downloads/example/example/example-1.2.3.tar.gz

A repository’s /releases/latest URL normally redirects to a release tag (e.g., /releases/tag/1.2.3). When there isn’t a “latest” release, it will redirect to the /releases page.

This strategy should only be used when we know the upstream repository has a “latest” release and the tagged release is appropriate to use (e.g., “latest” isn’t wrongly pointing to an unstable version, not picking up the actual latest version, etc.). The strategy can only be applied by using strategy :github_latest in a livecheck block.

The default regex identifies versions like 1.2.3/v1.2.3 in href attributes containing the tag URL (e.g., /example/example/releases/tag/v1.2.3). This is a common tag format but a modified regex can be provided in a livecheck block to override the default if a repository uses a different format (e.g., example-1.2.3, 1.2.3d, 1.2.3-4, etc.).

Constant Summary collapse

NICE_NAME =
"GitHub - Latest"
PRIORITY =

A priority of zero causes livecheck to skip the strategy. We do this for Homebrew::Livecheck::Strategy::GithubLatest so we can selectively apply the strategy using strategy :github_latest in a livecheck block.

0
URL_MATCH_REGEX =

The Regexp used to determine if the strategy applies to the URL.

%r{
  ^https?://github\.com
  /(?:downloads/)?(?<username>[^/]+) # The GitHub username
  /(?<repository>[^/]+)              # The GitHub repository name
}ix.freeze

Class Method Summary collapse

Class Method Details

.find_versions(url, regex, cask: nil, &block) ⇒ Hash{Symbol => T.untyped}

Generates a URL and regex (if one isn’t provided) and passes them to PageMatch.find_versions to identify versions in the content.

Parameters:

  • url (String)

    the URL of the content to check

  • regex (Regexp, nil)

    a regex used for matching versions in content

  • cask (Cask::Cask, nil) (defaults to: nil)
  • block (T.proc.params(arg0: String).returns(T.any(T::Array[String], String)), nil)

Returns:



73
74
75
76
77
78
79
80
81
82
83
# File 'livecheck/strategy/github_latest.rb', line 73

def self.find_versions(url, regex, cask: nil, &block)
  match = url.sub(/\.git$/i, "").match(URL_MATCH_REGEX)

  # Example URL: `https://github.com/example/example/releases/latest`
  page_url = "https://github.com/#{match[:username]}/#{match[:repository]}/releases/latest"

  # 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, cask: cask, &block)
end

.match?(url) ⇒ Boolean

Whether the strategy can be applied to the provided URL.

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


55
56
57
# File 'livecheck/strategy/github_latest.rb', line 55

def self.match?(url)
  URL_MATCH_REGEX.match?(url)
end