From 55fcd01bed6b7dea268f8e299376dc5c83e9eca9 Mon Sep 17 00:00:00 2001 From: Doug Hogan Date: Fri, 26 Jul 2019 22:55:37 -0700 Subject: [PATCH] cask/cmd/upgrade: add --dry-run option. --- Library/Homebrew/cask/cmd/upgrade.rb | 17 +- .../Homebrew/test/cask/cmd/upgrade_spec.rb | 173 ++++++++++++++++++ manpages/brew-cask.1 | 2 +- 3 files changed, 185 insertions(+), 7 deletions(-) diff --git a/Library/Homebrew/cask/cmd/upgrade.rb b/Library/Homebrew/cask/cmd/upgrade.rb index 3afac207ea..948d97e74a 100644 --- a/Library/Homebrew/cask/cmd/upgrade.rb +++ b/Library/Homebrew/cask/cmd/upgrade.rb @@ -9,6 +9,7 @@ module Cask option "--quiet", :quiet, false option "--force", :force, false option "--skip-cask-deps", :skip_cask_deps, false + option "--dry-run", :dry_run, false def initialize(*) super @@ -41,12 +42,16 @@ module Cask .map { |(old_cask, new_cask)| "#{new_cask.full_name} #{old_cask.version} -> #{new_cask.version}" } .join(", ") - upgradable_casks.each do |(old_cask, new_cask)| - begin - upgrade_cask(old_cask, new_cask) - rescue CaskError => e - caught_exceptions << e - next + if dry_run? + puts "Dry run: did not upgrade anything." + else + upgradable_casks.each do |(old_cask, new_cask)| + begin + upgrade_cask(old_cask, new_cask) + rescue CaskError => e + caught_exceptions << e + next + end end end diff --git a/Library/Homebrew/test/cask/cmd/upgrade_spec.rb b/Library/Homebrew/test/cask/cmd/upgrade_spec.rb index 503778eb15..2c0fff3d7b 100644 --- a/Library/Homebrew/test/cask/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cask/cmd/upgrade_spec.rb @@ -170,6 +170,179 @@ describe Cask::Cmd::Upgrade, :cask do end end + context "dry run upgrade" do + let(:installed) { + [ + "outdated/local-caffeine", + "outdated/local-transmission", + "outdated/auto-updates", + "outdated/version-latest", + ] + } + + before do + installed.each { |cask| Cask::Cmd::Install.run(cask) } + + allow_any_instance_of(described_class).to receive(:verbose?).and_return(true) + end + + describe 'without --greedy it ignores the Casks with "version latest" or "auto_updates true"' do + it "would update all the installed Casks when no token is provided" do + local_caffeine = Cask::CaskLoader.load("local-caffeine") + local_caffeine_path = Cask::Config.global.appdir.join("Caffeine.app") + local_transmission = Cask::CaskLoader.load("local-transmission") + local_transmission_path = Cask::Config.global.appdir.join("Transmission.app") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + + described_class.run("--dry-run") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + expect(local_caffeine.versions).not_to include("1.2.3") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + expect(local_transmission.versions).not_to include("2.61") + end + + it "would update only the Casks specified in the command line" do + local_caffeine = Cask::CaskLoader.load("local-caffeine") + local_caffeine_path = Cask::Config.global.appdir.join("Caffeine.app") + local_transmission = Cask::CaskLoader.load("local-transmission") + local_transmission_path = Cask::Config.global.appdir.join("Transmission.app") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + + described_class.run("--dry-run", "local-caffeine") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + expect(local_caffeine.versions).not_to include("1.2.3") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + expect(local_transmission.versions).not_to include("2.61") + end + + it 'would update "auto_updates" and "latest" Casks when their tokens are provided in the command line' do + local_caffeine = Cask::CaskLoader.load("local-caffeine") + local_caffeine_path = Cask::Config.global.appdir.join("Caffeine.app") + auto_updates = Cask::CaskLoader.load("auto-updates") + auto_updates_path = Cask::Config.global.appdir.join("MyFancyApp.app") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + + expect(auto_updates).to be_installed + expect(auto_updates_path).to be_a_directory + expect(auto_updates.versions).to include("2.57") + + described_class.run("--dry-run", "local-caffeine", "auto-updates") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + expect(local_caffeine.versions).not_to include("1.2.3") + + expect(auto_updates).to be_installed + expect(auto_updates_path).to be_a_directory + expect(auto_updates.versions).to include("2.57") + expect(auto_updates.versions).not_to include("2.61") + end + end + + describe "with --greedy it checks additional Casks" do + it 'would include the Casks with "auto_updates true" or "version latest"' do + local_caffeine = Cask::CaskLoader.load("local-caffeine") + local_caffeine_path = Cask::Config.global.appdir.join("Caffeine.app") + auto_updates = Cask::CaskLoader.load("auto-updates") + auto_updates_path = Cask::Config.global.appdir.join("MyFancyApp.app") + local_transmission = Cask::CaskLoader.load("local-transmission") + local_transmission_path = Cask::Config.global.appdir.join("Transmission.app") + version_latest = Cask::CaskLoader.load("version-latest") + version_latest_path_1 = Cask::Config.global.appdir.join("Caffeine Mini.app") + version_latest_path_2 = Cask::Config.global.appdir.join("Caffeine Pro.app") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + + expect(auto_updates).to be_installed + expect(auto_updates_path).to be_a_directory + expect(auto_updates.versions).to include("2.57") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + + expect(version_latest).to be_installed + expect(version_latest_path_1).to be_a_directory + expect(version_latest.versions).to include("latest") + + described_class.run("--greedy", "--dry-run") + + expect(local_caffeine).to be_installed + expect(local_caffeine_path).to be_a_directory + expect(local_caffeine.versions).to include("1.2.2") + expect(local_caffeine.versions).not_to include("1.2.3") + + expect(auto_updates).to be_installed + expect(auto_updates_path).to be_a_directory + expect(auto_updates.versions).to include("2.57") + expect(auto_updates.versions).not_to include("2.61") + + expect(local_transmission).to be_installed + expect(local_transmission_path).to be_a_directory + expect(local_transmission.versions).to include("2.60") + expect(local_transmission.versions).not_to include("2.61") + + expect(version_latest).to be_installed + expect(version_latest_path_2).to be_a_directory + end + + it 'does not include the Casks with "auto_updates true" when the version did not change' do + cask = Cask::CaskLoader.load("auto-updates") + cask_path = cask.config.appdir.join("MyFancyApp.app") + + expect(cask).to be_installed + expect(cask_path).to be_a_directory + expect(cask.versions).to include("2.57") + + described_class.run("--dry-run", "auto-updates", "--greedy") + + expect(cask).to be_installed + expect(cask_path).to be_a_directory + expect(cask.versions).to include("2.57") + expect(cask.versions).not_to include("2.61") + + described_class.run("--dry-run", "auto-updates", "--greedy") + + expect(cask).to be_installed + expect(cask_path).to be_a_directory + expect(cask.versions).to include("2.57") + expect(cask.versions).not_to include("2.61") + end + end + end + context "failed upgrade" do let(:installed) { [ diff --git a/manpages/brew-cask.1 b/manpages/brew-cask.1 index 23febd9eed..ae24f6e2fb 100644 --- a/manpages/brew-cask.1 +++ b/manpages/brew-cask.1 @@ -100,7 +100,7 @@ Check the given Casks for correct style using RuboCop (with custom Cask cops)\. Uninstall the given Cask\. With \fB\-\-force\fR, uninstall even if the Cask does not appear to be present\. . .TP -\fBupgrade\fR [\-\-force] [\-\-greedy] \fItoken\fR [ \fItoken\fR \.\.\. ] +\fBupgrade\fR [\-\-force] [\-\-greedy] [\-\-dry\-run] \fItoken\fR [ \fItoken\fR \.\.\. ] Without token arguments, upgrade all the installed Casks that have newer versions available in the tap; otherwise update the tokens given in the command line\. If \fB\-\-greedy\fR is given then also upgrade the Casks having \fBauto_updates true\fR or \fBversion :latest\fR\. . .TP