Class: Commander::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane_core/ui/fastlane_runner.rb

Overview

This class override the run method with our custom stack trace handling In particular we want to distinguish between user_error! and crash! (one with, one without stack trace)

Instance Method Summary collapse

Instance Method Details

#display_user_error!(e, message) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 64

def display_user_error!(e, message)
  if $verbose # with stack trace
    reraise_formatted!(e, message)
  else
    abort "\n[!] #{message}".red # without stack trace
  end
end

#handle_unknown_error!(e) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 45

def handle_unknown_error!(e)
  # Some spaceship exception classes implement #preferred_error_info in order to share error info
  # that we'd rather display instead of crashing with a stack trace. However, fastlane_core and
  # spaceship can not know about each other's classes! To make this information passing work, we
  # use a bit of Ruby duck-typing to check whether the unknown exception type implements the right
  # method. If so, we'll present any returned error info in the manner of a user_error!
  error_info = e.respond_to?(:preferred_error_info) ? e.preferred_error_info : nil

  if error_info
    error_info = error_info.join("\n\t") if error_info.kind_of?(Array)
    display_user_error!(e, error_info)
  else
    FastlaneCore::CrashReporting.handle_crash(e)
    # From https://stackoverflow.com/a/4789702/445598
    # We do this to make the actual error message red and therefore more visible
    reraise_formatted!(e, e.message)
  end
end

#reraise_formatted!(e, message) ⇒ Object

Raises:

  • (e)


72
73
74
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 72

def reraise_formatted!(e, message)
  raise e, "[!] #{message}".red, e.backtrace
end

#run!Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 6

def run!
  require_program :version, :description
  trap('INT') { abort program(:int_message) } if program(:int_message)
  trap('INT') { program(:int_block).call } if program(:int_block)
  global_option('-h', '--help', 'Display help documentation') do
    args = @args - %w(-h --help)
    command(:help).run(*args)
    return
  end
  global_option('-v', '--version', 'Display version information') do
    say version
    return
  end
  parse_global_options
  remove_global_options options, @args

  begin
    run_active_command
  rescue InvalidCommandError => e
    abort "#{e}. Use --help for more information"
  rescue Interrupt => ex
    # We catch it so that the stack trace is hidden by default when using ctrl + c
    if $verbose
      raise ex
    else
      puts "\nCancelled... use --verbose to show the stack trace"
    end
  rescue \
    OptionParser::InvalidOption,
    OptionParser::InvalidArgument,
    OptionParser::MissingArgument => e
    abort e.to_s
  rescue FastlaneCore::Interface::FastlaneError => e # user_error!
    display_user_error!(e, e.message)
  rescue => e # high chance this is actually FastlaneCore::Interface::FastlaneCrash, but can be anything else
    handle_unknown_error!(e)
  end
end