require 'travis/cli' require 'travis/tools/system' module Travis module CLI class Report < ApiCommand description "generates a report useful for filing issues" on '-r', '--known-repos', 'include repositories in report' skip :authenticate, :clear_error def run display("System", :general) display("CLI", :cli_info) display("Session", :session_info) display("Endpoints", :endpoints) display("Known Repositories", :known_repos) if known_repos? display_error say "For issues with the command line tool, please visit #{color("https://github.com/travis-ci/travis/issues", :underline)}." say "For Travis CI in general, go to #{color("https://github.com/travis-ci/travis-ci/issues", :underline)} or email #{color("support@travis-ci.com", :underline)}." end def display_error return unless error = load_file("error.log") display("Last Exception", :say, color(error, :info)) end def display(title, method, *args) say color(title, [:bold, :underline]) send(method, *args) { |*a| list(*a) } puts end def list(key, value, additional = nil) value = case value when Array then value.empty? ? 'none' : value.map(&:inspect).join(", ") when true then "yes" when false then "no" when nil then "unknown" else value.to_s end additional &&= " (#{additional})" say "#{key}:".ljust(known_repos? ? 50 : 25) << " " << color(value.to_s, :bold) << additional.to_s end def general yield "Ruby", Tools::System.ruby yield "Operating System", Tools::System.full_os yield "RubyGems", Tools::System.rubygems end def cli_info yield "Version", Travis::VERSION yield "Plugins", defined?(TRAVIS_PLUGINS) ? TRAVIS_PLUGINS : [] yield "Auto-Completion", Tools::Completion.completion_installed? yield "Last Version Check", last_check['at'] ? Time.at(last_check['at']) : 'never' end def session_info yield "API Endpoint", api_endpoint yield "Logged In", user_info yield "Verify SSL", !insecure yield "Enterprise", enterprise? end def endpoints config['endpoints'].each do |endpoint, info| info = [ info['access_token'] ? 'access token' : nil, info['insecure'] ? 'insecure' : nil, default_endpoint == endpoint ? 'default' : nil, endpoint == api_endpoint ? 'current' : nil ].compact yield endpoint_name(endpoint), endpoint, info.join(', ') end end def endpoint_name(url, prefix = "") case url when Travis::Client::ORG_URI then "#{prefix}org" when Travis::Client::PRO_URI then "#{prefix}pro" when /api-staging\.travis-ci/ then endpoint_name(url.sub("api-staging.", "api."), "staging-") else key, _ = config['enterprise'].detect { |k,v| v.start_with? url } key ? "enterprise %p" % key : "???" end end def known_repos config["repos"].each do |key, info| yield key, info['endpoint'] end end def user_info access_token ? "as %p" % user.login : "no" rescue Travis::Client::Error => e e.message end end end end