diff --git a/Library/Homebrew/cask/lib/hbc/cli/upgrade.rb b/Library/Homebrew/cask/lib/hbc/cli/upgrade.rb index 49a538704b..e68fc4e53d 100644 --- a/Library/Homebrew/cask/lib/hbc/cli/upgrade.rb +++ b/Library/Homebrew/cask/lib/hbc/cli/upgrade.rb @@ -34,25 +34,29 @@ module Hbc old_cask_installer = Installer.new(old_cask, binaries: binaries?, verbose: verbose?, force: force?, upgrade: true) - old_cask_installer.uninstall - - begin - odebug "Installing new version of Cask #{old_cask}" - - new_cask = CaskLoader.load(old_cask.to_s) + new_cask = CaskLoader.load(old_cask.to_s) + new_cask_installer = Installer.new(new_cask, binaries: binaries?, verbose: verbose?, force: force?, skip_cask_deps: skip_cask_deps?, require_sha: require_sha?, - upgrade: true).install + upgrade: true) + begin + # purge artifacts BUT keep metadata aside + old_cask_installer.start_upgrade + + # install BUT do not yet save metadata + + new_cask_installer.install + + # if successful, remove old metadata and install new old_cask_installer.finalize_upgrade - rescue CaskUnavailableError => e - opoo e.message - rescue CaskAlreadyInstalledError => e + rescue CaskError => e opoo e.message + old_cask_installer.revert_upgrade end end end diff --git a/Library/Homebrew/cask/lib/hbc/installer.rb b/Library/Homebrew/cask/lib/hbc/installer.rb index 629a20f310..80dd2ca4cc 100644 --- a/Library/Homebrew/cask/lib/hbc/installer.rb +++ b/Library/Homebrew/cask/lib/hbc/installer.rb @@ -83,8 +83,8 @@ module Hbc def install odebug "Hbc::Installer#install" - if @cask.installed? && !force? && !@reinstall && !@upgrade - raise CaskAlreadyInstalledError, @cask + if @cask.installed? && !force? && !@reinstall + raise CaskAlreadyInstalledError, @cask unless @upgrade end check_conflicts @@ -369,17 +369,28 @@ module Hbc oh1 "Uninstalling Cask #{@cask}" disable_accessibility_access uninstall_artifacts - return if @upgrade - purge_versioned_files purge_caskroom_path if force? end + def start_upgrade + return unless @upgrade + oh1 "Starting upgrade for Cask #{@cask}" + + disable_accessibility_access + uninstall_artifacts + end + + def revert_upgrade + return unless @upgrade + opoo "Reverting upgrade for Cask #{@cask}" + reinstall + end + def finalize_upgrade return unless @upgrade - - purge_versioned_files - purge_caskroom_path if force? + purge_versioned_files(upgrade: true) + oh1 "Cask #{@cask} was successfully upgraded!" end def uninstall_artifacts @@ -414,7 +425,7 @@ module Hbc Utils.gain_permissions_remove(path, command: @command) end - def purge_versioned_files + def purge_versioned_files(upgrade: false) odebug "Purging files for version #{@cask.version} of Cask #{@cask}" # versioned staged distribution @@ -430,10 +441,10 @@ module Hbc end end @cask.metadata_versioned_path.rmdir_if_possible - @cask.metadata_master_container_path.rmdir_if_possible + @cask.metadata_master_container_path.rmdir_if_possible unless upgrade # toplevel staged distribution - @cask.caskroom_path.rmdir_if_possible + @cask.caskroom_path.rmdir_if_possible unless upgrade end def purge_caskroom_path