Class: FastlaneCore::CommandExecutor

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

Overview

Executes commands and takes care of error handling and more

Class Method Summary collapse

Class Method Details

.execute(command: nil, print_all: false, print_command: true, error: nil, prefix: nil, loading: nil, suppress_output: false) ⇒ String

Returns All the output as string.

Parameters:

  • command (String) (defaults to: nil)

    The command to be executed

  • print_all (Boolean) (defaults to: false)

    Do we want to print out the command output while running?

  • print_command (Boolean) (defaults to: true)

    Should we print the command that's being executed

  • error (Block) (defaults to: nil)

    A block that's called if an error occurs

  • prefix (Array) (defaults to: nil)

    An array containing a prefix + block which might get applied to the output

  • loading (String) (defaults to: nil)

    A loading string that is shown before the first output

  • suppress_output (Boolean) (defaults to: false)

    Should we print the command's output?

Returns:

  • (String)

    All the output as string


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'fastlane_core/lib/fastlane_core/command_executor.rb', line 39

def execute(command: nil, print_all: false, print_command: true, error: nil, prefix: nil, loading: nil, suppress_output: false)
  print_all = true if FastlaneCore::Globals.verbose?
  prefix ||= {}

  output = []
  command = command.join(" ") if command.kind_of?(Array)
  UI.command(command) if print_command

  if print_all && loading # this is only used to show the "Loading text"...
    UI.command_output(loading)
  end

  begin
    status = FastlaneCore::FastlanePty.spawn(command) do |command_stdout, command_stdin, pid|
      command_stdout.each do |l|
        line = l.strip # strip so that \n gets removed
        output << line

        next unless print_all

        # Prefix the current line with a string
        prefix.each do |element|
          line = element[:prefix] + line if element[:block] && element[:block].call(line)
        end

        UI.command_output(line) unless suppress_output
      end
    end
  rescue => ex
    # FastlanePty adds exit_status on to StandardError so every error will have a status code
    status = ex.exit_status

    # This could happen when the environment is wrong:
    # > invalid byte sequence in US-ASCII (ArgumentError)
    output << ex.to_s
    o = output.join("\n")
    puts(o)
    if error
      error.call(o, nil)
    else
      raise ex
    end
  end

  # Exit status for build command, should be 0 if build succeeded
  if status != 0
    o = output.join("\n")
    puts(o) unless suppress_output # the user has the right to see the raw output
    UI.error("Exit status: #{status}")
    if error
      error.call(o, status)
    else
      UI.user_error!("Exit status: #{status}")
    end
  end

  return output.join("\n")
end

.which(cmd) ⇒ Object

Cross-platform way of finding an executable in the $PATH. Respects the $PATHEXT, which lists valid file extensions for executables on Windows.

which('ruby') #=> /usr/bin/ruby

Derived from stackoverflow.com/a/5471032/3005


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'fastlane_core/lib/fastlane_core/command_executor.rb', line 15

def which(cmd)
  # PATHEXT contains the list of file extensions that Windows considers executable, semicolon separated.
  # e.g. ".COM;.EXE;.BAT;.CMD"
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : []
  exts << '' # Always have an empty string (= no file extension)

  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
    exts.each do |ext|
      cmd_path = File.join(path, "#{cmd}#{ext}")
      return cmd_path if Helper.executable?(cmd_path)
    end
  end

  return nil
end