#!/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 'benchmark' require 'trollop' OPTIONS = Trollop::options do opt :only, "Only compiled direct dependencies." opt :in, "Work in the given directory.", :type => :string opt :configuration, "Specify a specific build configuration.", :type => :string 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.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 Dir.chdir(root) do Teapot::Commands.run("git", "init") end make_controller(root).create(project_name, source, packages) end def self.generate(arguments = ARGV) generator_name = arguments.shift make_controller.generate(generator_name, arguments) end 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 time = Benchmark.measure do begin Application.send(action.to_sym) rescue Teapot::NonexistantTeapotError => error $stderr.puts error.message.color(:red) rescue Teapot::IncompatibleTeapotError => error $stderr.puts error.message.color(:red) rescue Teapot::Commands::CommandError => error $stderr.puts error.message.color(:red) 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.inspect}".color(:red) end end end $stderr.puts "Cannot continue due to unresolved dependencies!".color(:red) end end $stdout.flush $stderr.puts time.format("Elapsed Time: %r").color(:magenta)