Skip to content

Commit

Permalink
add command 'cask outdated'
Browse files Browse the repository at this point in the history
  • Loading branch information
axiac committed Mar 15, 2017
1 parent 4d88cc4 commit 7532545
Show file tree
Hide file tree
Showing 10 changed files with 279 additions and 0 deletions.
24 changes: 24 additions & 0 deletions Library/Homebrew/cask/lib/hbc/cask.rb
Expand Up @@ -89,6 +89,30 @@ def installed_caskfile
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
Expand Down
1 change: 1 addition & 0 deletions Library/Homebrew/cask/lib/hbc/cli.rb
Expand Up @@ -15,6 +15,7 @@
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"
Expand Down
39 changes: 39 additions & 0 deletions Library/Homebrew/cask/lib/hbc/cli/outdated.rb
@@ -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
11 changes: 11 additions & 0 deletions Library/Homebrew/manpages/brew-cask.1.md
Expand Up @@ -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.
Expand Down
85 changes: 85 additions & 0 deletions Library/Homebrew/test/cask/cask_spec.rb
Expand Up @@ -89,4 +89,89 @@
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 changes: 80 additions & 0 deletions Library/Homebrew/test/cask/cli/outdated_spec.rb
@@ -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
10 changes: 10 additions & 0 deletions manpages/brew-cask.1
Expand Up @@ -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\.
.
Expand Down

0 comments on commit 7532545

Please sign in to comment.