mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
dev-cmd/bump: add cask support
This commit is contained in:
parent
74fd6c823c
commit
24bb6040a7
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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() {
|
||||||
|
@ -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'
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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\.
|
||||||
.
|
.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user