Skip to content
Snippets Groups Projects
Commit c4d8b169 authored by Markus Reiter's avatar Markus Reiter Committed by GitHub
Browse files

Merge pull request #2309 from axiac/cask-outdated

add command 'cask outdated'
parents 6c180e50 75325451
No related branches found
No related tags found
No related merge requests found
......@@ -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"
......
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
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
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
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
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\.
.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment