dev-cmd/bump: add cask support

This commit is contained in:
nandahkrishna 2021-02-17 00:09:02 +05:30
parent 74fd6c823c
commit 24bb6040a7
No known key found for this signature in database
GPG Key ID: 067E5FCD58ADF3AA
8 changed files with 139 additions and 56 deletions

View File

@ -16,66 +16,107 @@ module Homebrew
Display out-of-date brew formulae and the latest version available. Display out-of-date brew formulae and the latest version available.
Also displays whether a pull request has been opened with the URL. Also displays whether a pull request has been opened with the URL.
EOS EOS
switch "--no-pull-requests",
description: "Do not retrieve pull requests from GitHub."
switch "--formula", "--formulae",
description: "Check only formulae."
switch "--cask", "--casks",
description: "Check only casks."
flag "--limit=", flag "--limit=",
description: "Limit number of package results returned." description: "Limit number of package results returned."
named_args :formula conflicts "--cask", "--formula"
named_args [:formula, :cask]
end end
end end
def bump def bump
args = bump_args.parse args = bump_args.parse
requested_formulae = args.named.to_formulae.presence if args.limit.present? && !args.formula? && !args.cask?
requested_limit = args.limit.to_i if args.limit.present? raise UsageError, "`--limit` must be used with either `--formula` or `--cask`."
end
if requested_formulae formulae_and_casks = if args.formula?
Livecheck.load_other_tap_strategies(requested_formulae) args.named.to_formulae.presence
elsif args.cask?
args.named.to_casks.presence
else
args.named.to_formulae_and_casks.presence
end
requested_formulae.each_with_index do |formula, i| limit = args.limit.to_i if args.limit.present?
if formulae_and_casks
Livecheck.load_other_tap_strategies(formulae_and_casks)
formulae_and_casks.each_with_index do |formula_or_cask, i|
puts if i.positive? puts if i.positive?
if formula.head_only? name = Livecheck.formula_or_cask_name(formula_or_cask)
ohai formula.name repository = if formula_or_cask.is_a?(Formula)
if formula_or_cask.head_only?
ohai name
puts "Formula is HEAD-only." puts "Formula is HEAD-only."
next next
end end
package_data = Repology.single_package_query(formula.name) "homebrew"
retrieve_and_display_info(formula, package_data&.values&.first) else
"homebrew_casks"
end
package_data = Repology.single_package_query(name, repository: repository)
retrieve_and_display_info(formula_or_cask, name, package_data&.values&.first, args: args)
end end
else else
outdated_packages = Repology.parse_api_response(requested_limit) api_response = {}
outdated_packages.each_with_index do |(_name, repositories), i| api_response[:formulae] = Repology.parse_api_response(limit, repository: "homebrew") unless args.cask?
puts if i.positive? api_response[:casks] = Repology.parse_api_response(limit, repository: "homebrew_casks") unless args.formula?
api_response.each do |package_type, outdated_packages|
repository = if package_type == :formulae
"homebrew"
else
"homebrew_casks"
end
outdated_packages.each_with_index do |(_name, repositories), i|
homebrew_repo = repositories.find do |repo| homebrew_repo = repositories.find do |repo|
repo["repo"] == "homebrew" repo["repo"] == repository
end end
next if homebrew_repo.blank? next if homebrew_repo.blank?
formula = begin formula_or_cask = begin
if repository == "homebrew"
Formula[homebrew_repo["srcname"]] Formula[homebrew_repo["srcname"]]
else
Cask::CaskLoader.load(homebrew_repo["srcname"])
end
rescue rescue
next next
end end
name = Livecheck.formula_or_cask_name(formula_or_cask)
retrieve_and_display_info(formula, repositories) puts if i.positive?
retrieve_and_display_info(formula_or_cask, name, repositories, args: args)
break if requested_limit && i >= requested_limit break if limit && i >= limit
end
end end
end end
end end
def livecheck_result(formula) def livecheck_result(formula_or_cask)
skip_result = Livecheck::SkipConditions.skip_information(formula) skip_result = Livecheck::SkipConditions.skip_information(formula_or_cask)
if skip_result.present? if skip_result.present?
return "#{skip_result[:status]}#{" - #{skip_result[:messages].join(", ")}" if skip_result[:messages].present?}" return "#{skip_result[:status]}#{" - #{skip_result[:messages].join(", ")}" if skip_result[:messages].present?}"
end end
version_info = Livecheck.latest_version( version_info = Livecheck.latest_version(
formula, formula_or_cask,
json: true, full_name: false, verbose: false, debug: false, json: true, full_name: false, verbose: false, debug: false,
) )
latest = version_info[:latest] if version_info.present? latest = version_info[:latest] if version_info.present?
@ -85,8 +126,8 @@ module Homebrew
latest.to_s latest.to_s
end end
def retrieve_pull_requests(formula) def retrieve_pull_requests(formula_or_cask, name)
pull_requests = GitHub.fetch_pull_requests(formula.name, formula.tap&.full_name, state: "open") pull_requests = GitHub.fetch_pull_requests(name, formula_or_cask.tap&.full_name, state: "open")
if pull_requests.try(:any?) if pull_requests.try(:any?)
pull_requests = pull_requests.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }.join(", ") pull_requests = pull_requests.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }.join(", ")
end end
@ -96,8 +137,12 @@ module Homebrew
pull_requests pull_requests
end end
def retrieve_and_display_info(formula, repositories) def retrieve_and_display_info(formula_or_cask, name, repositories, args:)
current_version = formula.stable.version.to_s current_version = if formula_or_cask.is_a?(Formula)
formula_or_cask.stable.version
else
Version.new(formula_or_cask.version)
end
repology_latest = if repositories.present? repology_latest = if repositories.present?
Repology.latest_version(repositories) Repology.latest_version(repositories)
@ -105,14 +150,14 @@ module Homebrew
"not found" "not found"
end end
livecheck_latest = livecheck_result(formula) livecheck_latest = livecheck_result(formula_or_cask)
pull_requests = retrieve_pull_requests(formula) pull_requests = retrieve_pull_requests(formula_or_cask, name) unless args.no_pull_requests?
title = if current_version == repology_latest && title = if current_version == repology_latest &&
current_version == livecheck_latest current_version == livecheck_latest
"#{formula} is up to date!" "#{name} is up to date!"
else else
formula.name name
end end
ohai title ohai title
@ -120,7 +165,7 @@ module Homebrew
Current formula version: #{current_version} Current formula version: #{current_version}
Latest Repology version: #{repology_latest} Latest Repology version: #{repology_latest}
Latest livecheck version: #{livecheck_latest} Latest livecheck version: #{livecheck_latest}
Open pull requests: #{pull_requests}
EOS EOS
puts "Open pull requests: #{pull_requests}" unless args.no_pull_requests?
end end
end end

