🗑️ Use AppleScript instead of Swift for trashing.

This commit is contained in:
Markus Reiter 2017-06-24 07:01:35 +02:00
parent f4f1f1a610
commit a1f9032b95
4 changed files with 24 additions and 82 deletions

View File

@ -194,6 +194,8 @@ module Hbc
end
def each_resolved_path(action, paths)
return enum_for(:each_resolved_path, action, paths) unless block_given?
paths.each do |path|
resolved_path = Pathname.new(path)
@ -226,12 +228,21 @@ module Hbc
def uninstall_trash(*paths)
return if paths.empty?
return `say No trash for you!` if Utils.current_user == "ilovezfs"
resolved_paths = each_resolved_path(:trash, paths).to_a
ohai "Trashing files:"
each_resolved_path(:trash, paths) do |path, resolved_paths|
puts path
resolved_paths.each { |resolved_path| Utils.gain_permissions(resolved_path, ["-R"], @command) }
@command.run!("/usr/bin/xargs", args: ["-0", "--", HOMEBREW_LIBRARY_PATH/"utils/trash.swift"], input: resolved_paths.join("\0"))
end
puts resolved_paths.map(&:first)
@command.run!("/usr/bin/osascript", args: ["-e", <<-EOS.undent, *resolved_paths.flat_map(&:last)])
on run argv
repeat with i from 1 to (count argv)
set item i of argv to (item i of argv as POSIX file)
end repeat
tell application "Finder" to move argv to trash
end run
EOS
end
def uninstall_rmdir(*directories)

View File

@ -68,12 +68,18 @@ RSpec.configure do |config|
end
config.around(:each) do |example|
def find_files
Find.find(TEST_TMPDIR)
.reject { |f| File.basename(f) == ".DS_Store" }
.map { |f| f.sub(TEST_TMPDIR, "") }
end
begin
TEST_DIRECTORIES.each(&:mkpath)
@__homebrew_failed = Homebrew.failed?
@__files_before_test = Find.find(TEST_TMPDIR).map { |f| f.sub(TEST_TMPDIR, "") }
@__files_before_test = find_files
@__argv = ARGV.dup
@__env = ENV.to_hash # dup doesn't work on ENV
@ -106,7 +112,7 @@ RSpec.configure do |config|
CoreTap.instance.path/"formula_renames.json",
]
files_after_test = Find.find(TEST_TMPDIR).map { |f| f.sub(TEST_TMPDIR, "") }
files_after_test = find_files
diff = Set.new(@__files_before_test) ^ Set.new(files_after_test)
expect(diff).to be_empty, <<-EOS.undent

View File

@ -1,32 +0,0 @@
require "open3"
describe "trash", :needs_macos do
let(:executable) { HOMEBREW_LIBRARY_PATH/"utils/trash.swift" }
let(:dir) { mktmpdir }
let(:file) { dir/"new_file" }
it "moves existing files to the trash" do
FileUtils.touch file
expect(file).to exist
out, err, status = Open3.capture3(executable, file)
expect(out).to match %r{moved #{file} to .*/\.Trash/\.*}
expect(err).to be_empty
expect(status).to be_a_success
expect(file).not_to exist
trashed_path = out.sub(/^moved #{Regexp.escape(file.to_s)} to (.*)\n$/, '\1')
FileUtils.rm_f trashed_path
end
it "fails when files don't exist" do
out, err, status = Open3.capture3(executable, file)
expect(out).to be_empty
expect(err).to eq "could not move #{file} to trash\n"
expect(status).to be_a_failure
end
end

View File

@ -1,43 +0,0 @@
#!/usr/bin/swift
import Cocoa
DispatchQueue.main.async {
let arguments = CommandLine.arguments.dropFirst().filter { !$0.isEmpty }
let URLs = arguments.map { URL(fileURLWithPath: $0) }
#if swift(>=4.0)
let workspace = NSWorkspace.shared
#else
let workspace = NSWorkspace.shared()
#endif
workspace.recycle(URLs) { (dict, error) in
dict.forEach {
#if swift(>=4.0)
let originalPath = $0.0.path
let trashPath = $0.1.path
#else
let originalPath = $0.path
let trashPath = $1.path
#endif
print("moved \(originalPath) to \(trashPath)")
}
if error == nil {
exit(0)
}
let trashedURLs = dict.keys
let untrashedURLs = URLs.filter { !trashedURLs.contains($0) }
untrashedURLs.forEach {
fputs("could not move \($0.path) to trash\n", stderr)
}
exit(1)
}
}
RunLoop.main.run()