diff --git a/Library/Homebrew/cask/lib/hbc/artifact/moved.rb b/Library/Homebrew/cask/lib/hbc/artifact/moved.rb index 01e98ac353..eaaa49e207 100644 --- a/Library/Homebrew/cask/lib/hbc/artifact/moved.rb +++ b/Library/Homebrew/cask/lib/hbc/artifact/moved.rb @@ -31,20 +31,26 @@ module Hbc ohai "Moving #{self.class.artifact_english_name} '#{source.basename}' to '#{target}'." target.dirname.mkpath - FileUtils.move(source, target) + + if target.parent.writable? + FileUtils.move(source, target) + else + SystemCommand.run("/bin/mv", args: [source, target], sudo: true) + end + add_altname_metadata target, source.basename.to_s end def delete ohai "Removing #{self.class.artifact_english_name} '#{target}'." - return unless Utils.path_occupied?(target) - raise CaskError, "Cannot remove undeletable #{self.class.artifact_english_name}." if MacOS.undeletable?(target) - if force - Utils.gain_permissions_remove(target, command: @command) - else + return unless Utils.path_occupied?(target) + + if target.parent.writable? && !force target.rmtree + else + Utils.gain_permissions_remove(target, command: @command) end end diff --git a/Library/Homebrew/cask/lib/hbc/utils.rb b/Library/Homebrew/cask/lib/hbc/utils.rb index 3fc817dd56..2eb392c214 100644 --- a/Library/Homebrew/cask/lib/hbc/utils.rb +++ b/Library/Homebrew/cask/lib/hbc/utils.rb @@ -39,7 +39,15 @@ module Hbc module Utils def self.gain_permissions_remove(path, command: SystemCommand) if path.respond_to?(:rmtree) && path.exist? - gain_permissions(path, ["-R"], command, &:rmtree) + gain_permissions(path, ["-R"], command) do |p| + if p.parent.writable? + p.rmtree + else + command.run("/bin/rm", + args: command_args + ["-r", "-f", "--", p], + sudo: true) + end + end elsif File.symlink?(path) gain_permissions(path, ["-h"], command, &FileUtils.method(:rm_f)) end