View File

@ -6,13 +6,13 @@ require "utils/repology"
describe Repology do describe Repology do
describe "single_package_query", :needs_network do describe "single_package_query", :needs_network do
it "returns nil for non-existent package" do it "returns nil for non-existent package" do
response = described_class.single_package_query("invalidName") response = described_class.single_package_query("invalidName", repository: "homebrew")
expect(response).to be_nil expect(response).to be_nil
end end
it "returns a hash for existing package" do it "returns a hash for existing package" do
response = described_class.single_package_query("openclonk") response = described_class.single_package_query("openclonk", repository: "homebrew")
expect(response).not_to be_nil expect(response).not_to be_nil
expect(response).to be_a(Hash) expect(response).to be_a(Hash)
@ -22,7 +22,7 @@ describe Repology do
describe "parse_api_response", :needs_network do describe "parse_api_response", :needs_network do
it "returns a hash of data" do it "returns a hash of data" do
limit = 1 limit = 1
response = described_class.parse_api_response(limit) response = described_class.parse_api_response(limit, repository: "homebrew")
expect(response).not_to be_nil expect(response).not_to be_nil
expect(response).to be_a(Hash) expect(response).to be_a(Hash)

View File

@ -12,16 +12,16 @@ module Repology
MAX_PAGINATION = 15 MAX_PAGINATION = 15
private_constant :MAX_PAGINATION private_constant :MAX_PAGINATION
def query_api(last_package_in_response = "") def query_api(last_package_in_response = "", repository:)
last_package_in_response += "/" if last_package_in_response.present? last_package_in_response += "/" if last_package_in_response.present?
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=#{repository}&outdated=1"
output, _errors, _status = curl_output(url.to_s) output, _errors, _status = curl_output(url.to_s)
JSON.parse(output) JSON.parse(output)
end end
def single_package_query(name) def single_package_query(name, repository:)
url = "https://repology.org/tools/project-by?repo=homebrew&" \ url = "https://repology.org/tools/project-by?repo=#{repository}&" \
"name_type=srcname&target_page=api_v1_project&name=#{name}" "name_type=srcname&target_page=api_v1_project&name=#{name}"
output, _errors, _status = curl_output("--location", url.to_s) output, _errors, _status = curl_output("--location", url.to_s)
@ -34,26 +34,34 @@ module Repology
end end
end end
def parse_api_response(limit = nil) def parse_api_response(limit = nil, repository:)
ohai "Querying outdated packages from Repology" package_term = case repository
when "homebrew"
"formula"
when "homebrew_casks"
"cask"
else
"package"
end
ohai "Querying outdated #{package_term.pluralize} from Repology"
page_no = 1 page_no = 1
outdated_packages = {} outdated_packages = {}
last_package_index = "" last_package = ""
while page_no <= MAX_PAGINATION while page_no <= MAX_PAGINATION
odebug "Paginating Repology API page: #{page_no}" odebug "Paginating Repology API page: #{page_no}"
response = query_api(last_package_index.to_s) response = query_api(last_package, repository: repository)
response_size = response.size
outdated_packages.merge!(response) outdated_packages.merge!(response)
last_package_index = outdated_packages.size - 1 last_package = response.keys.last
page_no += 1 page_no += 1
break if limit && outdated_packages.size >= limit || response_size <= 1 break if limit && outdated_packages.size >= limit || response.size <= 1
end end
puts "#{outdated_packages.size} outdated #{"package".pluralize(outdated_packages.size)} found" puts "#{outdated_packages.size} outdated #{package_term.pluralize(outdated_packages.size)} found"
puts puts
outdated_packages outdated_packages

