🗑️ Use AppleScript instead of Swift for trashing.
This commit is contained in:
parent
f4f1f1a610
commit
a1f9032b95
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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()
|
Loading…
x
Reference in New Issue
Block a user