Class: Launchy::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/launchy/runner.rb

Overview

Internal: Run a command in a child process

Instance Method Summary collapse

Instance Method Details

#commandline_normalize(cmdline) ⇒ Object



47
48
49
50
51
52
# File 'lib/launchy/runner.rb', line 47

def commandline_normalize(cmdline)
  c = cmdline.flatten!
  c = c.find_all { |a| !a.nil? and a.size.positive? }
  Launchy.log "commandline_normalized => #{c.join(' ')}"
  c
end

#dry_run(cmd, *args) ⇒ Object



32
33
34
# File 'lib/launchy/runner.rb', line 32

def dry_run(cmd, *args)
  shell_commands(cmd, args).join(" ")
end

#run(cmd, *args) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/launchy/runner.rb', line 8

def run(cmd, *args)
  unless cmd
    raise Launchy::CommandNotFoundError,
          "No command found to run with args '#{args.join(' ')}'. If this is unexpected, #{Launchy.bug_report_message}"
  end

  if Launchy.dry_run?
    $stdout.puts dry_run(cmd, *args)
  else
    wet_run(cmd, *args)
  end
end

#shell_commands(cmd, args) ⇒ Object

cut it down to just the shell commands that will be passed to exec or posix_spawn. The cmd argument is split according to shell rules and the args are not escaped because the whole set is passed to system as *args and in that case system shell escaping rules are not done.



41
42
43
44
45
# File 'lib/launchy/runner.rb', line 41

def shell_commands(cmd, args)
  cmdline = [cmd.to_s.shellsplit]
  cmdline << args.flatten.collect(&:to_s)
  commandline_normalize(cmdline)
end

#wet_run(cmd, *args) ⇒ Object



21
22
23
24
25
26
27
28
29
30
# File 'lib/launchy/runner.rb', line 21

def wet_run(cmd, *args)
  argv = [cmd, *args].flatten
  Launchy.log "ChildProcess: argv => #{argv.inspect}"
  process = ChildProcess.build(*argv)

  process.io.inherit!
  process.leader = true
  process.detach = true
  process.start
end