class Foreman::Process

def fork_with_io(command)

def fork_with_io(command)
  reader, writer = IO.pipe
  pid = fork do
    trap("INT", "IGNORE")
    $stdout.reopen writer
    reader.close
    exec Foreman.runner, replace_command_env(command)
  end
  [ reader, pid ]
end

def initialize(entry, num, port)

def initialize(entry, num, port)
  @entry = entry
  @num = num
  @port = port
end

def name

def name
  "%s.%s" % [ entry.name, num ]
end

def output(pipe, message)

def output(pipe, message)
  pipe.puts "%s,%s" % [ name, message ]
end

def replace_command_env(command)

def replace_command_env(command)
  command.gsub(/\$(\w+)/) { |e| ENV[e[1..-1]] }
end

def run(pipe, basedir, environment)

def run(pipe, basedir, environment)
  Dir.chdir(basedir) do
    with_environment(environment.merge("PORT" => port.to_s)) do
      run_process entry.command, pipe
    end
  end
end

def run_process(command, pipe)

def run_process(command, pipe)
  io, @pid = fork_with_io(command)
  output pipe, "started with pid %d" % @pid
  Thread.new do
    until io.eof?
      output pipe, io.gets
    end
  end
end

def with_environment(environment)

def with_environment(environment)
  old_env = ENV.each_pair.inject({}) { |h,(k,v)| h.update(k => v) }
  environment.each { |k,v| ENV[k] = v }
  ret = yield
  ENV.clear
  old_env.each { |k,v| ENV[k] = v}
  ret
end