Fix trash.swift without arguments.

This commit is contained in:
Markus Reiter 2019-10-23 05:21:21 +02:00
parent 299bb1c25f
commit 04493e2dde
5 changed files with 43 additions and 24 deletions

View File

@ -24,8 +24,6 @@ module Cask
:rmdir,
].freeze
TRASH_SCRIPT = (HOMEBREW_LIBRARY_PATH/"cask/utils/trash.swift").freeze
def self.from_args(cask, **directives)
new(cask, directives)
end
@ -360,16 +358,31 @@ module Cask
def trash_paths(*paths, command: nil, **_)
return if paths.empty?
trashable, untrashable = paths.partition(&:writable?)
unless untrashable.empty?
opoo "These files cannot be moved to the user's Trash:"
$stderr.puts untrashable
stdout, stderr, = system_command HOMEBREW_LIBRARY_PATH/"cask/utils/trash.swift",
args: paths,
print_stderr: false
trashed = stdout.split(":").sort
untrashable = stderr.split(":").sort
return trashed, untrashable if untrashable.empty?
untrashable.delete_if do |path|
Utils.gain_permissions(path, ["-R"], SystemCommand) do
system_command! HOMEBREW_LIBRARY_PATH/"cask/utils/trash.swift",
args: [path],
print_stderr: false
end
true
rescue
false
end
result = command.run!("/usr/bin/swift", args: [TRASH_SCRIPT, *trashable])
opoo "The following files could not trashed, please do so manually:"
$stderr.puts untrashable
# Remove AppleScript's automatic newline.
result.tap { |r| r.stdout.sub!(/\n$/, "") }
[trashed, untrashable]
end
def uninstall_rmdir(*directories, command: nil, **_)

View File

@ -49,6 +49,7 @@ module Cask
tried_permissions = true
retry # rmtree
end
unless tried_ownership
# in case of ownership problems
# TODO: Further examine files to see if ownership is the problem
@ -62,6 +63,8 @@ module Cask
tried_permissions = false
retry # rmtree
end
raise
end
end

0
Library/Homebrew/cask/utils/quarantine.swift Normal file → Executable file
View File

29
Library/Homebrew/cask/utils/trash.swift Normal file → Executable file
View File

@ -2,27 +2,30 @@
import Foundation
struct swifterr: TextOutputStream {
public static var stream = swifterr()
mutating func write(_ string: String) { fputs(string, stderr) }
extension FileHandle : TextOutputStream {
public func write(_ string: String) {
self.write(string.data(using: .utf8)!)
}
}
if (CommandLine.arguments.count < 2) {
exit(2)
}
var stderr = FileHandle.standardError
let manager: FileManager = FileManager()
var success = true
for item in CommandLine.arguments[1...] {
do {
let path: URL = URL(fileURLWithPath: item)
try manager.trashItem(at: path, resultingItemURL: nil)
print(path, terminator: "\0")
}
catch {
print(error.localizedDescription, to: &swifterr.stream)
exit(1)
var trashedPath: NSURL!
try manager.trashItem(at: path, resultingItemURL: &trashedPath)
print((trashedPath as URL).path, terminator: ":")
} catch {
print(item, terminator: ":", to: &stderr)
success = false
}
}
exit(0)
guard success else {
exit(1)
}

View File

@ -199,8 +199,8 @@ shared_examples "#uninstall_phase or #zap_phase" do
before do
allow_any_instance_of(Cask::Artifact::AbstractUninstall).to receive(:trash_paths)
.and_wrap_original do |method, *args|
method.call(*args).tap do |result|
FileUtils.rm_rf result.stdout.split("\0")
method.call(*args).tap do |trashed, _|
FileUtils.rm_r trashed
end
end
end