Merge pull request #7927 from MLH-Fellowship/integrate-cask
Allow references to casks when running upgrade and outdated
This commit is contained in:
commit
2ff56c9e71
@ -3,6 +3,8 @@
|
|||||||
require "formula"
|
require "formula"
|
||||||
require "keg"
|
require "keg"
|
||||||
require "cli/parser"
|
require "cli/parser"
|
||||||
|
require "cask/cmd"
|
||||||
|
require "cask/caskroom"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module_function
|
module_function
|
||||||
@ -20,46 +22,80 @@ module Homebrew
|
|||||||
switch :verbose,
|
switch :verbose,
|
||||||
description: "Include detailed version information."
|
description: "Include detailed version information."
|
||||||
flag "--json",
|
flag "--json",
|
||||||
description: "Print output in JSON format. Currently the default and only accepted "\
|
description: "Print output in JSON format. There are two versions: v1 and v2. " \
|
||||||
"value for <version> is `v1`. See the docs for examples of using the JSON "\
|
"v1 is deprecated and is currently the default if no version is specified. " \
|
||||||
"output: <https://docs.brew.sh/Querying-Brew>"
|
"v2 prints outdated formulae and casks. "
|
||||||
switch "--fetch-HEAD",
|
switch "--fetch-HEAD",
|
||||||
description: "Fetch the upstream repository to detect if the HEAD installation of the "\
|
description: "Fetch the upstream repository to detect if the HEAD installation of the "\
|
||||||
"formula is outdated. Otherwise, the repository's HEAD will only be checked for "\
|
"formula is outdated. Otherwise, the repository's HEAD will only be checked for "\
|
||||||
"updates when a new stable or development version has been released."
|
"updates when a new stable or development version has been released."
|
||||||
|
switch "--greedy",
|
||||||
|
description: "Print outdated casks with `auto_updates` or `version :latest`."
|
||||||
|
switch "--formula",
|
||||||
|
description: "Treat all arguments as formulae."
|
||||||
|
switch "--cask",
|
||||||
|
description: "Treat all arguments as casks."
|
||||||
switch :debug
|
switch :debug
|
||||||
conflicts "--quiet", "--verbose", "--json"
|
conflicts "--quiet", "--verbose", "--json"
|
||||||
|
conflicts "--formula", "--cask"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def outdated
|
def outdated
|
||||||
outdated_args.parse
|
outdated_args.parse
|
||||||
|
|
||||||
formulae = if args.resolved_formulae.blank?
|
case json_version
|
||||||
Formula.installed
|
when :v1, :default
|
||||||
|
# TODO: enable for next major/minor release
|
||||||
|
# odeprecated "brew outdated --json#{json_version == :v1 ? "=v1" : ""}", "brew outdated --json=v2"
|
||||||
|
|
||||||
|
outdated = if args.formula? || !args.cask?
|
||||||
|
outdated_formulae
|
||||||
else
|
else
|
||||||
args.resolved_formulae
|
outdated_casks
|
||||||
end
|
end
|
||||||
if args.json
|
|
||||||
raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
|
|
||||||
|
|
||||||
outdated = print_outdated_json(formulae)
|
puts JSON.generate(json_info(outdated))
|
||||||
|
|
||||||
|
when :v2
|
||||||
|
formulae, casks = if args.formula?
|
||||||
|
[outdated_formulae, []]
|
||||||
|
elsif args.cask?
|
||||||
|
[[], outdated_casks]
|
||||||
else
|
else
|
||||||
outdated = print_outdated(formulae)
|
outdated_formulae_casks
|
||||||
end
|
|
||||||
Homebrew.failed = args.resolved_formulae.present? && !outdated.empty?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def print_outdated(formulae)
|
json = {
|
||||||
verbose = ($stdout.tty? || args.verbose?) && !args.quiet?
|
"formulae" => json_info(formulae),
|
||||||
fetch_head = args.fetch_HEAD?
|
"casks" => json_info(casks),
|
||||||
|
}
|
||||||
|
puts JSON.generate(json)
|
||||||
|
|
||||||
outdated_formulae = formulae.select { |f| f.outdated?(fetch_head: fetch_head) }
|
outdated = formulae + casks
|
||||||
.sort
|
|
||||||
|
|
||||||
outdated_formulae.each do |f|
|
else
|
||||||
if verbose
|
outdated = if args.formula?
|
||||||
outdated_kegs = f.outdated_kegs(fetch_head: fetch_head)
|
outdated_formulae
|
||||||
|
elsif args.cask?
|
||||||
|
outdated_casks
|
||||||
|
else
|
||||||
|
outdated_formulae_casks.flatten
|
||||||
|
end
|
||||||
|
|
||||||
|
print_outdated(outdated)
|
||||||
|
end
|
||||||
|
|
||||||
|
Homebrew.failed = args.named.present? && outdated.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def print_outdated(formulae_or_casks)
|
||||||
|
formulae_or_casks.each do |formula_or_cask|
|
||||||
|
if formula_or_cask.is_a?(Formula)
|
||||||
|
f = formula_or_cask
|
||||||
|
|
||||||
|
if verbose?
|
||||||
|
outdated_kegs = f.outdated_kegs(fetch_head: args.fetch_HEAD?)
|
||||||
|
|
||||||
current_version = if f.alias_changed?
|
current_version = if f.alias_changed?
|
||||||
latest = f.latest_formula
|
latest = f.latest_formula
|
||||||
@ -71,8 +107,7 @@ module Homebrew
|
|||||||
f.pkg_version.to_s
|
f.pkg_version.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
outdated_versions = outdated_kegs
|
outdated_versions = outdated_kegs.group_by { |keg| Formulary.from_keg(keg).full_name }
|
||||||
.group_by { |keg| Formulary.from_keg(keg).full_name }
|
|
||||||
.sort_by { |full_name, _kegs| full_name }
|
.sort_by { |full_name, _kegs| full_name }
|
||||||
.map do |full_name, kegs|
|
.map do |full_name, kegs|
|
||||||
"#{full_name} (#{kegs.map(&:version).join(", ")})"
|
"#{full_name} (#{kegs.map(&:version).join(", ")})"
|
||||||
@ -84,30 +119,86 @@ module Homebrew
|
|||||||
else
|
else
|
||||||
puts f.full_installed_specified_name
|
puts f.full_installed_specified_name
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
c = formula_or_cask
|
||||||
|
|
||||||
|
puts c.outdated_info(args.greedy?, verbose?, false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def print_outdated_json(formulae)
|
def json_info(formulae_or_casks)
|
||||||
json = []
|
formulae_or_casks.map do |formula_or_cask|
|
||||||
fetch_head = args.fetch_HEAD?
|
if formula_or_cask.is_a?(Formula)
|
||||||
outdated_formulae = formulae.select { |f| f.outdated?(fetch_head: fetch_head) }
|
f = formula_or_cask
|
||||||
|
|
||||||
outdated = outdated_formulae.each do |f|
|
outdated_versions = f.outdated_kegs(fetch_head: args.fetch_HEAD?).map(&:version)
|
||||||
outdated_versions = f.outdated_kegs(fetch_head: fetch_head).map(&:version)
|
|
||||||
current_version = if f.head? && outdated_versions.any? { |v| v.to_s == f.pkg_version.to_s }
|
current_version = if f.head? && outdated_versions.any? { |v| v.to_s == f.pkg_version.to_s }
|
||||||
"HEAD"
|
"HEAD"
|
||||||
else
|
else
|
||||||
f.pkg_version.to_s
|
f.pkg_version.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
json << { name: f.full_name,
|
{ name: f.full_name,
|
||||||
installed_versions: outdated_versions.map(&:to_s),
|
installed_versions: outdated_versions.map(&:to_s),
|
||||||
current_version: current_version,
|
current_version: current_version,
|
||||||
pinned: f.pinned?,
|
pinned: f.pinned?,
|
||||||
pinned_version: f.pinned_version }
|
pinned_version: f.pinned_version }
|
||||||
end
|
else
|
||||||
puts JSON.generate(json)
|
c = formula_or_cask
|
||||||
|
|
||||||
outdated
|
c.outdated_info(args.greedy?, verbose?, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def verbose?
|
||||||
|
($stdout.tty? || args.verbose?) && !args.quiet?
|
||||||
|
end
|
||||||
|
|
||||||
|
def json_version
|
||||||
|
version_hash = {
|
||||||
|
nil => nil,
|
||||||
|
true => :default,
|
||||||
|
"v1" => :v1,
|
||||||
|
"v2" => :v2,
|
||||||
|
}
|
||||||
|
|
||||||
|
raise UsageError, "invalid JSON version: #{args.json}" unless version_hash.include? args.json
|
||||||
|
|
||||||
|
version_hash[args.json]
|
||||||
|
end
|
||||||
|
|
||||||
|
def outdated_formulae
|
||||||
|
select_outdated((args.resolved_formulae.presence || Formula.installed)).sort
|
||||||
|
end
|
||||||
|
|
||||||
|
def outdated_casks
|
||||||
|
if args.named.present?
|
||||||
|
select_outdated(args.named.uniq.map(&Cask::CaskLoader.method(:load)))
|
||||||
|
else
|
||||||
|
select_outdated(Cask::Caskroom.casks)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def outdated_formulae_casks
|
||||||
|
formulae, casks = args.resolved_formulae_casks
|
||||||
|
|
||||||
|
if formulae.blank? && casks.blank?
|
||||||
|
formulae = Formula.installed
|
||||||
|
casks = Cask::Caskroom.casks
|
||||||
|
end
|
||||||
|
|
||||||
|
[select_outdated(formulae), select_outdated(casks)]
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_outdated(formulae_or_casks)
|
||||||
|
formulae_or_casks.select do |formula_or_cask|
|
||||||
|
if formula_or_cask.is_a?(Formula)
|
||||||
|
formula_or_cask.outdated?(fetch_head: args.fetch_HEAD?)
|
||||||
|
else
|
||||||
|
formula_or_cask.outdated?(args.greedy?)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,6 +4,9 @@ require "cli/parser"
|
|||||||
require "formula_installer"
|
require "formula_installer"
|
||||||
require "install"
|
require "install"
|
||||||
require "upgrade"
|
require "upgrade"
|
||||||
|
require "cask/cmd"
|
||||||
|
require "cask/utils"
|
||||||
|
require "cask/macos"
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module_function
|
module_function
|
||||||
@ -50,6 +53,8 @@ module Homebrew
|
|||||||
description: "Print install times for each formula at the end of the run."
|
description: "Print install times for each formula at the end of the run."
|
||||||
switch "-n", "--dry-run",
|
switch "-n", "--dry-run",
|
||||||
description: "Show what would be upgraded, but do not actually upgrade anything."
|
description: "Show what would be upgraded, but do not actually upgrade anything."
|
||||||
|
switch "--greedy",
|
||||||
|
description: "Upgrade casks with `auto_updates` or `version :latest`"
|
||||||
conflicts "--build-from-source", "--force-bottle"
|
conflicts "--build-from-source", "--force-bottle"
|
||||||
formula_options
|
formula_options
|
||||||
end
|
end
|
||||||
@ -58,22 +63,27 @@ module Homebrew
|
|||||||
def upgrade
|
def upgrade
|
||||||
args = upgrade_args.parse
|
args = upgrade_args.parse
|
||||||
|
|
||||||
|
formulae, casks = args.resolved_formulae_casks
|
||||||
|
|
||||||
|
upgrade_outdated_formulae(formulae)
|
||||||
|
upgrade_outdated_casks(casks)
|
||||||
|
end
|
||||||
|
|
||||||
|
def upgrade_outdated_formulae(formulae)
|
||||||
FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
|
FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
|
||||||
|
|
||||||
Install.perform_preinstall_checks
|
Install.perform_preinstall_checks
|
||||||
|
|
||||||
if args.no_named?
|
if formulae.blank?
|
||||||
outdated = Formula.installed.select do |f|
|
outdated = Formula.installed.select do |f|
|
||||||
f.outdated?(fetch_head: args.fetch_HEAD?)
|
f.outdated?(fetch_head: args.fetch_HEAD?)
|
||||||
end
|
end
|
||||||
|
|
||||||
exit 0 if outdated.empty?
|
|
||||||
else
|
else
|
||||||
outdated = args.resolved_formulae.select do |f|
|
outdated, not_outdated = formulae.partition do |f|
|
||||||
f.outdated?(fetch_head: args.fetch_HEAD?)
|
f.outdated?(fetch_head: args.fetch_HEAD?)
|
||||||
end
|
end
|
||||||
|
|
||||||
(args.resolved_formulae - outdated).each do |f|
|
not_outdated.each do |f|
|
||||||
versions = f.installed_kegs.map(&:version)
|
versions = f.installed_kegs.map(&:version)
|
||||||
if versions.empty?
|
if versions.empty?
|
||||||
ofail "#{f.full_specified_name} not installed"
|
ofail "#{f.full_specified_name} not installed"
|
||||||
@ -82,9 +92,10 @@ module Homebrew
|
|||||||
opoo "#{f.full_specified_name} #{version} already installed"
|
opoo "#{f.full_specified_name} #{version} already installed"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return if outdated.empty?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return if outdated.blank?
|
||||||
|
|
||||||
pinned = outdated.select(&:pinned?)
|
pinned = outdated.select(&:pinned?)
|
||||||
outdated -= pinned
|
outdated -= pinned
|
||||||
formulae_to_install = outdated.map(&:latest_formula)
|
formulae_to_install = outdated.map(&:latest_formula)
|
||||||
@ -115,4 +126,12 @@ module Homebrew
|
|||||||
|
|
||||||
Homebrew.messages.display_messages
|
Homebrew.messages.display_messages
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def upgrade_outdated_casks(casks)
|
||||||
|
cask_upgrade = Cask::Cmd::Upgrade.new(casks)
|
||||||
|
cask_upgrade.force = args.force?
|
||||||
|
cask_upgrade.dry_run = args.dry_run?
|
||||||
|
cask_upgrade.greedy = args.greedy?
|
||||||
|
cask_upgrade.run
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -23,7 +23,6 @@ describe "brew outdated", :integration_test do
|
|||||||
|
|
||||||
expect { brew "outdated", "--json=v1" }
|
expect { brew "outdated", "--json=v1" }
|
||||||
.to output(expected_json + "\n").to_stdout
|
.to output(expected_json + "\n").to_stdout
|
||||||
.and not_to_output.to_stderr
|
|
||||||
.and be_a_success
|
.and be_a_success
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -356,9 +356,15 @@ otherwise.
|
|||||||
* `-v`, `--verbose`:
|
* `-v`, `--verbose`:
|
||||||
Include detailed version information.
|
Include detailed version information.
|
||||||
* `--json`:
|
* `--json`:
|
||||||
Print output in JSON format. Currently the default and only accepted value for *`version`* is `v1`. See the docs for examples of using the JSON output: <https://docs.brew.sh/Querying-Brew>
|
Print output in JSON format. There are two versions: v1 and v2. v1 is deprecated and is currently the default if no version is specified. v2 prints outdated formulae and casks.
|
||||||
* `--fetch-HEAD`:
|
* `--fetch-HEAD`:
|
||||||
Fetch the upstream repository to detect if the HEAD installation of the formula is outdated. Otherwise, the repository's HEAD will only be checked for updates when a new stable or development version has been released.
|
Fetch the upstream repository to detect if the HEAD installation of the formula is outdated. Otherwise, the repository's HEAD will only be checked for updates when a new stable or development version has been released.
|
||||||
|
* `--greedy`:
|
||||||
|
Print outdated casks with `auto_updates` or `version :latest`.
|
||||||
|
* `--formula`:
|
||||||
|
Treat all arguments as formulae.
|
||||||
|
* `--cask`:
|
||||||
|
Treat all arguments as casks.
|
||||||
|
|
||||||
### `pin` *`formula`*
|
### `pin` *`formula`*
|
||||||
|
|
||||||
@ -556,6 +562,8 @@ the upgraded formulae or, every 30 days, for all formulae.
|
|||||||
Print install times for each formula at the end of the run.
|
Print install times for each formula at the end of the run.
|
||||||
* `-n`, `--dry-run`:
|
* `-n`, `--dry-run`:
|
||||||
Show what would be upgraded, but do not actually upgrade anything.
|
Show what would be upgraded, but do not actually upgrade anything.
|
||||||
|
* `--greedy`:
|
||||||
|
Upgrade casks with `auto_updates` or `version :latest`
|
||||||
|
|
||||||
### `uses` [*`options`*] *`formula`*
|
### `uses` [*`options`*] *`formula`*
|
||||||
|
|
||||||
|
@ -477,12 +477,24 @@ Include detailed version information\.
|
|||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-json\fR
|
\fB\-\-json\fR
|
||||||
Print output in JSON format\. Currently the default and only accepted value for \fIversion\fR is \fBv1\fR\. See the docs for examples of using the JSON output: \fIhttps://docs\.brew\.sh/Querying\-Brew\fR
|
Print output in JSON format\. There are two versions: v1 and v2\. v1 is deprecated and is currently the default if no version is specified\. v2 prints outdated formulae and casks\.
|
||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-fetch\-HEAD\fR
|
\fB\-\-fetch\-HEAD\fR
|
||||||
Fetch the upstream repository to detect if the HEAD installation of the formula is outdated\. Otherwise, the repository\'s HEAD will only be checked for updates when a new stable or development version has been released\.
|
Fetch the upstream repository to detect if the HEAD installation of the formula is outdated\. Otherwise, the repository\'s HEAD will only be checked for updates when a new stable or development version has been released\.
|
||||||
.
|
.
|
||||||
|
.TP
|
||||||
|
\fB\-\-greedy\fR
|
||||||
|
Print outdated casks with \fBauto_updates\fR or \fBversion :latest\fR\.
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
\fB\-\-formula\fR
|
||||||
|
Treat all arguments as formulae\.
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
\fB\-\-cask\fR
|
||||||
|
Treat all arguments as casks\.
|
||||||
|
.
|
||||||
.SS "\fBpin\fR \fIformula\fR"
|
.SS "\fBpin\fR \fIformula\fR"
|
||||||
Pin the specified \fIformula\fR, preventing them from being upgraded when issuing the \fBbrew upgrade\fR \fIformula\fR command\. See also \fBunpin\fR\.
|
Pin the specified \fIformula\fR, preventing them from being upgraded when issuing the \fBbrew upgrade\fR \fIformula\fR command\. See also \fBunpin\fR\.
|
||||||
.
|
.
|
||||||
@ -722,6 +734,10 @@ Print install times for each formula at the end of the run\.
|
|||||||
\fB\-n\fR, \fB\-\-dry\-run\fR
|
\fB\-n\fR, \fB\-\-dry\-run\fR
|
||||||
Show what would be upgraded, but do not actually upgrade anything\.
|
Show what would be upgraded, but do not actually upgrade anything\.
|
||||||
.
|
.
|
||||||
|
.TP
|
||||||
|
\fB\-\-greedy\fR
|
||||||
|
Upgrade casks with \fBauto_updates\fR or \fBversion :latest\fR
|
||||||
|
.
|
||||||
.SS "\fBuses\fR [\fIoptions\fR] \fIformula\fR"
|
.SS "\fBuses\fR [\fIoptions\fR] \fIformula\fR"
|
||||||
Show formulae that specify \fIformula\fR as a dependency (i\.e\. show dependents of \fIformula\fR)\. When given multiple formula arguments, show the intersection of formulae that use \fIformula\fR\. By default, \fBuses\fR shows all formulae that specify \fIformula\fR as a required or recommended dependency for their stable builds\.
|
Show formulae that specify \fIformula\fR as a dependency (i\.e\. show dependents of \fIformula\fR)\. When given multiple formula arguments, show the intersection of formulae that use \fIformula\fR\. By default, \fBuses\fR shows all formulae that specify \fIformula\fR as a required or recommended dependency for their stable builds\.
|
||||||
.
|
.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user