Skip to content

Commit

Permalink
Merge pull request #6634 from reitermarkus/trash
Browse files Browse the repository at this point in the history
Fix `trash.swift` without arguments.
  • Loading branch information
reitermarkus committed Oct 23, 2019
2 parents e29054a + 04493e2 commit 1ea1f31
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 24 deletions.
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

0 comments on commit 1ea1f31

Please sign in to comment.