| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2020-06-29 10:16:58 -05:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-30 11:23:34 -05:00
										 |  |  | require "utils/curl" | 
					
						
							| 
									
										
										
										
											2020-07-03 01:51:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-26 09:11:39 +02:00
										 |  |  | # Repology API client. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @api private | 
					
						
							| 
									
										
										
										
											2020-07-06 03:32:18 +00:00
										 |  |  | module Repology | 
					
						
							| 
									
										
										
										
											2020-07-01 02:50:21 +00:00
										 |  |  |   module_function | 
					
						
							| 
									
										
										
										
											2020-06-29 09:57:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 09:10:57 -05:00
										 |  |  |   MAX_PAGINATION = 15
 | 
					
						
							| 
									
										
										
										
											2020-08-26 09:11:39 +02:00
										 |  |  |   private_constant :MAX_PAGINATION | 
					
						
							| 
									
										
										
										
											2020-08-19 09:10:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-01 02:50:21 +00:00
										 |  |  |   def query_api(last_package_in_response = "") | 
					
						
							| 
									
										
										
										
											2020-07-07 13:43:31 +00:00
										 |  |  |     last_package_in_response += "/" if last_package_in_response.present? | 
					
						
							| 
									
										
										
										
											2020-07-02 17:06:39 +00:00
										 |  |  |     url = "https://repology.org/api/v1/projects/#{last_package_in_response}?inrepo=homebrew&outdated=1" | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-01 09:55:31 -05:00
										 |  |  |     output, _errors, _status = curl_output(url.to_s) | 
					
						
							|  |  |  |     JSON.parse(output) | 
					
						
							| 
									
										
										
										
											2020-06-29 09:57:21 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 09:30:19 -05:00
										 |  |  |   def single_package_query(name) | 
					
						
							|  |  |  |     url = "https://repology.org/api/v1/project/#{name}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output, _errors, _status = curl_output(url.to_s) | 
					
						
							| 
									
										
										
										
											2020-07-28 12:56:19 -05:00
										 |  |  |     data = JSON.parse(output) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 10:52:37 -05:00
										 |  |  |     homebrew = data.select do |repo| | 
					
						
							|  |  |  |       repo["repo"] == "homebrew" | 
					
						
							| 
									
										
										
										
											2020-07-28 12:56:19 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-03 11:21:50 -05:00
										 |  |  |     homebrew.empty? ? nil : { name => data } | 
					
						
							| 
									
										
										
										
											2020-07-28 09:30:19 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 22:18:03 +00:00
										 |  |  |   def parse_api_response(limit = nil) | 
					
						
							| 
									
										
										
										
											2020-06-30 10:11:56 -05:00
										 |  |  |     ohai "Querying outdated packages from Repology" | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 22:25:17 +00:00
										 |  |  |     page_no = 1
 | 
					
						
							| 
									
										
										
										
											2020-08-19 10:12:38 -05:00
										 |  |  |     outdated_packages = {} | 
					
						
							|  |  |  |     last_package_index = "" | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 10:12:38 -05:00
										 |  |  |     while page_no <= MAX_PAGINATION | 
					
						
							| 
									
										
										
										
											2020-07-06 09:08:41 -05:00
										 |  |  |       odebug "Paginating Repology API page: #{page_no}" | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 17:59:38 +00:00
										 |  |  |       response = query_api(last_package_index.to_s) | 
					
						
							| 
									
										
										
										
											2020-06-29 09:57:21 -05:00
										 |  |  |       response_size = response.size | 
					
						
							|  |  |  |       outdated_packages.merge!(response) | 
					
						
							| 
									
										
										
										
											2020-07-02 13:34:47 -05:00
										 |  |  |       last_package_index = outdated_packages.size - 1
 | 
					
						
							| 
									
										
										
										
											2020-08-19 10:12:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 09:10:57 -05:00
										 |  |  |       page_no += 1
 | 
					
						
							| 
									
										
										
										
											2020-08-19 10:12:38 -05:00
										 |  |  |       break if limit && outdated_packages.size >= limit || response_size <= 1
 | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-08-18 22:25:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 13:40:25 +00:00
										 |  |  |     puts "#{outdated_packages.size} outdated #{"package".pluralize(outdated_packages.size)} found" | 
					
						
							| 
									
										
										
										
											2020-08-16 18:45:50 -05:00
										 |  |  |     puts | 
					
						
							| 
									
										
										
										
											2020-06-29 09:57:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     outdated_packages | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-05 10:10:05 -05:00
										 |  |  |   def validate_and_format_packages(outdated_repology_packages, limit) | 
					
						
							| 
									
										
										
										
											2020-08-18 09:42:32 -05:00
										 |  |  |     if outdated_repology_packages.size > 10 && (limit.blank? || limit > 10) | 
					
						
							|  |  |  |       ohai "Verifying outdated repology packages" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     packages = {} | 
					
						
							| 
									
										
										
										
											2020-08-16 19:22:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     outdated_repology_packages.each do |_name, repositories| | 
					
						
							|  |  |  |       repology_homebrew_repo = repositories.find do |repo| | 
					
						
							|  |  |  |         repo["repo"] == "homebrew" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       next if repology_homebrew_repo.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 09:56:41 -05:00
										 |  |  |       latest_version = repositories.find { |repo| repo["status"] == "newest" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       next if latest_version.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       latest_version = latest_version["version"] | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |       srcname = repology_homebrew_repo["srcname"] | 
					
						
							|  |  |  |       package_details = format_package(srcname, latest_version) | 
					
						
							|  |  |  |       packages[srcname] = package_details unless package_details.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-05 10:10:05 -05:00
										 |  |  |       break if limit && packages.size >= limit | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     packages | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def format_package(package_name, latest_version) | 
					
						
							| 
									
										
										
										
											2020-07-31 10:52:37 -05:00
										 |  |  |     formula = formula_data(package_name) | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if formula.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 09:56:41 -05:00
										 |  |  |     formula_name = formula.to_s | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     tap_full_name = formula.tap&.full_name | 
					
						
							|  |  |  |     current_version = formula.version.to_s | 
					
						
							|  |  |  |     livecheck_response = LivecheckFormula.init(package_name) | 
					
						
							| 
									
										
										
										
											2020-08-13 09:56:41 -05:00
										 |  |  |     pull_requests = GitHub.fetch_pull_requests(formula_name, tap_full_name, state: "open") | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if pull_requests.try(:any?) | 
					
						
							| 
									
										
										
										
											2020-08-16 18:45:50 -05:00
										 |  |  |       pull_requests = pull_requests.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }.join(", ") | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 09:53:52 +00:00
										 |  |  |     pull_requests = "none" if pull_requests.blank? | 
					
						
							| 
									
										
										
										
											2020-08-13 09:56:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-08-18 13:29:36 +00:00
										 |  |  |       repology_latest_version:  latest_version || "not found", | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |       current_formula_version:  current_version.to_s, | 
					
						
							| 
									
										
										
										
											2020-08-18 13:29:36 +00:00
										 |  |  |       livecheck_latest_version: livecheck_response[:livecheck_version] || "not found", | 
					
						
							| 
									
										
										
										
											2020-07-30 22:58:30 +00:00
										 |  |  |       open_pull_requests:       pull_requests, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-07-31 10:52:37 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def formula_data(package_name) | 
					
						
							|  |  |  |     Formula[package_name] | 
					
						
							|  |  |  |   rescue | 
					
						
							|  |  |  |     nil | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-06-29 09:51:58 -05:00
										 |  |  | end |