View File

@ -427,9 +427,12 @@ _brew_bump() {
case "$cur" in case "$cur" in
-*) -*)
__brewcomp " __brewcomp "
--cask
--debug --debug
--formula
--help --help
--limit --limit
--no-pull-requests
--quiet --quiet
--verbose --verbose
" "
@ -437,6 +440,7 @@ _brew_bump() {
;; ;;
esac esac
__brew_complete_formulae __brew_complete_formulae
__brew_complete_casks
} }
_brew_bump_cask_pr() { _brew_bump_cask_pr() {

View File

@ -387,12 +387,16 @@ __fish_brew_complete_arg 'bottle' -a '(__fish_brew_suggest_formulae_installed)'
__fish_brew_complete_cmd 'bump' 'Display out-of-date brew formulae and the latest version available' __fish_brew_complete_cmd 'bump' 'Display out-of-date brew formulae and the latest version available'
__fish_brew_complete_arg 'bump' -l cask -d 'Check only casks'
__fish_brew_complete_arg 'bump' -l debug -d 'Display any debugging information' __fish_brew_complete_arg 'bump' -l debug -d 'Display any debugging information'
__fish_brew_complete_arg 'bump' -l formula -d 'Check only formulae'
__fish_brew_complete_arg 'bump' -l help -d 'Show this message' __fish_brew_complete_arg 'bump' -l help -d 'Show this message'
__fish_brew_complete_arg 'bump' -l limit -d 'Limit number of package results returned' __fish_brew_complete_arg 'bump' -l limit -d 'Limit number of package results returned'
__fish_brew_complete_arg 'bump' -l no-pull-requests -d 'Do not retrieve pull requests from GitHub'
__fish_brew_complete_arg 'bump' -l quiet -d 'Make some output more quiet' __fish_brew_complete_arg 'bump' -l quiet -d 'Make some output more quiet'
__fish_brew_complete_arg 'bump' -l verbose -d 'Make some output more verbose' __fish_brew_complete_arg 'bump' -l verbose -d 'Make some output more verbose'
__fish_brew_complete_arg 'bump' -a '(__fish_brew_suggest_formulae_all)' __fish_brew_complete_arg 'bump' -a '(__fish_brew_suggest_formulae_all)'
__fish_brew_complete_arg 'bump' -a '(__fish_brew_suggest_casks_all)'
__fish_brew_complete_cmd 'bump-cask-pr' 'Create a pull request to update cask with a new version' __fish_brew_complete_cmd 'bump-cask-pr' 'Create a pull request to update cask with a new version'

View File

@ -469,12 +469,16 @@ _brew_bottle() {
# brew bump # brew bump
_brew_bump() { _brew_bump() {
_arguments \ _arguments \
'(--formula)--cask[Check only casks]' \
'--debug[Display any debugging information]' \ '--debug[Display any debugging information]' \
'(--cask)--formula[Check only formulae]' \
'--help[Show this message]' \ '--help[Show this message]' \
'--limit[Limit number of package results returned]' \ '--limit[Limit number of package results returned]' \
'--no-pull-requests[Do not retrieve pull requests from GitHub]' \
'--quiet[Make some output more quiet]' \ '--quiet[Make some output more quiet]' \
'--verbose[Make some output more verbose]' \ '--verbose[Make some output more verbose]' \
'::formula:__brew_formulae' '::formula:__brew_formulae' \
'::cask:__brew_casks'
} }
# brew bump-cask-pr # brew bump-cask-pr

View File

@ -826,11 +826,17 @@ value, while `--no-rebuild` will remove it.
* `--root-url`: * `--root-url`:
Use the specified *`URL`* as the root of the bottle's URL instead of Homebrew's default. Use the specified *`URL`* as the root of the bottle's URL instead of Homebrew's default.
### `bump` [*`--limit`*`=`] [*`formula`* ...] ### `bump` [*`options`*] [*`formula`*|*`cask`* ...]
Display out-of-date brew formulae and the latest version available. Display out-of-date brew formulae and the latest version available.
Also displays whether a pull request has been opened with the URL. Also displays whether a pull request has been opened with the URL.
* `--no-pull-requests`:
Do not retrieve pull requests from GitHub.
* `--formula`:
Check only formulae.
* `--cask`:
Check only casks.
* `--limit`: * `--limit`:
Limit number of package results returned. Limit number of package results returned.

View File

@ -1132,10 +1132,22 @@ When passed with \fB\-\-write\fR, a new commit will not generated after writing
\fB\-\-root\-url\fR \fB\-\-root\-url\fR
Use the specified \fIURL\fR as the root of the bottle\'s URL instead of Homebrew\'s default\. Use the specified \fIURL\fR as the root of the bottle\'s URL instead of Homebrew\'s default\.
. .
.SS "\fBbump\fR [\fI\-\-limit\fR\fB=\fR] [\fIformula\fR \.\.\.]" .SS "\fBbump\fR [\fIoptions\fR] [\fIformula\fR|\fIcask\fR \.\.\.]"
Display out\-of\-date brew formulae and the latest version available\. Also displays whether a pull request has been opened with the URL\. Display out\-of\-date brew formulae and the latest version available\. Also displays whether a pull request has been opened with the URL\.
. .
.TP .TP
\fB\-\-no\-pull\-requests\fR
Do not retrieve pull requests from GitHub\.
.
.TP
\fB\-\-formula\fR
Check only formulae\.
.
.TP
\fB\-\-cask\fR
Check only casks\.
.
.TP
\fB\-\-limit\fR \fB\-\-limit\fR
Limit number of package results returned\. Limit number of package results returned\.
. .