diff --git a/Library/Homebrew/cask/artifact/abstract_uninstall.rb b/Library/Homebrew/cask/artifact/abstract_uninstall.rb index 789306bb99..19d8476b7e 100644 --- a/Library/Homebrew/cask/artifact/abstract_uninstall.rb +++ b/Library/Homebrew/cask/artifact/abstract_uninstall.rb @@ -362,7 +362,13 @@ module Cask def trash_paths(*paths, command: nil, **_) return if paths.empty? - result = command.run!("/usr/bin/swift", args: [TRASH_SCRIPT, *paths]) + trashable, untrashable = paths.partition(&:writable?) + unless untrashable.empty? + opoo "These files cannot be moved to the user's Trash:" + $stderr.puts untrashable + end + + result = command.run!("/usr/bin/swift", args: [TRASH_SCRIPT, *trashable]) # Remove AppleScript's automatic newline. result.tap { |r| r.stdout.sub!(/\n$/, "") } diff --git a/Library/Homebrew/cask/utils/trash.swift b/Library/Homebrew/cask/utils/trash.swift index cddbd686cc..91d948fa42 100644 --- a/Library/Homebrew/cask/utils/trash.swift +++ b/Library/Homebrew/cask/utils/trash.swift @@ -2,6 +2,11 @@ import Foundation +struct swifterr: TextOutputStream { + public static var stream = swifterr() + mutating func write(_ string: String) { fputs(string, stderr) } +} + if (CommandLine.arguments.count < 2) { exit(2) } @@ -12,10 +17,11 @@ for item in CommandLine.arguments[1...] { do { let path: URL = URL(fileURLWithPath: item) try manager.trashItem(at: path, resultingItemURL: nil) - print(path) + print(path, terminator: "\0") } catch { - print("\0") + print(error.localizedDescription, to: &swifterr.stream) + exit(1) } }