Add livecheck version and duplicate pr check
This commit is contained in:
		
							parent
							
								
									0c8f977665
								
							
						
					
					
						commit
						ea2f4087fe
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user