Class: FastlaneCore::TransporterExecutor

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

Overview

Base class for executing the iTMSTransporter

Constant Summary collapse

ITMS_PROVIDER_REGEX =

Matches a line in the iTMSTransporter provider table: “12 Initech Systems Inc LG89CQY559”

/^\d+\s{2,}.+\s{2,}[^\s]+$/

Instance Method Summary collapse

Instance Method Details

#build_download_command(username, password, apple_id, destination = "/tmp", provider_short_name = "", jwt = nil) ⇒ Object



38
39
40
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 38

def build_download_command(username, password, apple_id, destination = "/tmp", provider_short_name = "", jwt = nil)
  not_implemented(__method__)
end

#build_provider_ids_command(username, password, jwt = nil, api_key = nil) ⇒ Object



42
43
44
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 42

def build_provider_ids_command(username, password, jwt = nil, api_key = nil)
  not_implemented(__method__)
end

#build_upload_command(username, password, source = "/tmp", provider_short_name = "", jwt = nil, platform = nil, api_key = nil) ⇒ Object



46
47
48
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 46

def build_upload_command(username, password, source = "/tmp", provider_short_name = "", jwt = nil, platform = nil, api_key = nil)
  not_implemented(__method__)
end

#build_verify_command(username, password, source = "/tmp", provider_short_name = "", **kwargs) ⇒ Object



50
51
52
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 50

def build_verify_command(username, password, source = "/tmp", provider_short_name = "", **kwargs)
  not_implemented(__method__)
end

#displayable_errorsObject



118
119
120
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 118

def displayable_errors
  @errors.map { |error| "[Transporter Error Output]: #{error}" }.join("\n").gsub!(/"/, "")
end

#execute(command, hide_output) {|@all_lines| ... } ⇒ Object

Yields:

  • (@all_lines)


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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 54

def execute(command, hide_output)
  if Helper.test?
    yield(nil) if block_given?
    return command
  end

  @errors = []
  @warnings = []
  @all_lines = []

  if hide_output
    # Show a one time message instead
    UI.success("Waiting for App Store Connect transporter to be finished.")
    UI.success("iTunes Transporter progress... this might take a few minutes...")
  end

  begin
    exit_status = FastlaneCore::FastlanePty.spawn(command) do |command_stdout, command_stdin, pid|
      begin
        command_stdout.each do |line|
          @all_lines << line
          parse_line(line, hide_output) # this is where the parsing happens
        end
      end
    end
  rescue => ex
    # FastlanePty adds exit_status on to StandardError so every error will have a status code
    exit_status = ex.exit_status
    @errors << ex.to_s
  end

  unless exit_status.zero?
    @errors << "The call to the iTMSTransporter completed with a non-zero exit status: #{exit_status}. This indicates a failure."
  end

  if @warnings.count > 0
    UI.important(@warnings.join("\n"))
  end

  if @errors.join("").include?("app-specific")
    raise TransporterRequiresApplicationSpecificPasswordError
  end

  if @errors.count > 0 && @all_lines.count > 0
    # Print out the last 15 lines, this is key for non-verbose mode
    @all_lines.last(15).each do |line|
      UI.important("[iTMSTransporter] #{line}")
    end
    UI.message("iTunes Transporter output above ^")
    UI.error(@errors.join("\n"))
  end

  # this is to handle GitHub issue #1896, which occurs when an
  #  iTMSTransporter file transfer fails; iTMSTransporter will log an error
  #  but will then retry; if that retry is successful, we will see the error
  #  logged, but since the status code is zero, we want to return success
  if @errors.count > 0 && exit_status.zero?
    UI.important("Although errors occurred during execution of iTMSTransporter, it returned success status.")
  end

  yield(@all_lines) if block_given?
  return exit_status.zero?
end

#parse_provider_info(lines) ⇒ Object



122
123
124
# File 'fastlane_core/lib/fastlane_core/itunes_transporter.rb', line 122

def parse_provider_info(lines)
  lines.map { |line| itms_provider_pair(line) }.compact.to_h
end