fastlane 2.73.0 → 2.74.0.beta.20180106010004
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/deliver/lib/assets/summary.html.erb +2 -1
- data/fastlane/lib/fastlane.rb +0 -2
- data/fastlane/lib/fastlane/commands_generator.rb +5 -2
- data/fastlane/lib/fastlane/lane_manager.rb +0 -45
- data/fastlane/lib/fastlane/lane_manager_base.rb +4 -4
- data/fastlane/lib/fastlane/runner.rb +4 -0
- data/fastlane/lib/fastlane/server/{command.rb → action_command.rb} +16 -25
- data/fastlane/lib/fastlane/server/action_command_return.rb +14 -0
- data/fastlane/lib/fastlane/server/command_executor.rb +0 -2
- data/fastlane/lib/fastlane/server/command_parser.rb +20 -0
- data/fastlane/lib/fastlane/server/control_command.rb +23 -0
- data/fastlane/lib/fastlane/server/json_return_value_processor.rb +71 -0
- data/fastlane/lib/fastlane/server/socket_server.rb +111 -112
- data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +4 -3
- data/fastlane/lib/fastlane/swift_lane_manager.rb +17 -6
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/ControlCommand.swift +71 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +8 -0
- data/fastlane/swift/LaneFileProtocol.swift +55 -27
- data/fastlane/swift/RubyCommand.swift +3 -6
- data/fastlane/swift/RubyCommandable.swift +38 -0
- data/fastlane/swift/Runner.swift +6 -3
- data/fastlane/swift/SocketClient.swift +43 -27
- data/fastlane/swift/SocketResponse.swift +7 -2
- data/fastlane/swift/main.swift +5 -3
- metadata +24 -24
- data/fastlane/lib/.DS_Store +0 -0
- data/fastlane/lib/assets/.DS_Store +0 -0
- data/fastlane/lib/fastlane/.DS_Store +0 -0
- data/fastlane/lib/fastlane/actions/.DS_Store +0 -0
- data/fastlane/lib/fastlane/actions/docs/.DS_Store +0 -0
- data/fastlane/lib/fastlane/setup/.DS_Store +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 244eb914f52a52b8114ccf2b46476f43d44ed56e
|
4
|
+
data.tar.gz: fd4ddc091bb00205542592c5925a9eaa66ff5116
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee764b619920b915d8b7bc4958b758d47599d0f0af067bf9265801a63b933f671a3fcc9f71b823f8bc8647f4dea31603d19f4bab540ebc15fb8cdd978f33a0e7
|
7
|
+
data.tar.gz: 5a5fc60562c8d5b48acb9f9b880fd484c503d3e1a4b1bd84cae6434cfe609acb232a1bf7a9bc90e0370f01441385bf70d58a4e60316fdf5f2fcfd0fbbc3f5133
|
@@ -261,7 +261,8 @@
|
|
261
261
|
</div>
|
262
262
|
|
263
263
|
<hr />
|
264
|
-
<% end # end data
|
264
|
+
<% end # end data
|
265
|
+
%>
|
265
266
|
<% if @options[:trade_representative_contact_information] %>
|
266
267
|
<div class="app-minor-information">
|
267
268
|
<div class="cat-headline">Trade Representative Contact Information</div>
|
data/fastlane/lib/fastlane.rb
CHANGED
@@ -20,8 +20,6 @@ require 'fastlane/supported_platforms'
|
|
20
20
|
require 'fastlane/configuration_helper'
|
21
21
|
require 'fastlane/one_off'
|
22
22
|
require 'fastlane/server/socket_server_action_command_executor'
|
23
|
-
require 'fastlane/server/command_executor'
|
24
|
-
require 'fastlane/server/command'
|
25
23
|
require 'fastlane/server/socket_server'
|
26
24
|
require 'fastlane/command_line_handler'
|
27
25
|
require 'fastlane/documentation/docs_generator'
|
@@ -43,7 +43,10 @@ module Fastlane
|
|
43
43
|
ensure
|
44
44
|
Fastlane::PluginUpdateManager.show_update_status
|
45
45
|
if FastlaneCore::Globals.capture_output?
|
46
|
-
|
46
|
+
if $stdout.respond_to?(:string)
|
47
|
+
# Sometimes you can get NoMethodError: undefined method `string' for #<IO:<STDOUT>> when runing with FastlaneRunner (swift)
|
48
|
+
FastlaneCore::Globals.captured_output = Helper.strip_ansi_colors($stdout.string)
|
49
|
+
end
|
47
50
|
$stdout = STDOUT
|
48
51
|
$stderr = STDERR
|
49
52
|
|
@@ -87,7 +90,7 @@ module Fastlane
|
|
87
90
|
|
88
91
|
global_option('--verbose') { FastlaneCore::Globals.verbose = true }
|
89
92
|
global_option('--capture_output', 'Captures the output of the current run, and generates a markdown issue template') do
|
90
|
-
FastlaneCore::Globals.capture_output =
|
93
|
+
FastlaneCore::Globals.capture_output = false
|
91
94
|
FastlaneCore::Globals.verbose = true
|
92
95
|
end
|
93
96
|
global_option('--troubleshoot', 'Enables extended verbose mode. Use with caution, as this even includes ALL sensitive data. Cannot be used on CI.')
|
@@ -68,7 +68,6 @@ module Fastlane
|
|
68
68
|
Fastlane::DocsGenerator.run(ff) unless skip_docs?
|
69
69
|
|
70
70
|
duration = ((Time.now - started) / 60.0).round
|
71
|
-
|
72
71
|
finish_fastlane(ff, duration, e)
|
73
72
|
|
74
73
|
return ff
|
@@ -78,50 +77,6 @@ module Fastlane
|
|
78
77
|
Helper.test? || FastlaneCore::Env.truthy?("FASTLANE_SKIP_DOCS")
|
79
78
|
end
|
80
79
|
|
81
|
-
# All the finishing up that needs to be done
|
82
|
-
def self.finish_fastlane(ff, duration, error)
|
83
|
-
# Finished with all the lanes
|
84
|
-
Fastlane::JUnitGenerator.generate(Fastlane::Actions.executed_actions)
|
85
|
-
print_table(Fastlane::Actions.executed_actions)
|
86
|
-
|
87
|
-
Fastlane::PluginUpdateManager.show_update_status
|
88
|
-
|
89
|
-
if error
|
90
|
-
UI.error 'fastlane finished with errors'
|
91
|
-
raise error
|
92
|
-
elsif duration > 5
|
93
|
-
UI.success "fastlane.tools just saved you #{duration} minutes! 🎉"
|
94
|
-
else
|
95
|
-
UI.success 'fastlane.tools finished successfully 🎉'
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Print a table as summary of the executed actions
|
100
|
-
def self.print_table(actions)
|
101
|
-
return if actions.count == 0
|
102
|
-
|
103
|
-
require 'terminal-table'
|
104
|
-
|
105
|
-
rows = []
|
106
|
-
actions.each_with_index do |current, i|
|
107
|
-
is_error_step = !current[:error].to_s.empty?
|
108
|
-
|
109
|
-
name = current[:name][0..60]
|
110
|
-
name = name.red if is_error_step
|
111
|
-
index = i + 1
|
112
|
-
index = "💥" if is_error_step
|
113
|
-
rows << [index, name, current[:time].to_i]
|
114
|
-
end
|
115
|
-
|
116
|
-
puts ""
|
117
|
-
puts Terminal::Table.new(
|
118
|
-
title: "fastlane summary".green,
|
119
|
-
headings: ["Step", "Action", "Time (in s)"],
|
120
|
-
rows: FastlaneCore::PrintTable.transform_output(rows)
|
121
|
-
)
|
122
|
-
puts ""
|
123
|
-
end
|
124
|
-
|
125
80
|
# Lane chooser if user didn't provide a lane
|
126
81
|
# @param platform: is probably nil, but user might have called `fastlane android`, and only wants to list those actions
|
127
82
|
def self.choose_lane(ff, platform)
|
@@ -7,7 +7,7 @@ module Fastlane
|
|
7
7
|
end
|
8
8
|
|
9
9
|
# All the finishing up that needs to be done
|
10
|
-
def self.finish_fastlane(ff, duration, error)
|
10
|
+
def self.finish_fastlane(ff, duration, error, skip_message: false)
|
11
11
|
# Sometimes we don't have a fastfile because we're using Fastfile.swift
|
12
12
|
unless ff.nil?
|
13
13
|
ff.runner.did_finish
|
@@ -20,12 +20,12 @@ module Fastlane
|
|
20
20
|
Fastlane::PluginUpdateManager.show_update_status
|
21
21
|
|
22
22
|
if error
|
23
|
-
UI.error 'fastlane finished with errors'
|
23
|
+
UI.error 'fastlane finished with errors' unless skip_message
|
24
24
|
raise error
|
25
25
|
elsif duration > 5
|
26
|
-
UI.success "fastlane.tools just saved you #{duration} minutes! 🎉"
|
26
|
+
UI.success "fastlane.tools just saved you #{duration} minutes! 🎉" unless skip_message
|
27
27
|
else
|
28
|
-
UI.success 'fastlane.tools finished successfully 🎉'
|
28
|
+
UI.success 'fastlane.tools finished successfully 🎉' unless skip_message
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -1,6 +1,5 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
1
|
module Fastlane
|
2
|
+
# Represents an argument to the ActionCommand
|
4
3
|
class Argument
|
5
4
|
def initialize(json: nil)
|
6
5
|
@name = json['name']
|
@@ -25,19 +24,28 @@ module Fastlane
|
|
25
24
|
attr_reader :value_type
|
26
25
|
end
|
27
26
|
|
28
|
-
|
27
|
+
# Represents a command that is meant to execute an Action on the client's behalf
|
28
|
+
class ActionCommand
|
29
|
+
attr_reader :command_id # always present
|
30
|
+
attr_reader :args # always present
|
31
|
+
attr_reader :method_name # always present
|
32
|
+
attr_reader :class_name # only present when executing a class-method
|
33
|
+
|
29
34
|
def initialize(json: nil)
|
30
|
-
|
31
|
-
@
|
32
|
-
@
|
33
|
-
@command_id = command_json['commandID']
|
35
|
+
@method_name = json['methodName']
|
36
|
+
@class_name = json['className']
|
37
|
+
@command_id = json['commandID']
|
34
38
|
|
35
|
-
args_json =
|
39
|
+
args_json = json['args'] ||= []
|
36
40
|
@args = args_json.map do |arg|
|
37
41
|
Argument.new(json: arg)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
45
|
+
def cancel_signal?
|
46
|
+
return @command_id == "cancelFastlaneRun"
|
47
|
+
end
|
48
|
+
|
41
49
|
def target_class
|
42
50
|
unless class_name
|
43
51
|
return nil
|
@@ -49,22 +57,5 @@ module Fastlane
|
|
49
57
|
def is_class_method_command
|
50
58
|
return class_name.to_s.length > 0
|
51
59
|
end
|
52
|
-
|
53
|
-
attr_reader :command_id # always present
|
54
|
-
attr_reader :args # always present
|
55
|
-
attr_reader :method_name # always present
|
56
|
-
attr_reader :class_name # only present when executing a class-method
|
57
|
-
end
|
58
|
-
|
59
|
-
class CommandReturn
|
60
|
-
attr_reader :return_value
|
61
|
-
attr_reader :return_value_type
|
62
|
-
attr_reader :closure_argument_value
|
63
|
-
|
64
|
-
def initialize(return_value: nil, return_value_type: nil, closure_argument_value: nil)
|
65
|
-
@return_value = return_value
|
66
|
-
@closure_argument_value = closure_argument_value
|
67
|
-
@return_value_type = return_value_type
|
68
|
-
end
|
69
60
|
end
|
70
61
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Fastlane
|
2
|
+
# Encapsulates the result and description of a return object returned by an executed fastlane action
|
3
|
+
class ActionCommandReturn
|
4
|
+
attr_reader :return_value
|
5
|
+
attr_reader :return_value_type
|
6
|
+
attr_reader :closure_argument_value
|
7
|
+
|
8
|
+
def initialize(return_value: nil, return_value_type: nil, closure_argument_value: nil)
|
9
|
+
@return_value = return_value
|
10
|
+
@closure_argument_value = closure_argument_value
|
11
|
+
@return_value_type = return_value_type
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'fastlane/server/action_command.rb'
|
2
|
+
require 'fastlane/server/control_command.rb'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
class CommandParser
|
7
|
+
def self.parse(json: nil)
|
8
|
+
command_json = JSON.parse(json)
|
9
|
+
command_type = command_json['commandType'].to_sym
|
10
|
+
command = command_json['command']
|
11
|
+
|
12
|
+
case command_type
|
13
|
+
when :action
|
14
|
+
return ActionCommand.new(json: command)
|
15
|
+
when :control
|
16
|
+
return ControlCommand.new(json: command)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Fastlane
|
2
|
+
# Represents a command that is meant to signal the server to do something on the client's behalf
|
3
|
+
# Examples are: :cancelFastlaneRune, and :done
|
4
|
+
class ControlCommand
|
5
|
+
attr_reader :command
|
6
|
+
attr_reader :user_message
|
7
|
+
attr_reader :reason
|
8
|
+
|
9
|
+
def initialize(json: nil)
|
10
|
+
@command = json['command'].to_sym
|
11
|
+
@user_message = json['userMessage']
|
12
|
+
@reason = json['reason'].to_sym if json['reason']
|
13
|
+
end
|
14
|
+
|
15
|
+
def cancel_signal?
|
16
|
+
return @command == :cancelFastlaneRun
|
17
|
+
end
|
18
|
+
|
19
|
+
def done_signal?
|
20
|
+
return @command == :done
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
class JSONReturnValueProcessor
|
5
|
+
def prepare_object(return_value: nil, return_value_type: nil)
|
6
|
+
case return_value_type
|
7
|
+
when nil
|
8
|
+
UI.verbose("return_value_type is nil value: #{return_value}")
|
9
|
+
return process_value_as_string(return_value: return_value)
|
10
|
+
when :string
|
11
|
+
return process_value_as_string(return_value: return_value)
|
12
|
+
when :int
|
13
|
+
return process_value_as_int(return_value: return_value)
|
14
|
+
when :bool
|
15
|
+
return process_value_as_bool(return_value: return_value)
|
16
|
+
when :array_of_strings
|
17
|
+
return process_value_as_array_of_strings(return_value: return_value)
|
18
|
+
when :hash_of_strings
|
19
|
+
return process_value_as_hash_of_strings(return_value: return_value)
|
20
|
+
else
|
21
|
+
UI.verbose("Unknown return type defined: #{return_value_type} for value: #{return_value}")
|
22
|
+
return process_value_as_string(return_value: return_value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_value_as_string(return_value: nil)
|
27
|
+
if return_value.nil?
|
28
|
+
return_value = ""
|
29
|
+
end
|
30
|
+
|
31
|
+
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
32
|
+
return JSON.generate(return_value.to_s, quirks_mode: true)
|
33
|
+
end
|
34
|
+
|
35
|
+
def process_value_as_array_of_strings(return_value: nil)
|
36
|
+
if return_value.nil?
|
37
|
+
return_value = []
|
38
|
+
end
|
39
|
+
|
40
|
+
# quirks_mode shouldn't be required for real objects
|
41
|
+
return JSON.generate(return_value)
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_value_as_hash_of_strings(return_value: nil)
|
45
|
+
if return_value.nil?
|
46
|
+
return_value = {}
|
47
|
+
end
|
48
|
+
|
49
|
+
# quirks_mode shouldn't be required for real objects
|
50
|
+
return JSON.generate(return_value)
|
51
|
+
end
|
52
|
+
|
53
|
+
def process_value_as_bool(return_value: nil)
|
54
|
+
if return_value.nil?
|
55
|
+
return_value = false
|
56
|
+
end
|
57
|
+
|
58
|
+
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
59
|
+
return JSON.generate(return_value.to_s, quirks_mode: true)
|
60
|
+
end
|
61
|
+
|
62
|
+
def process_value_as_int(return_value: nil)
|
63
|
+
if return_value.nil?
|
64
|
+
return_value = 0
|
65
|
+
end
|
66
|
+
|
67
|
+
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
68
|
+
return JSON.generate(return_value.to_s, quirks_mode: true)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,10 +1,17 @@
|
|
1
|
-
require 'fastlane/server/command.rb'
|
2
1
|
require 'fastlane/server/command_executor.rb'
|
2
|
+
require 'fastlane/server/command_parser.rb'
|
3
|
+
require 'fastlane/server/json_return_value_processor.rb'
|
3
4
|
require 'socket'
|
4
5
|
require 'json'
|
5
6
|
|
6
7
|
module Fastlane
|
7
8
|
class SocketServer
|
9
|
+
COMMAND_EXECUTION_STATE = {
|
10
|
+
ready: :ready,
|
11
|
+
already_shutdown: :already_shutdown,
|
12
|
+
error: :error
|
13
|
+
}
|
14
|
+
|
8
15
|
attr_accessor :command_executor
|
9
16
|
attr_accessor :return_value_processor
|
10
17
|
|
@@ -24,53 +31,112 @@ module Fastlane
|
|
24
31
|
@stay_alive = stay_alive
|
25
32
|
end
|
26
33
|
|
27
|
-
#
|
34
|
+
# this is the public API, don't call anything else
|
28
35
|
def start
|
29
|
-
|
30
|
-
|
36
|
+
listen
|
37
|
+
|
38
|
+
while @stay_alive
|
39
|
+
UI.important("stay_alive is set to true, restarting server")
|
40
|
+
listen
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
34
44
|
private
|
35
45
|
|
36
46
|
def receive_and_process_commands
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
loop do # No idea how many commands are coming, so we loop until an error or the done command is sent
|
41
|
-
str = nil
|
47
|
+
loop do # no idea how many commands are coming, so we loop until an error or the done command is sent
|
48
|
+
execution_state = COMMAND_EXECUTION_STATE[:ready]
|
42
49
|
|
50
|
+
command_string = nil
|
43
51
|
begin
|
44
|
-
|
52
|
+
command_string = @client.recv(1_048_576) # 1024 * 1024
|
45
53
|
rescue Errno::ECONNRESET => e
|
46
54
|
UI.verbose(e)
|
47
|
-
|
55
|
+
execution_state = COMMAND_EXECUTION_STATE[:error]
|
48
56
|
end
|
49
57
|
|
50
|
-
if
|
51
|
-
|
52
|
-
|
53
|
-
ended_loop_due_to_error = false
|
54
|
-
break
|
58
|
+
if execution_state == COMMAND_EXECUTION_STATE[:ready]
|
59
|
+
# Ok, all is good, let's see what command we have
|
60
|
+
execution_state = parse_and_execute_command(command_string: command_string)
|
55
61
|
end
|
56
|
-
response_json = process_command(command_json: str)
|
57
62
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
63
|
+
case execution_state
|
64
|
+
when COMMAND_EXECUTION_STATE[:ready]
|
65
|
+
# command executed successfully, let's setup for the next command
|
66
|
+
next
|
67
|
+
when COMMAND_EXECUTION_STATE[:already_shutdown]
|
68
|
+
# we shutdown in response to a command, nothing left to do but exit
|
69
|
+
break
|
70
|
+
when COMMAND_EXECUTION_STATE[:error]
|
71
|
+
# we got an error somewhere, let's shutdown and exit
|
72
|
+
handle_disconnect(error: true, exit_reason: :error)
|
64
73
|
break
|
65
74
|
end
|
66
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse_and_execute_command(command_string: nil)
|
79
|
+
command = CommandParser.parse(json: command_string)
|
80
|
+
case command
|
81
|
+
when ControlCommand
|
82
|
+
return handle_control_command(command)
|
83
|
+
when ActionCommand
|
84
|
+
return handle_action_command(command)
|
85
|
+
end
|
67
86
|
|
68
|
-
|
87
|
+
# catch all
|
88
|
+
raise "Command #{command} not supported"
|
89
|
+
end
|
90
|
+
|
91
|
+
# we got a server control command from the client to do something like shutdown
|
92
|
+
def handle_control_command(command)
|
93
|
+
exit_reason = nil
|
94
|
+
if command.cancel_signal?
|
95
|
+
UI.verbose("received cancel signal shutting down, reason: #{command.reason}")
|
96
|
+
|
97
|
+
# send an ack to the client to let it know we're shutting down
|
98
|
+
cancel_response = '{"payload":{"status":"cancelled"}}'
|
99
|
+
send_response(cancel_response)
|
100
|
+
|
101
|
+
exit_reason = :cancelled
|
102
|
+
elsif command.done_signal?
|
103
|
+
UI.verbose("received done signal shutting down")
|
104
|
+
|
105
|
+
# client is already in the process of shutting down, no need to ack
|
106
|
+
exit_reason = :done
|
107
|
+
end
|
108
|
+
|
109
|
+
# if the command came in with a user-facing message, display it
|
110
|
+
if command.user_message
|
111
|
+
UI.important(command.user_message)
|
112
|
+
end
|
113
|
+
|
114
|
+
# currently all control commands should trigger a disconnect and shutdown
|
115
|
+
handle_disconnect(error: false, exit_reason: exit_reason)
|
116
|
+
return COMMAND_EXECUTION_STATE[:already_shutdown]
|
117
|
+
end
|
118
|
+
|
119
|
+
# execute and send back response to client
|
120
|
+
def handle_action_command(command)
|
121
|
+
response_json = process_action_command(command: command)
|
122
|
+
return send_response(response_json)
|
123
|
+
end
|
124
|
+
|
125
|
+
# send json back to client
|
126
|
+
def send_response(json)
|
127
|
+
UI.verbose("sending #{json}")
|
128
|
+
begin
|
129
|
+
@client.puts(json) # Send some json to the client
|
130
|
+
rescue Errno::EPIPE => e
|
131
|
+
UI.verbose(e)
|
132
|
+
return COMMAND_EXECUTION_STATE[:error]
|
133
|
+
end
|
134
|
+
return COMMAND_EXECUTION_STATE[:ready]
|
69
135
|
end
|
70
136
|
|
71
137
|
def listen
|
72
138
|
@server = TCPServer.open('localhost', 2000) # Socket to listen on port 2000
|
73
|
-
UI.
|
139
|
+
UI.verbose("Waiting for #{@connection_timeout} seconds for a connection from FastlaneRunner")
|
74
140
|
|
75
141
|
# set thread local to ready so we can check it
|
76
142
|
Thread.current[:ready] = true
|
@@ -84,34 +150,32 @@ module Fastlane
|
|
84
150
|
rescue StandardError => e
|
85
151
|
UI.user_error!("Something went wrong while waiting for a connection from the FastlaneRunner binary, shutting down\n#{e}")
|
86
152
|
end
|
87
|
-
UI.
|
153
|
+
UI.verbose("Client connected")
|
88
154
|
|
155
|
+
# this loops forever
|
89
156
|
receive_and_process_commands
|
90
157
|
end
|
91
158
|
|
92
|
-
def handle_disconnect(error: false)
|
93
|
-
|
94
|
-
if @stay_alive
|
95
|
-
UI.important("stay_alive is set to true, restarting server")
|
96
|
-
# clean up before restart
|
97
|
-
@client.close
|
98
|
-
@client = nil
|
159
|
+
def handle_disconnect(error: false, exit_reason: :error)
|
160
|
+
Thread.current[:exit_reason] = exit_reason
|
99
161
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
162
|
+
UI.important("Client disconnected, a pipe broke, or received malformed data") if exit_reason == :error
|
163
|
+
# clean up
|
164
|
+
@client.close
|
165
|
+
@client = nil
|
166
|
+
|
167
|
+
@server.close
|
168
|
+
@server = nil
|
105
169
|
end
|
106
170
|
|
107
|
-
|
108
|
-
|
109
|
-
UI.verbose("
|
110
|
-
return
|
171
|
+
# record fastlane action command and then execute it
|
172
|
+
def process_action_command(command: nil)
|
173
|
+
UI.verbose("received command:#{command.inspect}")
|
174
|
+
return execute_action_command(command: command)
|
111
175
|
end
|
112
176
|
|
113
|
-
|
114
|
-
|
177
|
+
# execute fastlane action command
|
178
|
+
def execute_action_command(command: nil)
|
115
179
|
command_return = @command_executor.execute(command: command, target_object: nil)
|
116
180
|
## probably need to just return Strings, or ready_for_next with object isn't String
|
117
181
|
return_object = command_return.return_value
|
@@ -133,8 +197,11 @@ module Fastlane
|
|
133
197
|
closure_arg = ', "closure_argument_value": ' + closure_arg
|
134
198
|
end
|
135
199
|
|
200
|
+
Thread.current[:exception] = nil
|
136
201
|
return '{"payload":{"status":"ready_for_next", "return_object":' + return_object + closure_arg + '}}'
|
137
202
|
rescue StandardError => e
|
203
|
+
Thread.current[:exception] = e
|
204
|
+
|
138
205
|
exception_array = []
|
139
206
|
exception_array << "#{e.class}:"
|
140
207
|
exception_array << e.backtrace
|
@@ -146,72 +213,4 @@ module Fastlane
|
|
146
213
|
return "{\"payload\":{\"status\":\"failure\",\"failure_information\":#{exception_array.flatten}}}"
|
147
214
|
end
|
148
215
|
end
|
149
|
-
|
150
|
-
class JSONReturnValueProcessor
|
151
|
-
def prepare_object(return_value: nil, return_value_type: nil)
|
152
|
-
case return_value_type
|
153
|
-
when nil
|
154
|
-
UI.verbose("return_value_type is nil value: #{return_value}")
|
155
|
-
return process_value_as_string(return_value: return_value)
|
156
|
-
when :string
|
157
|
-
return process_value_as_string(return_value: return_value)
|
158
|
-
when :int
|
159
|
-
return process_value_as_int(return_value: return_value)
|
160
|
-
when :bool
|
161
|
-
return process_value_as_bool(return_value: return_value)
|
162
|
-
when :array_of_strings
|
163
|
-
return process_value_as_array_of_strings(return_value: return_value)
|
164
|
-
when :hash_of_strings
|
165
|
-
return process_value_as_hash_of_strings(return_value: return_value)
|
166
|
-
else
|
167
|
-
UI.verbose("Unknown return type defined: #{return_value_type} for value: #{return_value}")
|
168
|
-
return process_value_as_string(return_value: return_value)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def process_value_as_string(return_value: nil)
|
173
|
-
if return_value.nil?
|
174
|
-
return_value = ""
|
175
|
-
end
|
176
|
-
|
177
|
-
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
178
|
-
return JSON.generate(return_value.to_s, quirks_mode: true)
|
179
|
-
end
|
180
|
-
|
181
|
-
def process_value_as_array_of_strings(return_value: nil)
|
182
|
-
if return_value.nil?
|
183
|
-
return_value = []
|
184
|
-
end
|
185
|
-
|
186
|
-
# quirks_mode shouldn't be required for real objects
|
187
|
-
return JSON.generate(return_value)
|
188
|
-
end
|
189
|
-
|
190
|
-
def process_value_as_hash_of_strings(return_value: nil)
|
191
|
-
if return_value.nil?
|
192
|
-
return_value = {}
|
193
|
-
end
|
194
|
-
|
195
|
-
# quirks_mode shouldn't be required for real objects
|
196
|
-
return JSON.generate(return_value)
|
197
|
-
end
|
198
|
-
|
199
|
-
def process_value_as_bool(return_value: nil)
|
200
|
-
if return_value.nil?
|
201
|
-
return_value = false
|
202
|
-
end
|
203
|
-
|
204
|
-
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
205
|
-
return JSON.generate(return_value.to_s, quirks_mode: true)
|
206
|
-
end
|
207
|
-
|
208
|
-
def process_value_as_int(return_value: nil)
|
209
|
-
if return_value.nil?
|
210
|
-
return_value = 0
|
211
|
-
end
|
212
|
-
|
213
|
-
# quirks_mode because sometimes the built-in library is used for some folks and that needs quirks_mode: true
|
214
|
-
return JSON.generate(return_value.to_s, quirks_mode: true)
|
215
|
-
end
|
216
|
-
end
|
217
216
|
end
|