add command 'cask outdated'
This commit is contained in:
parent
4d88cc4c41
commit
7532545140
@ -89,6 +89,30 @@ module Hbc
|
||||
metadata_master_container_path.join(*installed_version, "Casks", "#{token}.rb")
|
||||
end
|
||||
|
||||
def outdated?(greedy = false)
|
||||
!outdated_versions(greedy).empty?
|
||||
end
|
||||
|
||||
def outdated_versions(greedy = false)
|
||||
# special case: tap version is not available
|
||||
return [] if version.nil?
|
||||
|
||||
if greedy
|
||||
return versions if version.latest?
|
||||
elsif auto_updates
|
||||
return []
|
||||
end
|
||||
|
||||
installed = versions
|
||||
current = installed.last
|
||||
|
||||
# not outdated unless there is a different version on tap
|
||||
return [] if current == version
|
||||
|
||||
# collect all installed versions that are different than tap version and return them
|
||||
installed.select { |v| v != version }
|
||||
end
|
||||
|
||||
def to_s
|
||||
@token
|
||||
end
|
||||
|
||||
@ -15,6 +15,7 @@ require "hbc/cli/home"
|
||||
require "hbc/cli/info"
|
||||
require "hbc/cli/install"
|
||||
require "hbc/cli/list"
|
||||
require "hbc/cli/outdated"
|
||||
require "hbc/cli/reinstall"
|
||||
require "hbc/cli/search"
|
||||
require "hbc/cli/style"
|
||||
|
||||
39
Library/Homebrew/cask/lib/hbc/cli/outdated.rb
Normal file
39
Library/Homebrew/cask/lib/hbc/cli/outdated.rb
Normal file
@ -0,0 +1,39 @@
|
||||
module Hbc
|
||||
class CLI
|
||||
class Outdated < Base
|
||||
def self.run(*args)
|
||||
greedy = args.include?("--greedy")
|
||||
verbose = ($stdout.tty? || CLI.verbose?) && !args.include?("--quiet")
|
||||
|
||||
cask_tokens = cask_tokens_from(args)
|
||||
casks_to_check = if cask_tokens.empty?
|
||||
Hbc.installed
|
||||
else
|
||||
cask_tokens.map { |token| Hbc.load(token) }
|
||||
end
|
||||
|
||||
casks_to_check.each do |cask|
|
||||
odebug "Checking update info of Cask #{cask}"
|
||||
list_if_outdated(cask, greedy, verbose)
|
||||
end
|
||||
end
|
||||
|
||||
def self.list_if_outdated(cask, greedy, verbose)
|
||||
return unless cask.outdated?(greedy)
|
||||
|
||||
if verbose
|
||||
outdated_versions = cask.outdated_versions(greedy)
|
||||
outdated_info = "#{cask.token} (#{outdated_versions.join(", ")})"
|
||||
current_version = cask.version.to_s
|
||||
puts "#{outdated_info} != #{current_version}"
|
||||
else
|
||||
puts cask.token
|
||||
end
|
||||
end
|
||||
|
||||
def self.help
|
||||
"list the outdated installed Casks"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -85,6 +85,17 @@ names, and other aspects of this manual are still subject to change.
|
||||
|
||||
If <token> is given, summarize the staged files associated with the
|
||||
given Cask.
|
||||
|
||||
* `outdated` [--greedy] [--verbose|--quiet] [ <token> ...]:
|
||||
Without token arguments, display all the installed Casks that have newer
|
||||
versions available in the tap; otherwise check only the tokens given
|
||||
in the command line.
|
||||
If `--greedy` is given then also include in the output the Casks having
|
||||
`auto_updates true` or `version :latest`. Otherwise they are skipped
|
||||
because there is no reliable way to know when updates are available for
|
||||
them.<br>
|
||||
`--verbose` forces the display of the outdated and latest version.<br>
|
||||
`--quiet` suppresses the display of versions.
|
||||
|
||||
* `reinstall` <token> [ <token> ... ]:
|
||||
Reinstall the given Cask.
|
||||
|
||||
@ -89,4 +89,89 @@ describe Hbc::Cask, :cask do
|
||||
expect(c.metadata_versioned_container_path.to_s).to eq(metadata_path.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
describe "outdated" do
|
||||
it "ignores the Casks that have auto_updates true (without --greedy)" do
|
||||
c = Hbc.load("auto-updates")
|
||||
expect(c).not_to be_outdated
|
||||
expect(c.outdated_versions).to be_empty
|
||||
end
|
||||
|
||||
it "ignores the Casks that have version :latest (without --greedy)" do
|
||||
c = Hbc.load("version-latest-string")
|
||||
expect(c).not_to be_outdated
|
||||
expect(c.outdated_versions).to be_empty
|
||||
end
|
||||
|
||||
describe "versioned casks" do
|
||||
let(:cask) { described_class.new("basic-cask") }
|
||||
subject { cask.outdated_versions }
|
||||
|
||||
shared_examples "versioned casks" do |tap_version, expectations|
|
||||
expectations.each do |installed_versions, expected_output|
|
||||
context "when versions #{installed_versions.inspect} are installed and the tap version is #{tap_version}" do
|
||||
it {
|
||||
allow(cask).to receive(:versions).and_return(installed_versions)
|
||||
allow(cask).to receive(:version).and_return(Hbc::DSL::Version.new(tap_version))
|
||||
expect(cask).to receive(:outdated_versions).and_call_original
|
||||
is_expected.to eq expected_output
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "installed version is equal to tap version => not outdated" do
|
||||
include_examples "versioned casks", "1.2.3",
|
||||
["1.2.3"] => [],
|
||||
["1.2.4", "1.2.3"] => []
|
||||
end
|
||||
|
||||
describe "installed version is different than tap version => outdated" do
|
||||
include_examples "versioned casks", "1.2.4",
|
||||
["1.2.3"] => ["1.2.3"],
|
||||
["1.2.4", "1.2.3"] => ["1.2.3"],
|
||||
["1.2.2", "1.2.3"] => ["1.2.2", "1.2.3"],
|
||||
["1.2.2", "1.2.4", "1.2.3"] => ["1.2.2", "1.2.3"]
|
||||
end
|
||||
end
|
||||
|
||||
describe ":latest casks" do
|
||||
let(:cask) { described_class.new("basic-cask") }
|
||||
|
||||
shared_examples ":latest cask" do |greedy, tap_version, expectations|
|
||||
expectations.each do |installed_version, expected_output|
|
||||
context "when versions #{installed_version} are installed and the tap version is #{tap_version}, #{greedy ? "" : "not"} greedy" do
|
||||
subject { cask.outdated_versions greedy }
|
||||
it {
|
||||
allow(cask).to receive(:versions).and_return(installed_version)
|
||||
allow(cask).to receive(:version).and_return(Hbc::DSL::Version.new(tap_version))
|
||||
expect(cask).to receive(:outdated_versions).and_call_original
|
||||
is_expected.to eq expected_output
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe ":latest version installed, :latest version in tap" do
|
||||
include_examples ":latest cask", false, "latest",
|
||||
["latest"] => []
|
||||
include_examples ":latest cask", true, "latest",
|
||||
["latest"] => ["latest"]
|
||||
end
|
||||
|
||||
describe "numbered version installed, :latest version in tap" do
|
||||
include_examples ":latest cask", false, "latest",
|
||||
["1.2.3"] => ["1.2.3"]
|
||||
include_examples ":latest cask", true, "latest",
|
||||
["1.2.3"] => ["1.2.3"]
|
||||
end
|
||||
|
||||
describe "latest version installed, numbered version in tap" do
|
||||
include_examples ":latest cask", false, "1.2.3",
|
||||
["latest"] => ["latest"]
|
||||
include_examples ":latest cask", true, "1.2.3",
|
||||
["latest"] => ["latest"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
80
Library/Homebrew/test/cask/cli/outdated_spec.rb
Normal file
80
Library/Homebrew/test/cask/cli/outdated_spec.rb
Normal file
@ -0,0 +1,80 @@
|
||||
describe Hbc::CLI::Outdated, :cask do
|
||||
let(:installed) do
|
||||
[
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb"),
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/outdated/local-caffeine.rb"),
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/outdated/local-transmission.rb"),
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/version-latest-string.rb"),
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/outdated/auto-updates.rb"),
|
||||
]
|
||||
end
|
||||
|
||||
before do
|
||||
shutup do
|
||||
installed.each { |cask| InstallHelper.install_with_caskfile(cask) }
|
||||
end
|
||||
allow(Hbc::CLI).to receive(:verbose?).and_return(true)
|
||||
end
|
||||
|
||||
describe 'without --greedy it ignores the Casks with "vesion latest" or "auto_updates true"' do
|
||||
it "checks all the installed Casks when no token is provided" do
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine (1.2.2) != 1.2.3
|
||||
local-transmission (2.60) != 2.61
|
||||
EOS
|
||||
end
|
||||
|
||||
it "checks only the tokens specified in the command line" do
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run("local-caffeine")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine (1.2.2) != 1.2.3
|
||||
EOS
|
||||
end
|
||||
|
||||
it 'ignores "auto_updates" and "latest" Casks even when their tokens are provided in the command line' do
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run("local-caffeine", "auto-updates", "version-latest-string")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine (1.2.2) != 1.2.3
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
it "lists only the names (no versions) of the outdated Casks with --quiet" do
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run("--quiet")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine
|
||||
local-transmission
|
||||
EOS
|
||||
end
|
||||
|
||||
describe "with --greedy it checks additional Casks" do
|
||||
it 'includes the Casks with "auto_updates true" or "version latest" with --greedy' do
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run("--greedy")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
auto-updates (2.57) != 2.61
|
||||
local-caffeine (1.2.2) != 1.2.3
|
||||
local-transmission (2.60) != 2.61
|
||||
version-latest-string (latest) != latest
|
||||
EOS
|
||||
end
|
||||
|
||||
it 'does not include the Casks with "auto_updates true" when the version did not change' do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
InstallHelper.install_with_caskfile(cask)
|
||||
|
||||
expect {
|
||||
Hbc::CLI::Outdated.run("--greedy")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine (1.2.2) != 1.2.3
|
||||
local-transmission (2.60) != 2.61
|
||||
version-latest-string (latest) != latest
|
||||
EOS
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,11 @@
|
||||
cask 'auto-updates' do
|
||||
version '2.57'
|
||||
sha256 'e44ffa103fbf83f55c8d0b1bea309a43b2880798dae8620b1ee8da5e1095ec68'
|
||||
|
||||
url "file://#{TEST_FIXTURE_DIR}/cask/transmission-2.61.dmg"
|
||||
homepage 'http://example.com/auto-updates'
|
||||
|
||||
auto_updates true
|
||||
|
||||
app 'Transmission.app'
|
||||
end
|
||||
@ -0,0 +1,9 @@
|
||||
cask 'local-caffeine' do
|
||||
version '1.2.2'
|
||||
sha256 '67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94'
|
||||
|
||||
url "file://#{TEST_FIXTURE_DIR}/cask/caffeine.zip"
|
||||
homepage 'http://example.com/local-caffeine'
|
||||
|
||||
app 'Caffeine.app'
|
||||
end
|
||||
@ -0,0 +1,9 @@
|
||||
cask 'local-transmission' do
|
||||
version '2.60'
|
||||
sha256 'e44ffa103fbf83f55c8d0b1bea309a43b2880798dae8620b1ee8da5e1095ec68'
|
||||
|
||||
url "file://#{TEST_FIXTURE_DIR}/cask/transmission-2.61.dmg"
|
||||
homepage 'http://example.com/local-transmission'
|
||||
|
||||
app 'Transmission.app'
|
||||
end
|
||||
@ -88,6 +88,16 @@ Without any arguments, list all installed Casks\. With \fB\-1\fR, always format
|
||||
If \fItoken\fR is given, summarize the staged files associated with the given Cask\.
|
||||
.
|
||||
.TP
|
||||
\fBoutdated\fR [\-\-greedy] [\-\-verbose|\-\-quiet] [ \fItoken\fR \.\.\.]
|
||||
Without token arguments, display all the installed Casks that have newer versions available in the tap; otherwise check only the tokens given in the command line\. If \fB\-\-greedy\fR is given then also include in the output the Casks having \fBauto_updates true\fR or \fBversion :latest\fR\. Otherwise they are skipped because there is no reliable way to know when updates are available for them\.
|
||||
.
|
||||
.br
|
||||
\fB\-\-verbose\fR forces the display of the outdated and latest version\.
|
||||
.
|
||||
.br
|
||||
\fB\-\-quiet\fR suppresses the display of versions\.
|
||||
.
|
||||
.TP
|
||||
\fBreinstall\fR \fItoken\fR [ \fItoken\fR \.\.\. ]
|
||||
Reinstall the given Cask\.
|
||||
.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user