Add livecheck version and duplicate pr check

This commit is contained in:
Baffour Adu Boampong 2020-07-02 17:06:39 +00:00
parent 0c8f977665
commit ea2f4087fe
4 changed files with 100 additions and 52 deletions

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "cli/parser"
require "utils/popen"
module Homebrew
module_function
@ -9,6 +10,7 @@ module Homebrew
Homebrew::CLI::Parser.new do
usage_banner <<~EOS
`bump`
Display out-of-date brew formulae, the latest version available, and whether a pull request has been opened.
EOS
end
@ -18,6 +20,21 @@ module Homebrew
bump_args.parse
outdated_repology_packages = RepologyParser.parse_api_response
ohai RepologyParser.validate__packages(outdated_repology_packages)
outdated_packages = RepologyParser.validate_and_format_packages(outdated_repology_packages)
display(outdated_packages)
end
def display(outdated_packages)
ohai "Outdated Formulae"
outdated_packages.each do |formula, package_details|
puts ""
puts "Formula: #{formula}"
puts "Current formula version: #{package_details["current_formula_version"]}"
puts "Latest repology version: #{package_details["repology_latest_version"]}"
puts "Latest livecheck version: #{package_details["livecheck_latest_version"]}"
puts "Open pull requests: #{package_details["open_pull_requests"]}"
end
end
end

View File

@ -1,23 +0,0 @@
# frozen_string_literal: true
module Livecheck
def livecheck_formula_response(name)
ohai "Checking livecheck formula : #{name}"
response = Utils.popen_read("brew", "livecheck", name, "--quiet").chomp
parse_livecheck_response(response)
end
def parse_livecheck_response(response)
output = response.delete(" ").split(/:|==>/)
# eg: ["burp", "2.2.18", "2.2.18"]
package_name, brew_version, latest_version = output
{
name: package_name,
formula_version: brew_version,
livecheck_version: latest_version,
}
end
end

View File

@ -1,15 +1,15 @@
# frozen_string_literal: true
require "utils/curl"
require "utils/versions"
require "formula_info"
module RepologyParser
module_function
MAX_PAGE_LIMIT = 15
def query_api(last_package_in_response = "")
url = "https://repology.org/api/v1/projects/#{last_package_in_response}/?inrepo=homebrew&outdated=1"
url = "https://repology.org/api/v1/projects/#{last_package_in_response}?inrepo=homebrew&outdated=1"
ohai "Calling API #{url}" if Homebrew.args.verbose?
output, _errors, _status = curl_output(url.to_s)
@ -19,22 +19,23 @@ module RepologyParser
def parse_api_response
ohai "Querying outdated packages from Repology"
page_no = 1
ohai "Paginating Repology api page: #{page_no}" if Homebrew.args.verbose?
ohai "Paginating repology api page: #{page_no}" if Homebrew.args.verbose?
outdated_packages = query_api
last_package_index = outdated_packages.size - 1
last_pacakge_index = outdated_packages.size - 1
response_size = outdated_packages.size
page_limit = 15
while response_size > 1 && page_no <= MAX_PAGE_LIMIT
while response_size > 1 && page_no <= page_limit
page_no += 1
ohai "Paginating Repology api page: #{page_no}" if Homebrew.args.verbose?
ohai "Paginating repology api page: #{page_no}" if Homebrew.args.verbose?
last_package_in_response = outdated_packages.keys[last_package_index]
response = query_api(last_package_in_response)
last_package_in_response = outdated_packages.keys[last_pacakge_index]
response = query_api("#{last_package_in_response}/")
response_size = response.size
outdated_packages.merge!(response)
last_package_index = outdated_packages.size - 1
last_pacakge_index = outdated_packages.size - 1
end
ohai "#{outdated_packages.size} outdated packages identified"
@ -42,8 +43,8 @@ module RepologyParser
outdated_packages
end
def validate__packages(outdated_repology_packages)
ohai "Verifying outdated Repology packages as Homebrew Formulae"
def validate_and_format_packages(outdated_repology_packages)
ohai "Verifying outdated repology packages as Homebrew Formulae"
packages = {}
outdated_repology_packages.each do |_name, repositories|
@ -61,18 +62,24 @@ module RepologyParser
latest_version = repo["version"] if repo["status"] == "newest"
end
info = FormulaInfo.lookup(repology_homebrew_repo["srcname"])
next unless info
current_version = info.pkg_version
packages[repology_homebrew_repo["srcname"]] = {
"repology_latest_version" => latest_version,
"current_formula_version" => current_version.to_s,
}
puts packages
packages[repology_homebrew_repo["srcname"]] = format_package(repology_homebrew_repo["srcname"], latest_version)
end
# hash of hashes {"aacgain"=>{"repology_latest_version"=>"1.9", "current_formula_version"=>"1.8"}, ...}
packages
end
def format_package(package_name, latest_version)
current_version = Versions.current_formula_version(package_name)
livecheck_response = Versions.livecheck_formula(package_name)
pull_requests = Versions.check_for_duplicate_pull_requests(package_name, latest_version)
formatted_package = {
"repology_latest_version" => latest_version,
"current_formula_version" => current_version.to_s,
"livecheck_latest_version" => livecheck_response["livecheck_latest_version"],
"open_pull_requests" => pull_requests,
}
formatted_package
end
end

View File

@ -1,8 +1,8 @@
# frozen_string_literal: true
require "formula"
module Versions
module_function
def current_formula_version(formula_name)
Formula[formula_name].version.to_s.to_f
end
@ -12,10 +12,57 @@ module Versions
formula_name, "--url=#{url}").chomp
end
def check_for_open_pr(formula_name, download_url)
ohai "- Checking for open PRs for formula : #{formula_name}"
def check_for_open_pr(formula_name)
# ohai "- Checking for open PRs for formula : #{formula_name}"
response = bump_formula_pr(formula_name, download_url)
!response.include? "Error: These open pull requests may be duplicates"
# response = bump_formula_pr(formula_name, download_url)
# !response.include? "Error: These open pull requests may be duplicates"
# check_for_duplicate_pull_requests(formula, tap_full_name, new_formula_version.to_s)
end
def livecheck_formula(formula)
ohai "Checking livecheck formula : #{formula}" if Homebrew.args.verbose?
response = Utils.popen_read(HOMEBREW_BREW_FILE, "livecheck", formula, "--quiet").chomp
parse_livecheck_response(response)
end
def parse_livecheck_response(response)
output = response.delete(" ").split(/:|==>/)
# eg: ["openclonk", "7.0", "8.1"]
package_name, brew_version, latest_version = output
{
"formula" => package_name,
"current_brew_version" => brew_version,
"livecheck_latest_version" => latest_version,
}
end
def fetch_pull_requests(query, tap_full_name, state: nil)
GitHub.issues_for_formula(query, tap_full_name: tap_full_name, state: state).select do |pr|
pr["html_url"].include?("/pull/") &&
/(^|\s)#{Regexp.quote(query)}(:|\s|$)/i =~ pr["title"]
end
rescue GitHub::RateLimitExceededError => e
opoo e.message
[]
end
def check_for_duplicate_pull_requests(formula, version)
formula = Formula[formula]
tap_full_name = formula.tap&.full_name
# check for open requests
pull_requests = fetch_pull_requests(formula.name, tap_full_name, state: "open")
# if we haven't already found open requests, try for an exact match across all requests
pull_requests = fetch_pull_requests("#{formula.name} #{version}", tap_full_name) if pull_requests.blank?
return if pull_requests.blank?
pull_requests.map { |pr| { "title" => pr["title"], "url" => pr["html_url"] } }
end
end