module Asciidoctor::Diagram::Cli

@private

Public Class Methods

run(*args) click to toggle source
# File lib/asciidoctor-diagram/util/cli.rb, line 11
def self.run(*args)
  if args.last.is_a? Hash
    opts = args.pop.dup
  else
    opts = {}
  end

  in_data = opts[:stdin_data]

  if Hash === args.first
    env = args.shift.dup
  else
    env = {}
  end

  pb = java.lang.ProcessBuilder.new(*args)

  pb.directory(java.io.File.new(opts[:chdir] || Dir.pwd))

  env.each_pair do |key, value|
    pb.environment.put(key, value)
  end
  p = pb.start

  stdout = ""
  out_reader = start_stream_reader(p.getInputStream, stdout)
  stderr = ""
  err_reader = start_stream_reader(p.getErrorStream, stderr)

  if in_data
    p.getOutputStream.write(in_data.to_java_bytes)
    p.getOutputStream.close
  end

  p.waitFor

  out_reader.join
  err_reader.join

  status = p.exitValue

  if status != 0
    raise "#{File.basename(args[0])} failed: #{stdout.empty? ? stderr : stdout}"
  end

  {
      :out => stdout,
      :err => stderr,
      :status => status
  }
end
start_stream_reader(in_stream, out_string) click to toggle source
# File lib/asciidoctor-diagram/util/cli.rb, line 64
def self.start_stream_reader(in_stream, out_string)
  Thread.new {
    buffer = ::Java::byte[4096].new
    while (bytes_read = in_stream.read(buffer)) != -1
      if bytes_read < buffer.length
        str = String.from_java_bytes(java.util.Arrays.copyOf(buffer, bytes_read))
      else
        str = String.from_java_bytes(buffer)
      end
      out_string << str
    end
  }
end