#!/usr/bin/env ruby Signal.trap("INT") { exit 1 } require 'optparse' require 'dply/error' require 'dply/version' require 'dply/logger' require 'dply/config' require 'pathname' File.umask 0022 logger = ::Dply::Logger.logger options = {} opts_parser = OptionParser.new do |opts| banner = [] banner << "Usage: drake [global options] command [options] args" banner << "Commands: deploy reload task" banner << "Options: " opts.banner = banner.join("\n") opts.on("-d", "--dir [DEPLOY DIR]" , "Set dir") do |d| path = Pathname.new(d) raise ::Dply::Error, "dir path must be absolute" if path.relative? options[:dir] = path end opts.on("--remote" , "Set remote mode") do logger.remote_mode = true end opts.on("-v", "--version", "Show version") do |v| puts ::Dply::VERSION exit end opts.on("--debug", "Show debug messages") do options[:debug] = true logger.level = ::Logger::DEBUG end opts.on("--trace", "Show debug messages and exception stack trace") do options[:debug] = true options[:trace] = true logger.level = ::Logger::DEBUG logger.trace_mode = true end opts.on_tail("-h", "--help", "Show this message") do puts opts exit end end def run_cli(command, argv) command = command.to_s.gsub("-", "_") require "dply/cli/#{command}" klass_name = command.split('_').collect(&:capitalize).join const = "::Dply::Cli::#{klass_name}" klass = Module.const_get const cli = klass.new(argv) cli.run end begin opts_parser.order!(ARGV) Dir.chdir options[:dir] if options[:dir] command = (ARGV.shift || "").to_sym case command when :deploy, :reload, :task, :build, :depcheck, :"install-pkgs", :reopen_logs, :status run_cli command, ARGV when /\A[a-zA-Z_\-0-9]+[:][a-zA-Z_\-0-9]+\z/ require 'dply/tasks' ::Dply::Tasks.new.rake command when :'' puts opts_parser else raise Dply::Error, "no such command #{command}" end rescue OptionParser::InvalidOption, OptionParser::MissingArgument, ::Dply::Error => e cause = e.cause if options[:trace] puts cause cause ? (raise cause) : (raise e) else logger.debug "#{cause.message}" if cause logger.error "#{e.message}" abort end end