class Byebug::Runner
Responsible for starting the debugger when started from the command line.
def banner
Usage banner.
def banner <<-EOB.gsub(/^ {6}/, '') byebug #{Byebug::VERSION} Usage: byebug [options] <script.rb> -- <script.rb parameters> EOB end
def debug_program
Debugs a script only if syntax checks okay.
def debug_program error = Byebug.debug_load($PROGRAM_NAME, stop) puts "#{error}\n#{error.backtrace}" if error end
def error_in_script?
There is an error with the specified script
def error_in_script? no_script? || non_existing_script? || invalid_script? end
def help=(text)
def help=(text) @help ||= text interface.puts("#{text}\n") end
def init_script
def init_script defined?(@init_script) ? @init_script : true end
def initialize(stop = true, quit = true)
-
quit(Boolean) -- Whether the runner should quit right after -
stop(Boolean) -- Whether the runner should stop right before
def initialize(stop = true, quit = true) @stop = stop @quit = quit end
def interface
def interface @interface ||= LocalInterface.new end
def invalid_script?
Checks the debugged script has correct syntax
def invalid_script? return false if syntax_valid?(File.read($PROGRAM_NAME)) print_error('The script has incorrect syntax') true end
def no_script?
No script to debug specified
def no_script? return false unless $ARGV.empty? print_error('You must specify a program to debug') true end
def non_existing_script?
Extracts debugged program from command line args.
def non_existing_script? Byebug.mode = :standalone program = which($ARGV.shift) program = which($ARGV.shift) if program == which('ruby') if program $PROGRAM_NAME = program false else print_error("The script doesn't exist") true end end
def non_script_option?
An option that doesn't need a script specified was given
def non_script_option? version || help || remote end
def option_parser
Processes options passed from the command line.
def option_parser @option_parser ||= OptionParser.new(banner, 25) do |opts| opts.banner = banner OptionSetter.new(self, opts).setup end end
def print_error(msg)
Prints an error message and a help string
def print_error(msg) interface.errmsg(msg) interface.puts(option_parser.help) end
def remote=(host_and_port)
def remote=(host_and_port) @remote ||= Byebug.parse_host_and_port(host_and_port) Byebug.start_client(*@remote) end
def run
Starts byebug to debug a program.
def run option_parser.order!($ARGV) return if non_script_option? || error_in_script? Byebug.run_init_script if init_script loop do debug_program break if quit ControlProcessor.new.process_commands end end
def version=(number)
def version=(number) @version ||= number interface.puts("\n Running byebug #{number}\n") end
def which(cmd)
Borrowed from: http://stackoverflow.com/questions/2108727
Cross-platform way of finding an executable in the $PATH.
def which(cmd) return File.expand_path(cmd) if File.exist?(cmd) exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| exts.each do |ext| exe = File.join(path, "#{cmd}#{ext}") return exe if File.executable?(exe) && !File.directory?(exe) end end nil end