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

Fix trash.swift without arguments. #6634

Merged
merged 1 commit into from Oct 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 22 additions & 9 deletions Library/Homebrew/cask/artifact/abstract_uninstall.rb
Expand Up @@ -24,8 +24,6 @@ class AbstractUninstall < AbstractArtifact
:rmdir,
].freeze

TRASH_SCRIPT = (HOMEBREW_LIBRARY_PATH/"cask/utils/trash.swift").freeze

def self.from_args(cask, **directives)
new(cask, directives)
end
Expand Down Expand Up @@ -360,16 +358,31 @@ def uninstall_trash(*paths, **options)
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, **_)
Expand Down
3 changes: 3 additions & 0 deletions Library/Homebrew/cask/utils.rb
Expand Up @@ -49,6 +49,7 @@ def self.gain_permissions(path, command_args, command)
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
Expand All @@ -62,6 +63,8 @@ def self.gain_permissions(path, command_args, command)
tried_permissions = false
retry # rmtree
end

raise
end
end

Expand Down
Empty file modified Library/Homebrew/cask/utils/quarantine.swift 100644 → 100755
Empty file.
29 changes: 16 additions & 13 deletions Library/Homebrew/cask/utils/trash.swift 100644 → 100755
Expand Up @@ -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)
}
Expand Up @@ -199,8 +199,8 @@
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
Expand Down