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) ⇒ Object

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.



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'utils/repology.rb', line 82

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(latest_version["version"])
end

.parse_api_response(limit = nil, last_package = "", repository:) ⇒ Object

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.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'utils/repology.rb', line 49

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:) ⇒ Object

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.



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

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"

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

  raise
end

.single_package_query(name, repository:) ⇒ Object

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.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'utils/repology.rb', line 30

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

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

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

  nil
end