lib/rerun/options.rb in rerun-0.12.0 vs lib/rerun/options.rb in rerun-0.13.0

- old
+ new

@@ -15,128 +15,131 @@ # If you change the default pattern, please update the README.md file -- the list appears twice therein, which at the time of this comment are lines 17 and 119 DEFAULT_PATTERN = "**/*.{rb,js,coffee,css,scss,sass,erb,html,haml,ru,yml,slim,md,feature,c,h}" DEFAULT_DIRS = ["."] DEFAULTS = { - :pattern => DEFAULT_PATTERN, - :signal => (windows? ? "TERM,KILL" : "TERM,INT,KILL"), - :wait => 2, - :notify => true, - :quiet => false, - :verbose => false, - :name => Pathname.getwd.basename.to_s.capitalize, - :ignore => [], - :dir => DEFAULT_DIRS, - :force_polling => false, + :pattern => DEFAULT_PATTERN, + :signal => (windows? ? "TERM,KILL" : "TERM,INT,KILL"), + :wait => 2, + :notify => true, + :quiet => false, + :verbose => false, + :background => false, + :name => Pathname.getwd.basename.to_s.capitalize, + :ignore => [], + :dir => DEFAULT_DIRS, + :force_polling => false, } - def self.parse args = ARGV + def self.parse args: ARGV, config_file: nil default_options = DEFAULTS.dup options = { - ignore: [] + ignore: [] } - opts = OptionParser.new("", 24, ' ') do |opts| - opts.banner = "Usage: rerun [options] [--] cmd" + if config_file && File.exist?(config_file) + require 'shellwords' + config_args = File.read(config_file).shellsplit + args = config_args + args + end - opts.separator "" - opts.separator "Launches an app, and restarts it when the filesystem changes." - opts.separator "See http://github.com/alexch/rerun for more info." - opts.separator "Version: #{$spec.version}" - opts.separator "" - opts.separator "Options:" + option_parser = OptionParser.new("", 24, ' ') do |o| + o.banner = "Usage: rerun [options] [--] cmd" - opts.on("-d dir", "--dir dir", "directory to watch, default = \"#{DEFAULT_DIRS}\". Specify multiple paths with ',' or separate '-d dir' option pairs.") do |dir| + o.separator "" + o.separator "Launches an app, and restarts it when the filesystem changes." + o.separator "See http://github.com/alexch/rerun for more info." + o.separator "Version: #{$spec.version}" + o.separator "" + o.separator "Options:" + + o.on("-d dir", "--dir dir", "directory to watch, default = \"#{DEFAULT_DIRS}\". Specify multiple paths with ',' or separate '-d dir' option pairs.") do |dir| elements = dir.split(",") options[:dir] = (options[:dir] || []) + elements end # todo: rename to "--watch" - opts.on("-p pattern", "--pattern pattern", "file glob to watch, default = \"#{DEFAULTS[:pattern]}\"") do |pattern| + o.on("-p pattern", "--pattern pattern", "file glob to watch, default = \"#{DEFAULTS[:pattern]}\"") do |pattern| options[:pattern] = pattern end - opts.on("-i pattern", "--ignore pattern", "file glob to ignore (can be set many times). To ignore a directory, you must append '/*' e.g. --ignore 'coverage/*'") do |pattern| + o.on("-i pattern", "--ignore pattern", "file glob to ignore (can be set many times). To ignore a directory, you must append '/*' e.g. --ignore 'coverage/*'") do |pattern| options[:ignore] += [pattern] end - opts.on("-s signal", "--signal signal", "terminate process using this signal. To try several signals in series, use a comma-delimited list. Default: \"#{DEFAULTS[:signal]}\"") do |signal| + o.on("-s signal", "--signal signal", "terminate process using this signal. To try several signals in series, use a comma-delimited list. Default: \"#{DEFAULTS[:signal]}\"") do |signal| options[:signal] = signal end - opts.on("-w sec", "--wait sec", "after asking the process to terminate, wait this long (in seconds) before either aborting, or trying the next signal in series. Default: #{DEFAULTS[:wait]} sec") + o.on("-w sec", "--wait sec", "after asking the process to terminate, wait this long (in seconds) before either aborting, or trying the next signal in series. Default: #{DEFAULTS[:wait]} sec") - opts.on("-r", "--restart", "expect process to restart itself, so just send a signal and continue watching. Uses the HUP signal unless overridden using --signal") do |signal| + o.on("-r", "--restart", "expect process to restart itself, so just send a signal and continue watching. Uses the HUP signal unless overridden using --signal") do |signal| options[:restart] = true default_options[:signal] = "HUP" end - opts.on("-x", "--exit", "expect the program to exit. With this option, rerun checks the return value; without it, rerun checks that the process is running.") do |dir| - options[:exit] = true + o.on("-x", "--exit", "expect the program to exit. With this option, rerun checks the return value; without it, rerun checks that the process is running.") do |value| + options[:exit] = value end - opts.on("-c", "--clear", "clear screen before each run") do - options[:clear] = true + o.on("-c", "--clear", "clear screen before each run") do |value| + options[:clear] = value end - opts.on("-b", "--background", "disable on-the-fly commands, allowing the process to be backgrounded") do - options[:background] = true + o.on("-b", "--background", "disable on-the-fly commands, allowing the process to be backgrounded") do |value| + options[:background] = value end - opts.on("-n name", "--name name", "name of app used in logs and notifications, default = \"#{DEFAULTS[:name]}\"") do |name| + o.on("-n name", "--name name", "name of app used in logs and notifications, default = \"#{DEFAULTS[:name]}\"") do |name| options[:name] = name end - opts.on("--force-polling", "use polling instead of a native filesystem scan (useful for Vagrant)") do - options[:force_polling] = true + o.on("--[no-]force-polling", "use polling instead of a native filesystem scan (useful for Vagrant)") do |value| + options[:force_polling] = value end - opts.on("--no-growl", "don't use growl [OBSOLETE]") do + o.on("--no-growl", "don't use growl [OBSOLETE]") do options[:growl] = false $stderr.puts "--no-growl is obsolete; use --no-notify instead" return end - opts.on("--[no-]notify [notifier]", "send messages through a desktop notification application. Supports growl (requires growlnotify), osx (requires terminal-notifier gem), and notify-send on GNU/Linux (notify-send must be installed)") do |notifier| + o.on("--[no-]notify [notifier]", "send messages through a desktop notification application. Supports growl (requires growlnotify), osx (requires terminal-notifier gem), and notify-send on GNU/Linux (notify-send must be installed)") do |notifier| notifier = true if notifier.nil? options[:notify] = notifier end - opts.on("-q", "--quiet", "don't output any logs") do - options[:quiet] = true + o.on("-q", "--[no-]quiet", "don't output any logs") do |value| + options[:quiet] = value end - opts.on("--verbose", "log extra stuff like PIDs (unless you also specified `--quiet`") do - options[:verbose] = true + o.on("--[no-]verbose", "log extra stuff like PIDs (unless you also specified `--quiet`") do |value| + options[:verbose] = value end - opts.on_tail("-h", "--help", "--usage", "show this message") do - puts opts + o.on_tail("-h", "--help", "--usage", "show this message and immediately exit") do + puts o return end - opts.on_tail("--version", "show version") do + o.on_tail("--version", "show version and immediately exit") do puts $spec.version return end - opts.on_tail "" - opts.on_tail "On top of --pattern and --ignore, we ignore any changes to files and dirs starting with a dot." + o.on_tail "" + o.on_tail "On top of --pattern and --ignore, we ignore any changes to files and dirs starting with a dot." end - if args.empty? - puts opts - nil - else - opts.parse! args - default_options[:cmd] = args.join(" ") + option_parser.parse! args + options = default_options.merge(options) + options[:cmd] = args.join(" ").strip # todo: better arg word handling - options = default_options.merge(options) + puts option_parser if args.empty? - options - end + options end - end + end