#!/usr/bin/env ruby # Copyright, 2012, by Samuel G. D. Williams. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'teapot/controller' require 'teapot/controller/build' require 'teapot/controller/clean' require 'teapot/controller/create' require 'teapot/controller/fetch' require 'teapot/controller/generate' require 'teapot/controller/list' require 'teapot/controller/run' require 'teapot/repository' require 'time' require 'trollop' OPTIONS = Trollop::options do version "teapot v#{Teapot::VERSION}" opt :only, "Only compiled direct dependencies." opt :in, "Work in the given directory.", :type => :string opt :unlock, "Don't use package lockfile when fetching." opt :force, "Force the operation if it would otherwise be be stopped due to a warning." opt :configuration, "Specify a specific build configuration.", :type => :string opt :verbose, "Verbose output and error backtraces." end def make_controller(root = nil) root ||= OPTIONS[:in] || Dir.getwd Teapot::Controller.new(root, OPTIONS) end # It would be nice to make this code a bit simpler, perhaps moving some parts of it to lib/teapot/application/{function}.rb module Application def self.clean make_controller.clean end def self.fetch make_controller.fetch end def self.build(targets = ARGV) make_controller.build(targets) end def self.run(targets = ARGV) make_controller.run(targets) end def self.list make_controller.list end def self.create project_name = ARGV.shift project_directory = project_name.gsub(/\s+/, '-').downcase source = ARGV.shift packages = ARGV root = Pathname(Dir.getwd) + project_directory if root.exist? abort "#{root} already exists!".color(:red) end # Make the path: root.mkpath Teapot::Repository.new(root).init! make_controller(root).create(project_name, source, packages) end def self.generate(arguments = ARGV) generator_name = arguments.shift make_controller.generate(generator_name, arguments, OPTIONS[:force]) end end def track_time start_time = Time.now yield ensure end_time = Time.now elapsed_time = end_time - start_time $stdout.flush $stderr.puts ("Elapsed Time: %0.3fs" % elapsed_time).color(:magenta) end valid_actions = (Application.public_methods - Module.methods).collect(&:to_s) action = ARGV.shift # Check that the command was invoked correctly... unless action and valid_actions.include?(action) puts "You must specify an action from: #{valid_actions.join(', ')}".color(:red) exit -1 end track_time do begin Application.send(action.to_sym) rescue Teapot::IncompatibleTeapotError => error $stderr.puts error.message.color(:red) $stderr.puts "Supported minimum version #{Teapot::MINIMUM_LOADER_VERSION.dump} to #{Teapot::LOADER_VERSION.dump}." exit -3 rescue Teapot::Dependency::UnresolvedDependencyError => error $stderr.puts "Unresolved dependencies:" error.chain.unresolved.each do |(name, parent)| $stderr.puts "#{parent} depends on #{name.inspect}".color(:red) conflicts = error.chain.conflicts[name] if conflicts conflicts.each do |conflict| $stderr.puts " - provided by #{conflict.name}".color(:red) end end end $stderr.puts "Cannot continue due to unresolved dependencies!".color(:red) exit -5 rescue StandardError => error $stderr.puts error.message.color(:red) # Could be nice to have some improved error reporting. if OPTIONS[:verbose] $stderr.puts error.backtrace else $stderr.puts "Run with --verbose for more details." end exit -10 end end