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



70
71
72
73
74
75
76
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 70

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



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 52

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
    # 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)


78
79
80
# File 'lib/fastlane_core/ui/fastlane_runner.rb', line 78

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
44
45
46
47
48
49
50
# 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

  collector = FastlaneCore::ToolCollector.new

  begin
    collector.did_launch_action(@program[:name])
    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!
    collector.did_raise_error(@program[:name])
    display_user_error!(e, e.message)
  rescue => e # high chance this is actually FastlaneCore::Interface::FastlaneCrash, but can be anything else
    collector.did_crash(@program[:name])
    handle_unknown_error!(e)
  ensure
    collector.did_finish
  end
end