Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly upgrade Casks with version :latest #3492

Merged
merged 11 commits into from
Nov 29, 2017
2 changes: 1 addition & 1 deletion Library/Homebrew/cask/lib/hbc/artifact/moved.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def move_back(skip: false, force: false, command: nil, **options)
command.run("/bin/mv", args: [target, source], sudo: true)
end

add_altname_metadata(target, source.basename, command: command)
add_altname_metadata(source, target.basename, command: command)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this completely. We don‘t need to add this when moving it back, actually.

end

def delete(target, force: false, command: nil, **_)
Expand Down
4 changes: 2 additions & 2 deletions Library/Homebrew/cask/lib/hbc/cli/upgrade.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ def run

new_cask_installer.fetch

new_cask_installer.stage

# Move the old Cask's artifacts back to staging
old_cask_installer.start_upgrade
# And flag it so in case of error
started_upgrade = true

# Install the new Cask
new_cask_installer.stage

new_cask_installer.install_artifacts
new_artifacts_installed = true

Expand Down
44 changes: 41 additions & 3 deletions Library/Homebrew/cask/lib/hbc/installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def initialize(cask, command: SystemCommand, force: false, skip_cask_deps: false
@upgrade = upgrade
end

attr_predicate :binaries?, :force?, :skip_cask_deps?, :require_sha?, :upgrade?, :verbose?
attr_predicate :binaries?, :force?, :skip_cask_deps?, :require_sha?, :upgrade?, :verbose?, :backed_up?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not needed anymore.


def self.print_caveats(cask)
odebug "Printing caveats"
Expand Down Expand Up @@ -378,16 +378,30 @@ def start_upgrade

disable_accessibility_access
uninstall_artifacts
backup
end

def backup
@cask.staged_path.rename backup_path
end

def restore_backup
return unless backup_path.directory?

Pathname.new(@cask.staged_path).rmtree if @cask.staged_path.exist?

backup_path.rename @cask.staged_path
end

def revert_upgrade
opoo "Reverting upgrade for Cask #{@cask}"
restore_backup
install_artifacts
enable_accessibility_access
end

def finalize_upgrade
purge_versioned_files
purge_backed_versioned_files

puts summary
end
Expand Down Expand Up @@ -420,19 +434,43 @@ def zap
purge_caskroom_path
end

def backup_path
return nil if @cask.staged_path.nil?
Pathname.new "#{@cask.staged_path}.upgrading"
end

def version_is_latest?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can now be removed.

@cask.versions.include?("latest")
end

def gain_permissions_remove(path)
Utils.gain_permissions_remove(path, command: @command)
end

def purge_backed_versioned_files
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

purge_backed_up_versioned_files

ohai "Purging files for version #{@cask.version} of Cask #{@cask}"

# versioned staged distribution
gain_permissions_remove(backup_path) if !backup_path.nil? && backup_path.exist?

# Homebrew-Cask metadata
purge_metadata
end

def purge_versioned_files
ohai "Purging files for version #{@cask.version} of Cask #{@cask}"

# versioned staged distribution
gain_permissions_remove(@cask.staged_path) if [email protected]_path.nil? && @cask.staged_path.exist?

# Homebrew-Cask metadata
purge_metadata
end

def purge_metadata
if @cask.metadata_versioned_path.respond_to?(:children) &&
@cask.metadata_versioned_path.exist?
@cask.metadata_versioned_path.exist? &&
!(upgrade? && version_is_latest?)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need version_is_latest? now?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the backup mechanism doesn't involve the Cask's metadata; if the version is latest, deleting this line will make purge_metadata "uninstall" the Cask while leaving all artifacts in place.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On second thoughts, I'll just go ahead with two fully separate methods and get rid of that line.

@cask.metadata_versioned_path.children.each do |subdir|
unless PERSISTENT_METADATA_SUBDIRS.include?(subdir.basename)
gain_permissions_remove(subdir)
Expand Down
14 changes: 14 additions & 0 deletions Library/Homebrew/test/cask/cli/upgrade_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"outdated/local-caffeine",
"outdated/local-transmission",
"outdated/auto-updates",
"outdated/version-latest",
]
}

Expand Down Expand Up @@ -103,6 +104,9 @@
auto_updates_path = Hbc.appdir.join("MyFancyApp.app")
local_transmission = Hbc::CaskLoader.load("local-transmission")
local_transmission_path = Hbc.appdir.join("Transmission.app")
version_latest = Hbc::CaskLoader.load("version-latest")
version_latest_path_1 = Hbc.appdir.join("Caffeine Mini.app")
version_latest_path_2 = Hbc.appdir.join("Caffeine Pro.app")

expect(local_caffeine).to be_installed
expect(local_caffeine_path).to be_a_directory
Expand All @@ -116,6 +120,11 @@
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_path_2).to be_a_directory
expect(version_latest.versions).to include("latest")

described_class.run("--greedy")

expect(local_caffeine).to be_installed
Expand All @@ -129,6 +138,11 @@
expect(local_transmission).to be_installed
expect(local_transmission_path).to be_a_directory
expect(local_transmission.versions).to include("2.61")

expect(version_latest).to be_installed
expect(version_latest_path_1).to be_a_directory
expect(version_latest_path_2).to be_a_directory
expect(version_latest.versions).to include("latest")
end

it 'does not include the Casks with "auto_updates true" when the version did not change' do
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
cask 'version-latest' do
version :latest
sha256 :no_check

url "file://#{TEST_FIXTURE_DIR}/cask/caffeines.zip"
homepage 'http://example.com/local-caffeine'

app 'Caffeine Mini.app'
app 'Caffeine Pro.app'
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
cask 'version-latest' do
version :latest
sha256 :no_check

url "file://#{TEST_FIXTURE_DIR}/cask/caffeines.zip"
homepage 'http://example.com/local-caffeine'

app 'Caffeine Mini.app'
app 'Caffeine Pro.app'
end