Class: Homebrew::Livecheck::Strategy::Gnu

Inherits:
Object
  • Object
show all
Defined in:
brew/Library/Homebrew/livecheck/strategy/gnu.rb

Overview

The Gnu strategy identifies versions of software at gnu.org by checking directory listing pages.

GNU URLs use a variety of formats:

Archive file URLs: * https://ftp.gnu.org/gnu/example/example-1.2.3.tar.gz * https://ftp.gnu.org/gnu/example/1.2.3/example-1.2.3.tar.gz

Homepage URLs: * https://www.gnu.org/software/example/ * https://example.gnu.org

There are other URL formats that this strategy currently doesn’t support: * https://ftp.gnu.org/non-gnu/example/source/feature/1.2.3/example-1.2.3.tar.gz * https://savannah.nongnu.org/download/example/example-1.2.3.tar.gz * https://download.savannah.gnu.org/releases/example/example-1.2.3.tar.gz * https://download.savannah.nongnu.org/releases/example/example-1.2.3.tar.gz

The default regex identifies versions in archive files found in href attributes.

Constant Summary collapse

NICE_NAME =
"GNU"
URL_MATCH_REGEX =

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

%r{
  //.+?\.gnu\.org$|
  gnu\.org/(?:gnu|software)/
}ix.freeze
PROJECT_NAME_REGEXES =

The Regexp used to parse the project name from the provided URL. The strategy uses this information to create the URL to check and the default regex.

[
  %r{/(?:gnu|software)/(?<project_name>.+?)/}i,
  %r{//(?<project_name>.+?)\.gnu\.org(?:/)?$}i,
].freeze

Class Method Summary collapse

Class Method Details

.find_versions(url, regex = nil) ⇒ Hash

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

Parameters:

  • url (String)

    the URL of the content to check

  • regex (Regexp) (defaults to: nil)

    a regex used for matching versions in content

Returns:

  • (Hash)


60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'brew/Library/Homebrew/livecheck/strategy/gnu.rb', line 60

def self.find_versions(url, regex = nil)
  project_names = PROJECT_NAME_REGEXES.map do |project_name_regex|
    m = url.match(project_name_regex)
    m["project_name"] if m
  end.compact
  return { matches: {}, regex: regex, url: url } if project_names.blank?

  if project_names.length > 1
    odebug <<~EOS

      Multiple project names found: #{match_list}

    EOS
  end

  project_name = project_names.first

  # The directory listing page for the project's files
  page_url = "http://ftp.gnu.org/gnu/#{project_name}/?C=M&O=D"

  # The default regex consists of the following parts:
  # * `href=.*?`: restricts matching to URLs in `href` attributes
  # * The project name
  # * `[._-]`: the generic delimiter between project name and version
  # * `v?(\d+(?:\.\d+)*)`: the numeric version
  # * `(?:\.[a-z]+|/)`: the file extension (a trailing delimiter)
  #
  # 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)
end

.match?(url) ⇒ Boolean

Whether the strategy can be applied to the provided URL.

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


50
51
52
# File 'brew/Library/Homebrew/livecheck/strategy/gnu.rb', line 50

def self.match?(url)
  URL_MATCH_REGEX.match?(url) && !url.include?("savannah.")
end