Use AppleScript to check if GUI apps are running.
This commit is contained in:
parent
2c0d25da6f
commit
d8afed206f
@ -127,7 +127,7 @@ module Cask
|
||||
# :quit/:signal must come before :kext so the kext will not be in use by a running process
|
||||
def uninstall_quit(*bundle_ids, command: nil, **_)
|
||||
bundle_ids.each do |bundle_id|
|
||||
next if running_processes(bundle_id).empty?
|
||||
next unless running?(bundle_id)
|
||||
|
||||
unless User.current.gui?
|
||||
opoo "Not logged into a GUI; skipping quitting application ID '#{bundle_id}'."
|
||||
@ -146,12 +146,12 @@ module Cask
|
||||
Kernel.loop do
|
||||
next unless quit(bundle_id).success?
|
||||
|
||||
if running_processes(bundle_id).empty?
|
||||
next if running?(bundle_id)
|
||||
|
||||
puts "Application '#{bundle_id}' quit successfully."
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
rescue Timeout::Error
|
||||
opoo "Application '#{bundle_id}' did not quit."
|
||||
next
|
||||
@ -159,6 +159,28 @@ module Cask
|
||||
end
|
||||
end
|
||||
|
||||
def running?(bundle_id)
|
||||
script = <<~JAVASCRIPT
|
||||
'use strict';
|
||||
|
||||
ObjC.import('stdlib')
|
||||
|
||||
function run(argv) {
|
||||
try {
|
||||
var app = Application(argv[0])
|
||||
if (app.running()) {
|
||||
$.exit(0)
|
||||
}
|
||||
} catch (err) { }
|
||||
|
||||
$.exit(1)
|
||||
}
|
||||
JAVASCRIPT
|
||||
|
||||
system_command("osascript", args: ["-l", "JavaScript", "-e", script, bundle_id],
|
||||
print_stderr: true).status.success?
|
||||
end
|
||||
|
||||
def quit(bundle_id)
|
||||
script = <<~JAVASCRIPT
|
||||
'use strict';
|
||||
@ -181,8 +203,7 @@ module Cask
|
||||
JAVASCRIPT
|
||||
|
||||
system_command "osascript", args: ["-l", "JavaScript", "-e", script, bundle_id],
|
||||
print_stderr: false,
|
||||
sudo: true
|
||||
print_stderr: false
|
||||
end
|
||||
private :quit
|
||||
|
||||
|
||||
@ -119,7 +119,7 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
it "is skipped when the user does not have automation access" do
|
||||
allow(User).to receive(:automation_access?).and_return false
|
||||
allow(User.current).to receive(:gui?).and_return true
|
||||
allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])
|
||||
allow(subject).to receive(:running?).with(bundle_id).and_return(true)
|
||||
|
||||
expect {
|
||||
subject.public_send(:"#{artifact_dsl_key}_phase", command: fake_system_command)
|
||||
@ -128,7 +128,7 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
|
||||
it "is skipped when the user is not a GUI user" do
|
||||
allow(User.current).to receive(:gui?).and_return false
|
||||
allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])
|
||||
allow(subject).to receive(:running?).with(bundle_id).and_return(true)
|
||||
|
||||
expect {
|
||||
subject.public_send(:"#{artifact_dsl_key}_phase", command: fake_system_command)
|
||||
@ -139,10 +139,10 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
allow(User).to receive(:automation_access?).and_return true
|
||||
allow(User.current).to receive(:gui?).and_return true
|
||||
|
||||
expect(subject).to receive(:running_processes).with(bundle_id).ordered.and_return([[0, "", bundle_id]])
|
||||
expect(subject).to receive(:running?).with(bundle_id).ordered.and_return(true)
|
||||
expect(subject).to receive(:quit).with(bundle_id)
|
||||
.and_return(instance_double("SystemCommand::Result", success?: true))
|
||||
expect(subject).to receive(:running_processes).with(bundle_id).ordered.and_return([])
|
||||
expect(subject).to receive(:running?).with(bundle_id).ordered.and_return(false)
|
||||
|
||||
expect {
|
||||
subject.public_send(:"#{artifact_dsl_key}_phase", command: fake_system_command)
|
||||
@ -153,7 +153,7 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
allow(User).to receive(:automation_access?).and_return true
|
||||
allow(User.current).to receive(:gui?).and_return true
|
||||
|
||||
allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])
|
||||
allow(subject).to receive(:running?).with(bundle_id).and_return(true)
|
||||
allow(subject).to receive(:quit).with(bundle_id)
|
||||
.and_return(instance_double("SystemCommand::Result", success?: false))
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user