Module: Repology Private

Defined in:
utils/repology.rb

Overview

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Repology API client.

Constant Summary collapse

HOMEBREW_CORE =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

"homebrew"
HOMEBREW_CASK =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

"homebrew_casks"

Class Method Summary collapse

Class Method Details

.latest_version(repositories) ⇒ String, Version

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'utils/repology.rb', line 97

def self.latest_version(repositories)
  # The status is "unique" when the package is present only in Homebrew, so
  # Repology has no way of knowing if the package is up-to-date.
  is_unique = repositories.find do |repo|
    repo["status"] == "unique"
  end.present?

  return "present only in Homebrew" if is_unique

  latest_version = repositories.find do |repo|
    repo["status"] == "newest"
  end

  # Repology cannot identify "newest" versions for packages without a version
  # scheme
  return "no latest version" if latest_version.blank?

  Version.new(T.must(latest_version["version"]))
end

.parse_api_response(limit = nil, last_package = "", repository:) ⇒ Hash{String => T.untyped}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • limit (Integer, nil) (defaults to: nil)
  • last_package (String, nil) (defaults to: "")
  • repository (String)

Returns:



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
92
93
94
# File 'utils/repology.rb', line 63

def self.parse_api_response(limit = nil, last_package = "", repository:)
  package_term = case repository
  when HOMEBREW_CORE
    "formulae"
  when HOMEBREW_CASK
    "casks"
  else
    "packages"
  end

  ohai "Querying outdated #{package_term} from Repology"

  page_no = 1
  outdated_packages = {}

  while page_no <= MAX_PAGINATION
    odebug "Paginating Repology API page: #{page_no}"

    response = query_api(last_package, repository:)
    outdated_packages.merge!(response)
    last_package = response.keys.max

    page_no += 1
    break if (limit && outdated_packages.size >= limit) || response.size <= 1
  end

  package_term = package_term.chop if outdated_packages.size == 1
  puts "#{outdated_packages.size} outdated #{package_term} found"
  puts

  outdated_packages.sort.to_h
end

.query_api(last_package_in_response = "", repository:) ⇒ Hash{String => T.untyped}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • last_package_in_response (String, nil) (defaults to: "")
  • repository (String)

Returns:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'utils/repology.rb', line 14

def self.query_api(last_package_in_response = "", repository:)
  last_package_in_response += "/" if last_package_in_response.present?
  url = "https://repology.org/api/v1/projects/#{last_package_in_response}?inrepo=#{repository}&outdated=1"

  result = Utils::Curl.curl_output(
    "--silent", url.to_s,
    use_homebrew_curl: !Utils::Curl.curl_supports_tls13?
  )
  JSON.parse(result.stdout)
rescue
  if Homebrew::EnvConfig.developer?
    $stderr.puts result&.stderr
  else
    odebug result&.stderr
  end

  raise
end

.single_package_query(name, repository:) ⇒ Hash{String => T.untyped}?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'utils/repology.rb', line 34

def self.single_package_query(name, repository:)
  url = "https://repology.org/api/v1/project/#{name}"

  result = Utils::Curl.curl_output(
    "--location", "--silent", url.to_s,
    use_homebrew_curl: !Utils::Curl.curl_supports_tls13?
  )

  data = JSON.parse(result.stdout)
  { name => data }
rescue => e
  require "utils/backtrace"
  error_output = [result&.stderr, "#{e.class}: #{e}", Utils::Backtrace.clean(e)].compact
  if Homebrew::EnvConfig.developer?
    $stderr.puts(*error_output)
  else
    odebug(*error_output)
  end

  nil
end