#!/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/command' require 'time' def track_time start_time = Time.now yield ensure end_time = Time.now elapsed_time = end_time - start_time $stdout.flush $stderr.puts Rainbow("Elapsed Time: %0.3fs" % elapsed_time).magenta end def parse_argv if split_index = ARGV.index('--') ARGV.shift(split_index).tap{ARGV.shift} else ARGV.slice!(0..-1) end end # Get the arguments up until "--" ARGUMENTS = parse_argv OPTIONS = Trollop::options(ARGUMENTS) do banner Rainbow("Teapot: a decentralised package manager and build tool.").bright.blue version "teapot #{Teapot::VERSION}" opt :configuration, "Specify a specific build configuration.", :type => :string opt :limit, "Limit build to concurrent processes at once where possible", :type => :integer opt :only, "Only compiled direct dependencies." opt :continuous, "Run the build graph continually (experimental).", :type => :boolean, :short => :n 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 :verbose, "Verbose output and error backtraces.", :type => :boolean opt :version, "Print version and exit", :short => :none opt :help, "Show this message" end track_time do begin Teapot::Command.new(ARGUMENTS, OPTIONS).invoke 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