fastlane 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/fastlane +10 -3
- data/lib/assets/FastfileTemplate +52 -46
- data/lib/fastlane.rb +1 -0
- data/lib/fastlane/action.rb +14 -0
- data/lib/fastlane/actions/actions_helper.rb +1 -0
- data/lib/fastlane/actions/add_git_tag.rb +4 -0
- data/lib/fastlane/actions/cert.rb +4 -0
- data/lib/fastlane/actions/clean_build_artifacts.rb +4 -0
- data/lib/fastlane/actions/commit_version_bump.rb +4 -0
- data/lib/fastlane/actions/crashlytics.rb +5 -0
- data/lib/fastlane/actions/default_platform.rb +31 -0
- data/lib/fastlane/actions/deliver.rb +4 -0
- data/lib/fastlane/actions/deploygate.rb +4 -0
- data/lib/fastlane/actions/ensure_git_status_clean.rb +4 -0
- data/lib/fastlane/actions/fastlane_version.rb +4 -0
- data/lib/fastlane/actions/frameit.rb +4 -0
- data/lib/fastlane/actions/gcovr.rb +4 -0
- data/lib/fastlane/actions/hipchat.rb +4 -0
- data/lib/fastlane/actions/hockey.rb +4 -0
- data/lib/fastlane/actions/increment_build_number.rb +4 -0
- data/lib/fastlane/actions/increment_version_number.rb +4 -0
- data/lib/fastlane/actions/install_carthage.rb +4 -0
- data/lib/fastlane/actions/install_cocapods.rb +4 -0
- data/lib/fastlane/actions/ipa.rb +10 -0
- data/lib/fastlane/actions/notify.rb +4 -0
- data/lib/fastlane/actions/opt_out_usage.rb +4 -0
- data/lib/fastlane/actions/pem.rb +4 -2
- data/lib/fastlane/actions/produce.rb +4 -0
- data/lib/fastlane/actions/push_to_git_remote.rb +4 -0
- data/lib/fastlane/actions/register_devices.rb +4 -0
- data/lib/fastlane/actions/reset_git_repo.rb +4 -0
- data/lib/fastlane/actions/resign.rb +4 -0
- data/lib/fastlane/actions/s3.rb +4 -0
- data/lib/fastlane/actions/say.rb +4 -0
- data/lib/fastlane/actions/sigh.rb +4 -0
- data/lib/fastlane/actions/slack.rb +79 -66
- data/lib/fastlane/actions/snapshot.rb +4 -0
- data/lib/fastlane/actions/team_id.rb +4 -0
- data/lib/fastlane/actions/team_name.rb +4 -0
- data/lib/fastlane/actions/testmunk.rb +4 -0
- data/lib/fastlane/actions/typetalk.rb +4 -0
- data/lib/fastlane/actions/update_project_code_signing.rb +4 -0
- data/lib/fastlane/actions/xcode_select.rb +4 -0
- data/lib/fastlane/actions/xcodebuild.rb +24 -0
- data/lib/fastlane/actions/xctool.rb +4 -0
- data/lib/fastlane/docs_generator.rb +37 -17
- data/lib/fastlane/fast_file.rb +100 -42
- data/lib/fastlane/lane_manager.rb +80 -40
- data/lib/fastlane/runner.rb +71 -27
- data/lib/fastlane/supported_platforms.rb +18 -0
- data/lib/fastlane/version.rb +1 -1
- metadata +6 -4
@@ -1,30 +1,50 @@
|
|
1
1
|
module Fastlane
|
2
2
|
class DocsGenerator
|
3
3
|
def self.run(output_path, ff)
|
4
|
-
output = "fastlane documentation
|
5
|
-
output
|
4
|
+
output = ["fastlane documentation"]
|
5
|
+
output << "================"
|
6
6
|
|
7
|
-
output
|
8
|
-
output
|
9
|
-
output
|
10
|
-
output
|
7
|
+
output << "# Installation"
|
8
|
+
output << "```"
|
9
|
+
output << "sudo gem install fastlane"
|
10
|
+
output << "```"
|
11
11
|
|
12
|
-
output
|
12
|
+
output << "# Available Actions"
|
13
13
|
|
14
|
-
ff.runner.description_blocks.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
output
|
19
|
-
|
14
|
+
all_keys = ff.runner.description_blocks.keys.reject(&:nil?)
|
15
|
+
all_keys.unshift(nil) # because we want root elements on top.. always! They have key nil
|
16
|
+
|
17
|
+
all_keys.each do |platform|
|
18
|
+
output << "## #{platform}" if platform
|
19
|
+
|
20
|
+
value = ff.runner.description_blocks[platform]
|
21
|
+
|
22
|
+
value.each do |lane, description|
|
23
|
+
output << render(platform, lane, description)
|
24
|
+
end
|
25
|
+
|
26
|
+
output << "----"
|
20
27
|
end
|
21
28
|
|
22
|
-
output
|
23
|
-
output
|
24
|
-
output += "The documentation of fastlane can be found on [GitHub](https://github.com/KrauseFx/fastlane)"
|
29
|
+
output << "More information about fastlane can be found on [https://fastlane.tools](https://fastlane.tools)."
|
30
|
+
output << "The documentation of fastlane can be found on [GitHub](https://github.com/KrauseFx/fastlane)"
|
25
31
|
|
26
|
-
File.write(output_path, output)
|
32
|
+
File.write(output_path, output.join("\n"))
|
27
33
|
Helper.log.info "Successfully generated documentation to path '#{File.expand_path(output_path)}'".green
|
28
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def self.render(platform, lane, description)
|
39
|
+
full_name = [platform, lane].reject(&:nil?).join(' ')
|
40
|
+
|
41
|
+
output = []
|
42
|
+
output << "### #{full_name}"
|
43
|
+
output << "```"
|
44
|
+
output << "fastlane #{full_name}"
|
45
|
+
output << "```"
|
46
|
+
output << description
|
47
|
+
output
|
48
|
+
end
|
29
49
|
end
|
30
50
|
end
|
data/lib/fastlane/fast_file.rb
CHANGED
@@ -12,14 +12,6 @@ module Fastlane
|
|
12
12
|
parse(content)
|
13
13
|
end
|
14
14
|
|
15
|
-
def collector
|
16
|
-
@collector ||= ActionCollector.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def desc_collection
|
20
|
-
@desc_collection ||= []
|
21
|
-
end
|
22
|
-
|
23
15
|
def parse(data)
|
24
16
|
@runner = Runner.new
|
25
17
|
|
@@ -30,55 +22,51 @@ module Fastlane
|
|
30
22
|
self
|
31
23
|
end
|
32
24
|
|
33
|
-
def lane(key, &block)
|
34
|
-
desc = desc_collection.join("\n\n")
|
35
|
-
@runner.set_block(key, block, desc)
|
36
|
-
@desc_collection = nil # reset again
|
37
|
-
end
|
38
25
|
|
39
|
-
|
40
|
-
|
41
|
-
|
26
|
+
#####################################################
|
27
|
+
# @!group DSL
|
28
|
+
#####################################################
|
42
29
|
|
43
|
-
def after_all(&block)
|
44
|
-
@runner.set_after_all(block)
|
45
|
-
end
|
46
30
|
|
47
|
-
|
48
|
-
|
49
|
-
|
31
|
+
# User defines a new lane
|
32
|
+
def lane(lane_name, &block)
|
33
|
+
raise "You have to pass a block using 'do' for lane '#{lane_name}'. Make sure you read the docs on GitHub.".red unless block
|
34
|
+
|
35
|
+
desc = desc_collection.join("\n\n")
|
36
|
+
platform = @current_platform
|
50
37
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
value ||= yield
|
55
|
-
Actions.execute_action('say') do
|
56
|
-
Fastlane::Actions::SayAction.run([value])
|
57
|
-
end
|
38
|
+
@runner.set_block(lane_name, platform, block, desc)
|
39
|
+
|
40
|
+
@desc_collection = nil # reset the collected description again for the next lane
|
58
41
|
end
|
42
|
+
|
43
|
+
# User defines a platform block
|
44
|
+
def platform(platform_name, &block)
|
45
|
+
SupportedPlatforms.verify!platform_name
|
59
46
|
|
60
|
-
|
61
|
-
raise "Path '#{path}' not found!".red unless File.directory?(path)
|
47
|
+
@current_platform = platform_name
|
62
48
|
|
63
|
-
|
49
|
+
block.call
|
50
|
+
|
51
|
+
@current_platform = nil
|
64
52
|
end
|
65
53
|
|
66
|
-
#
|
67
|
-
def
|
68
|
-
|
69
|
-
Actions.sh_no_action(command)
|
70
|
-
end
|
54
|
+
# Is executed before each test run
|
55
|
+
def before_all(&block)
|
56
|
+
@runner.set_before_all(@current_platform, block)
|
71
57
|
end
|
72
58
|
|
73
|
-
#
|
74
|
-
def
|
75
|
-
|
59
|
+
# Is executed after each test run
|
60
|
+
def after_all(&block)
|
61
|
+
@runner.set_after_all(@current_platform, block)
|
76
62
|
end
|
77
63
|
|
78
|
-
|
79
|
-
|
64
|
+
# Is executed if an error occured during fastlane execution
|
65
|
+
def error(&block)
|
66
|
+
@runner.set_error(@current_platform, block)
|
80
67
|
end
|
81
68
|
|
69
|
+
# Is used to look if the method is implemented as an action
|
82
70
|
def method_missing(method_sym, *arguments, &_block)
|
83
71
|
# First, check if there is a predefined method in the actions folder
|
84
72
|
|
@@ -96,6 +84,9 @@ module Fastlane
|
|
96
84
|
|
97
85
|
step_name = class_ref.step_text rescue nil
|
98
86
|
step_name = method_sym.to_s unless step_name
|
87
|
+
|
88
|
+
verify_supported_os(method_sym, class_ref)
|
89
|
+
|
99
90
|
Helper.log_alert("Step: " + step_name)
|
100
91
|
|
101
92
|
begin
|
@@ -112,5 +103,72 @@ module Fastlane
|
|
112
103
|
raise "Action '#{method_sym}' of class '#{class_name}' was found, but has no `run` method.".red
|
113
104
|
end
|
114
105
|
end
|
106
|
+
|
107
|
+
|
108
|
+
#####################################################
|
109
|
+
# @!group Other things
|
110
|
+
#####################################################
|
111
|
+
|
112
|
+
# Speak out loud
|
113
|
+
def say(value)
|
114
|
+
# Overwrite this, since there is already a 'say' method defined in the Ruby standard library
|
115
|
+
value ||= yield
|
116
|
+
Actions.execute_action('say') do
|
117
|
+
Fastlane::Actions::SayAction.run([value])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Is the given key a platform block or a lane?
|
122
|
+
def is_platform_block?(key)
|
123
|
+
raise 'No key given'.red unless key
|
124
|
+
|
125
|
+
return false if self.runner.blocks[nil][key.to_sym]
|
126
|
+
return true if self.runner.blocks[key.to_sym].kind_of?Hash
|
127
|
+
|
128
|
+
raise "Could not find '#{key}'. Available lanes: #{self.runner.available_lanes.join(', ')}".red
|
129
|
+
end
|
130
|
+
|
131
|
+
def actions_path(path)
|
132
|
+
raise "Path '#{path}' not found!".red unless File.directory?(path)
|
133
|
+
|
134
|
+
Actions.load_external_actions(path)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Execute shell command
|
138
|
+
def sh(command)
|
139
|
+
Actions.execute_action(command) do
|
140
|
+
Actions.sh_no_action(command)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def verify_supported_os(name, class_ref)
|
145
|
+
if class_ref.respond_to?(:is_supported?)
|
146
|
+
if Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
|
147
|
+
# This value is filled in based on the executed platform block. Might be nil when lane is in root of Fastfile
|
148
|
+
platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
|
149
|
+
|
150
|
+
unless class_ref.is_supported?(platform)
|
151
|
+
raise "Action '#{name}' doesn't support required operating system '#{platform}'.".red
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# Fastfile was finished executing
|
158
|
+
def did_finish
|
159
|
+
collector.did_finish
|
160
|
+
end
|
161
|
+
|
162
|
+
def desc(string)
|
163
|
+
desc_collection << string
|
164
|
+
end
|
165
|
+
|
166
|
+
def collector
|
167
|
+
@collector ||= ActionCollector.new
|
168
|
+
end
|
169
|
+
|
170
|
+
def desc_collection
|
171
|
+
@desc_collection ||= []
|
172
|
+
end
|
115
173
|
end
|
116
174
|
end
|
@@ -1,66 +1,59 @@
|
|
1
1
|
module Fastlane
|
2
2
|
class LaneManager
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
# @param platform The name of the platform to execute
|
4
|
+
# @param lane_name The name of the lane to execute
|
5
|
+
def self.cruise_lane(platform, lane, env = nil)
|
6
|
+
raise 'lane must be a string' unless (lane.is_a?(String) or lane.nil?)
|
7
|
+
raise 'platform must be a string' unless (platform.is_a?(String) or platform.nil?)
|
6
8
|
|
7
9
|
ff = Fastlane::FastFile.new(File.join(Fastlane::FastlaneFolder.path, 'Fastfile'))
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
available.each_with_index do |lane, index|
|
15
|
-
puts "#{index + 1}) #{lane}"
|
16
|
-
end
|
17
|
-
|
18
|
-
i = gets.strip.to_i - 1
|
19
|
-
if i >= 0 and (available[i] rescue nil)
|
20
|
-
lanes = [available[i]]
|
21
|
-
Helper.log.info "Driving the lane #{lanes.first}. Next time launch fastlane using `fastlane #{lanes.first}`".green
|
22
|
-
break # yeah
|
23
|
-
end
|
11
|
+
unless (ff.is_platform_block?lane rescue false) # rescue, because this raises an exception if it can't be found at all
|
12
|
+
# maybe the user specified a default platform
|
13
|
+
# We'll only do this, if the lane specified isn't a platform, as we want to list all platforms then
|
14
|
+
platform ||= Actions.lane_context[Actions::SharedValues::DEFAULT_PLATFORM]
|
15
|
+
end
|
24
16
|
|
25
|
-
|
17
|
+
if not platform and lane
|
18
|
+
# Either, the user runs a specific lane in root or want to auto complete the available lanes for a platform
|
19
|
+
# e.g. `fastlane ios` should list all available iOS actions
|
20
|
+
if ff.is_platform_block?lane
|
21
|
+
platform = lane
|
22
|
+
lane = nil
|
26
23
|
end
|
27
24
|
end
|
28
25
|
|
29
|
-
|
30
|
-
env_file = File.join(Fastlane::FastlaneFolder.path || "", '.env')
|
31
|
-
env_default_file = File.join(Fastlane::FastlaneFolder.path || "", '.env.default')
|
32
|
-
Dotenv.load(env_file, env_default_file)
|
26
|
+
platform, lane = choose_lane(ff, platform) unless lane
|
33
27
|
|
34
|
-
|
35
|
-
if env
|
36
|
-
env_file = File.join(Fastlane::FastlaneFolder.path || "", ".env.#{env}")
|
37
|
-
Helper.log.info "Loading from '#{env_file}'".green
|
38
|
-
Dotenv.overload(env_file)
|
39
|
-
end
|
28
|
+
load_dot_env(env)
|
40
29
|
|
41
|
-
|
30
|
+
started = Time.now
|
42
31
|
e = nil
|
43
32
|
begin
|
44
|
-
|
45
|
-
ff.runner.execute(key)
|
46
|
-
end
|
33
|
+
ff.runner.execute(lane, platform)
|
47
34
|
rescue => ex
|
48
|
-
|
49
|
-
|
50
|
-
Helper.log.info Actions.lane_context
|
51
|
-
end
|
35
|
+
Helper.log.info 'Variable Dump:'.yellow
|
36
|
+
Helper.log.info Actions.lane_context
|
52
37
|
Helper.log.fatal ex
|
53
38
|
e = ex
|
54
39
|
end
|
55
40
|
|
41
|
+
duration = ((Time.now - started) / 60.0).round
|
42
|
+
|
43
|
+
finish_fastlane(ff, duration, e)
|
44
|
+
|
45
|
+
return ff
|
46
|
+
end
|
47
|
+
|
48
|
+
# All the finishing up that needs to be done
|
49
|
+
def self.finish_fastlane(ff, duration, error)
|
56
50
|
thread = ff.did_finish
|
57
51
|
|
58
52
|
# Finished with all the lanes
|
59
53
|
Fastlane::JUnitGenerator.generate(Fastlane::Actions.executed_actions)
|
60
54
|
|
61
|
-
duration = ((Time.now - start) / 60.0).round
|
62
55
|
|
63
|
-
unless
|
56
|
+
unless error
|
64
57
|
thread.join # to wait for the request to be finished
|
65
58
|
if duration > 5
|
66
59
|
Helper.log.info "fastlane.tools just saved you #{duration} minutes! 🎉".green
|
@@ -70,9 +63,56 @@ module Fastlane
|
|
70
63
|
else
|
71
64
|
thread.join # to wait for the request to be finished
|
72
65
|
Helper.log.fatal 'fastlane finished with errors'.red
|
73
|
-
raise
|
66
|
+
raise error
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Lane chooser if user didn't provide a lane
|
71
|
+
# @param platform: is probably nil, but user might have called `fastlane android`, and only wants to list those actions
|
72
|
+
def self.choose_lane(ff, platform)
|
73
|
+
loop do
|
74
|
+
Helper.log.error "You must provide a lane to drive. Available lanes:"
|
75
|
+
available = ff.runner.available_lanes(platform)
|
76
|
+
|
77
|
+
available.each_with_index do |lane, index|
|
78
|
+
puts "#{index + 1}) #{lane}"
|
79
|
+
end
|
80
|
+
|
81
|
+
i = $stdin.gets.strip.to_i - 1
|
82
|
+
if i >= 0 and (available[i] rescue nil)
|
83
|
+
selection = available[i]
|
84
|
+
Helper.log.info "Driving the lane #{selection}. Next time launch fastlane using `fastlane #{selection}`".green
|
85
|
+
platform = selection.split(' ')[0]
|
86
|
+
lane_name = selection.split(' ')[1]
|
87
|
+
|
88
|
+
unless lane_name # no specific platform, just a root lane
|
89
|
+
lane_name = platform
|
90
|
+
platform = nil
|
91
|
+
end
|
92
|
+
|
93
|
+
return platform, lane_name # yeah
|
94
|
+
end
|
95
|
+
|
96
|
+
Helper.log.error "Invalid input. Please enter the number of the lane you want to use".red
|
74
97
|
end
|
75
98
|
end
|
76
99
|
|
100
|
+
def self.load_dot_env(env)
|
101
|
+
require 'dotenv'
|
102
|
+
|
103
|
+
Actions.lane_context[Actions::SharedValues::ENVIRONMENT] = env
|
104
|
+
|
105
|
+
# Making sure the default '.env' and '.env.default' get loaded
|
106
|
+
env_file = File.join(Fastlane::FastlaneFolder.path || "", '.env')
|
107
|
+
env_default_file = File.join(Fastlane::FastlaneFolder.path || "", '.env.default')
|
108
|
+
Dotenv.load(env_file, env_default_file)
|
109
|
+
|
110
|
+
# Loads .env file for the environment passed in through options
|
111
|
+
if env
|
112
|
+
env_file = File.join(Fastlane::FastlaneFolder.path || "", ".env.#{env}")
|
113
|
+
Helper.log.info "Loading from '#{env_file}'".green
|
114
|
+
Dotenv.overload(env_file)
|
115
|
+
end
|
116
|
+
end
|
77
117
|
end
|
78
118
|
end
|
data/lib/fastlane/runner.rb
CHANGED
@@ -1,27 +1,43 @@
|
|
1
1
|
module Fastlane
|
2
2
|
class Runner
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
# This will take care of executing **one** lane.
|
5
|
+
# @param lane_name The name of the lane to execute
|
6
|
+
# @param platform The name of the platform to execute
|
7
|
+
def execute(lane, platform = nil)
|
8
|
+
raise "No lane given" unless lane
|
9
|
+
|
10
|
+
lane = lane.to_sym
|
11
|
+
|
12
|
+
platform = platform.to_sym if platform # might be nil, which is okay => root element
|
13
|
+
|
14
|
+
Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] = platform # set this in any case: important
|
15
|
+
|
16
|
+
full_lane_name = [platform, lane].reject(&:nil?).join(' ')
|
17
|
+
Helper.log.info "Driving the lane '#{full_lane_name}'".green
|
18
|
+
Actions.lane_context[Actions::SharedValues::LANE_NAME] = full_lane_name
|
19
|
+
ENV["FASTLANE_LANE_NAME"] = full_lane_name
|
9
20
|
|
10
21
|
return_val = nil
|
11
22
|
|
12
23
|
path_to_use = Fastlane::FastlaneFolder.path || Dir.pwd
|
13
24
|
Dir.chdir(path_to_use) do # the file is located in the fastlane folder
|
14
|
-
@before_all.call(key) if @before_all
|
15
|
-
|
16
|
-
return_val = nil
|
17
25
|
|
18
|
-
|
19
|
-
|
20
|
-
else
|
21
|
-
raise "Could not find lane for type '#{key}'. Available lanes: #{available_lanes.join(', ')}".red
|
26
|
+
unless (blocks[platform][lane] rescue nil)
|
27
|
+
raise "Could not find lane '#{full_lane_name}'. Available lanes: #{available_lanes.join(', ')}".red
|
22
28
|
end
|
23
29
|
|
24
|
-
|
30
|
+
# Call the platform specific before_all block and then the general one
|
31
|
+
before_all_blocks[platform].call(lane) if (before_all_blocks[platform] and platform != nil)
|
32
|
+
before_all_blocks[nil].call(lane) if before_all_blocks[nil]
|
33
|
+
|
34
|
+
return_val = blocks[platform][lane].call
|
35
|
+
|
36
|
+
|
37
|
+
# `after_all` is only called if no exception was raised before
|
38
|
+
# Call the platform specific before_all block and then the general one
|
39
|
+
after_all_blocks[platform].call(lane) if (after_all_blocks[platform] and platform != nil)
|
40
|
+
after_all_blocks[nil].call(lane) if (after_all_blocks[nil])
|
25
41
|
end
|
26
42
|
|
27
43
|
return return_val
|
@@ -29,41 +45,69 @@ module Fastlane
|
|
29
45
|
Dir.chdir(path_to_use) do
|
30
46
|
# Provide error block exception without colour code
|
31
47
|
error_ex = ex.exception(ex.message.gsub(/\033\[\d+m/, ''))
|
32
|
-
|
48
|
+
|
49
|
+
error_blocks[platform].call(lane, error_ex) if (error_blocks[platform] and platform != nil)
|
50
|
+
error_blocks[nil].call(lane, error_ex) if error_blocks[nil]
|
33
51
|
end
|
34
52
|
raise ex
|
35
53
|
end
|
36
54
|
|
37
|
-
|
38
|
-
|
55
|
+
# @param filter_platform: Filter, to only show the lanes of a given platform
|
56
|
+
def available_lanes(filter_platform = nil)
|
57
|
+
all = []
|
58
|
+
blocks.each do |platform, lane|
|
59
|
+
next if (filter_platform and filter_platform.to_s != platform.to_s) # skip actions that don't match
|
60
|
+
|
61
|
+
lane.each do |lane_name, block|
|
62
|
+
all << [platform, lane_name].reject(&:nil?).join(' ')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
all
|
39
66
|
end
|
40
67
|
|
41
68
|
# Called internally
|
42
|
-
def set_before_all(block)
|
43
|
-
|
69
|
+
def set_before_all(platform, block)
|
70
|
+
before_all_blocks[platform] = block
|
44
71
|
end
|
45
72
|
|
46
|
-
def set_after_all(block)
|
47
|
-
|
73
|
+
def set_after_all(platform, block)
|
74
|
+
after_all_blocks[platform] = block
|
48
75
|
end
|
49
76
|
|
50
|
-
def set_error(block)
|
51
|
-
|
77
|
+
def set_error(platform, block)
|
78
|
+
error_blocks[platform] = block
|
52
79
|
end
|
53
80
|
|
54
|
-
# @param
|
81
|
+
# @param lane: The name of the lane
|
82
|
+
# @param platform: The platform for the given block - might be nil - nil is actually the root of Fastfile with no specific platform
|
55
83
|
# @param block: The block of the lane
|
56
84
|
# @param desc: Description of this action
|
57
|
-
def set_block(
|
58
|
-
|
59
|
-
|
60
|
-
|
85
|
+
def set_block(lane, platform, block, desc = nil)
|
86
|
+
blocks[platform] ||= {}
|
87
|
+
description_blocks[platform] ||= {}
|
88
|
+
|
89
|
+
raise "Lane '#{lane}' was defined multiple times!".red if blocks[platform][lane]
|
90
|
+
|
91
|
+
blocks[platform][lane] = block
|
92
|
+
description_blocks[platform][lane] = desc
|
61
93
|
end
|
62
94
|
|
63
95
|
def blocks
|
64
96
|
@blocks ||= {}
|
65
97
|
end
|
66
98
|
|
99
|
+
def before_all_blocks
|
100
|
+
@before_all ||= {}
|
101
|
+
end
|
102
|
+
|
103
|
+
def after_all_blocks
|
104
|
+
@after_all ||= {}
|
105
|
+
end
|
106
|
+
|
107
|
+
def error_blocks
|
108
|
+
@error_blocks ||= {}
|
109
|
+
end
|
110
|
+
|
67
111
|
def description_blocks
|
68
112
|
@description_blocks ||= {}
|
69
113
|
end
|