🗑️ Use AppleScript instead of Swift for trashing.
This commit is contained in:
parent
f4f1f1a610
commit
a1f9032b95
@ -194,6 +194,8 @@ module Hbc
|
|||||||
end
|
end
|
||||||
|
|
||||||
def each_resolved_path(action, paths)
|
def each_resolved_path(action, paths)
|
||||||
|
return enum_for(:each_resolved_path, action, paths) unless block_given?
|
||||||
|
|
||||||
paths.each do |path|
|
paths.each do |path|
|
||||||
resolved_path = Pathname.new(path)
|
resolved_path = Pathname.new(path)
|
||||||
|
|
||||||
@ -226,12 +228,21 @@ module Hbc
|
|||||||
def uninstall_trash(*paths)
|
def uninstall_trash(*paths)
|
||||||
return if paths.empty?
|
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:"
|
ohai "Trashing files:"
|
||||||
each_resolved_path(:trash, paths) do |path, resolved_paths|
|
puts resolved_paths.map(&:first)
|
||||||
puts path
|
@command.run!("/usr/bin/osascript", args: ["-e", <<-EOS.undent, *resolved_paths.flat_map(&:last)])
|
||||||
resolved_paths.each { |resolved_path| Utils.gain_permissions(resolved_path, ["-R"], @command) }
|
on run argv
|
||||||
@command.run!("/usr/bin/xargs", args: ["-0", "--", HOMEBREW_LIBRARY_PATH/"utils/trash.swift"], input: resolved_paths.join("\0"))
|
repeat with i from 1 to (count argv)
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
def uninstall_rmdir(*directories)
|
def uninstall_rmdir(*directories)
|
||||||
|
@ -68,12 +68,18 @@ RSpec.configure do |config|
|
|||||||
end
|
end
|
||||||
|
|
||||||
config.around(:each) do |example|
|
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
|
begin
|
||||||
TEST_DIRECTORIES.each(&:mkpath)
|
TEST_DIRECTORIES.each(&:mkpath)
|
||||||
|
|
||||||
@__homebrew_failed = Homebrew.failed?
|
@__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
|
@__argv = ARGV.dup
|
||||||
@__env = ENV.to_hash # dup doesn't work on ENV
|
@__env = ENV.to_hash # dup doesn't work on ENV
|
||||||
@ -106,7 +112,7 @@ RSpec.configure do |config|
|
|||||||
CoreTap.instance.path/"formula_renames.json",
|
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)
|
diff = Set.new(@__files_before_test) ^ Set.new(files_after_test)
|
||||||
expect(diff).to be_empty, <<-EOS.undent
|
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