class Byebug::RestartCommand

def description

def description
  %{restart|R [args]
    Restart the program. This is a re-exec - all byebug state
    is lost. If command arguments are passed those are used.}
end

def execute

def execute
  return errmsg "Don't know name of debugged program\n" unless
    defined? Byebug::PROG_SCRIPT
  return errmsg "Ruby program #{Byebug::PROG_SCRIPT} doesn't exist\n" unless
    File.exist?(File.expand_path(Byebug::PROG_SCRIPT))
  if not defined? Byebug::BYEBUG_SCRIPT
    print "Byebug was not called from the outset...\n"
    if not File.executable?(Byebug::PROG_SCRIPT)
      print "Ruby program #{Byebug::PROG_SCRIPT} not executable... " \
            "We'll add a call to Ruby.\n"
      ruby = begin defined?(Gem) ? Gem.ruby : "ruby" rescue "ruby" end
      cmd = "#{ruby} -I#{$:.join(' -I')} #{Byebug::PROG_SCRIPT}"
    else
      cmd = Byebug::PROG_SCRIPT
    end
  else
    cmd = "#{Byebug::BYEBUG_SCRIPT} #{Byebug::PROG_SCRIPT}"
  end
  begin
    Dir.chdir(Byebug::INITIAL_DIR)
  rescue
    print "Failed to change initial directory #{Byebug::INITIAL_DIR}"
  end
  if @match[1]
    cmd += " #{@match[1]}"
  elsif not defined? Command.settings[:argv]
    return errmsg "Arguments not set. Use 'set args' to set them.\n"
  else
    require 'shellwords'
    cmd += " #{Command.settings[:argv].compact.shelljoin}"
  end
  # An execv would be preferable to the "exec" below.
  print "Re exec'ing:\n\t#{cmd}\n"
  exec cmd
rescue Errno::EOPNOTSUPP
  print "Restart command is not available at this time.\n"
end

def names

def names
  %w(restart)
end

def regexp

def regexp
  / ^\s*
  (?:restart|R)
  (?:\s+ (\S?.*\S))? \s*
  $
  /ix
end