fastlane 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/fastlane/actions/gym.rb +12 -6
- data/lib/fastlane/actions/register_devices.rb +10 -30
- data/lib/fastlane/actions/team_id.rb +1 -1
- data/lib/fastlane/actions/xcode_server_get_assets.rb +299 -0
- data/lib/fastlane/lane.rb +10 -0
- data/lib/fastlane/version.rb +1 -1
- metadata +25 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9959b0da34326315d18cd09fb1b797e1a520ef81
|
4
|
+
data.tar.gz: 7a3b437b3e752e3bbac7f4c8fad4b487e2e94ae7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fb6fa250d1ec52e73976fc37a7cfa3106cf29c52b393a1dccf8fe2500b1d5d7cc46efb1de935928a36ead0962dbfeab99fd0972ca13c0b08da988deefca6d0a
|
7
|
+
data.tar.gz: c2ee2872282500c11e4a32da4998d333a2626fb0b8219a6b215f6af0dfc34beec200786630c69d917ba9ec73ef172555308b8b58ec6a8262e300bf62488297ac
|
data/lib/fastlane/actions/gym.rb
CHANGED
@@ -12,14 +12,20 @@ module Fastlane
|
|
12
12
|
begin
|
13
13
|
FastlaneCore::UpdateChecker.start_looking_for_update('gym') unless Helper.is_test?
|
14
14
|
|
15
|
-
values[:provisioning_profile_path]
|
16
|
-
|
17
|
-
|
15
|
+
if values[:provisioning_profile_path].to_s.length == 0
|
16
|
+
sigh_path = Actions.lane_context[Actions::SharedValues::SIGH_PROFILE_PATH] || ENV["SIGH_PROFILE_PATH"]
|
17
|
+
values[:provisioning_profile_path] = File.expand_path(sigh_path) if sigh_path
|
18
|
+
end
|
19
|
+
|
20
|
+
absolute_ipa_path = File.expand_path(Gym::Manager.new.work(values))
|
21
|
+
absolute_dsym_path = absolute_ipa_path.gsub(".ipa", ".app.dSYM.zip")
|
18
22
|
|
19
|
-
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] =
|
20
|
-
Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] =
|
23
|
+
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] = absolute_ipa_path
|
24
|
+
Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] = absolute_dsym_path if File.exist?(absolute_dsym_path)
|
25
|
+
ENV[SharedValues::IPA_OUTPUT_PATH.to_s] = absolute_ipa_path # for deliver
|
26
|
+
ENV[SharedValues::DSYM_OUTPUT_PATH.to_s] = absolute_dsym_path if File.exist?(absolute_dsym_path)
|
21
27
|
|
22
|
-
return
|
28
|
+
return absolute_ipa_path
|
23
29
|
ensure
|
24
30
|
FastlaneCore::UpdateChecker.show_update_status('gym', Gym::VERSION)
|
25
31
|
end
|
@@ -10,19 +10,17 @@ module Fastlane
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run(params)
|
13
|
-
require '
|
14
|
-
require 'csv'
|
13
|
+
require 'spaceship'
|
15
14
|
|
16
|
-
devices
|
17
|
-
|
18
|
-
|
19
|
-
username
|
15
|
+
devices = params[:devices]
|
16
|
+
|
17
|
+
credentials = CredentialsManager::PasswordManager.shared_manager(params[:username])
|
18
|
+
Spaceship::Portal.login(credentials.username, credentials.password)
|
20
19
|
|
21
20
|
if devices
|
22
21
|
device_objs = devices.map do |k, v|
|
23
22
|
raise "Passed invalid UDID: #{v} for device: #{k}".red unless UDID_REGEXP =~ v
|
24
|
-
|
25
|
-
Cupertino::ProvisioningPortal::Device.new(k, v)
|
23
|
+
Spaceship::Device.create!(name: k, udid: v)
|
26
24
|
end
|
27
25
|
elsif devices_file
|
28
26
|
devices_file = CSV.read(File.expand_path(File.join(devices_file)), col_sep: "\t")
|
@@ -33,31 +31,13 @@ module Fastlane
|
|
33
31
|
raise 'Invalid device line, please provide a file according to the Apple Sample UDID file (https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip)'.red unless device.count == 2
|
34
32
|
raise "Passed invalid UDID: #{device[0]} for device: #{device[1]}".red unless UDID_REGEXP =~ device[0]
|
35
33
|
|
36
|
-
|
34
|
+
Spaceship::Device.create!(name: device[1], udid: device[0])
|
37
35
|
end
|
38
36
|
else
|
39
37
|
raise 'You must pass either a valid `devices` or `devices_file`. Please check the readme.'.red
|
40
38
|
end
|
41
39
|
|
42
|
-
|
43
|
-
|
44
|
-
agent = Cupertino::ProvisioningPortal::Agent.new
|
45
|
-
agent.username = credentials.username
|
46
|
-
agent.password = credentials.password
|
47
|
-
agent.team_id = team_id if team_id
|
48
|
-
|
49
|
-
Helper.log.info "Fetching list of currently registered devices..."
|
50
|
-
existing_devices = agent.list_devices
|
51
|
-
new_devices = device_objs.select{ |device| !existing_devices.map(&:udid).include?(device.udid) } # calculate the diff based on the UDID
|
52
|
-
|
53
|
-
if new_devices.count > 0
|
54
|
-
Helper.log.info "Adding new devices..."
|
55
|
-
agent.add_devices(*new_devices) rescue raise 'Could not add devices. Please ensure you have passed the correct username/password combination, as well as a valid team_id if a member of multiple teams.'.red
|
56
|
-
|
57
|
-
Helper.log.info "Successfully registered #{new_devices.count} new devices. Total devices now registered: #{existing_devices.count + new_devices.count}!".green
|
58
|
-
else
|
59
|
-
Helper.log.info "Device list up to date, all #{device_objs.count} devices are already registered. Total devices registed: #{existing_devices.count}.".green
|
60
|
-
end
|
40
|
+
Helper.log.info "Successfully registered new devices.".green
|
61
41
|
end
|
62
42
|
|
63
43
|
def self.description
|
@@ -83,8 +63,8 @@ module Fastlane
|
|
83
63
|
description: "optional: Your team ID",
|
84
64
|
optional: true),
|
85
65
|
FastlaneCore::ConfigItem.new(key: :username,
|
86
|
-
env_name: "
|
87
|
-
description: "
|
66
|
+
env_name: "DELIVER_USER",
|
67
|
+
description: "Optional: Your Apple ID",
|
88
68
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)),
|
89
69
|
]
|
90
70
|
end
|
@@ -10,7 +10,7 @@ module Fastlane
|
|
10
10
|
|
11
11
|
Helper.log.info "Setting Team ID to '#{team}' for all build steps"
|
12
12
|
|
13
|
-
[:CERT_TEAM_ID, :SIGH_TEAM_ID, :PEM_TEAM_ID, :PRODUCE_TEAM_ID, :SIGH_TEAM_ID, :
|
13
|
+
[:CERT_TEAM_ID, :SIGH_TEAM_ID, :PEM_TEAM_ID, :PRODUCE_TEAM_ID, :SIGH_TEAM_ID, :FASTLANE_TEAM_ID].each do |current|
|
14
14
|
ENV[current.to_s] = team
|
15
15
|
end
|
16
16
|
end
|
@@ -0,0 +1,299 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
module SharedValues
|
4
|
+
XCODE_SERVER_GET_ASSETS_PATH = :XCODE_SERVER_GET_ASSETS_PATH
|
5
|
+
XCODE_SERVER_GET_ASSETS_ARCHIVE_PATH = :XCODE_SERVER_GET_ASSETS_ARCHIVE_PATH
|
6
|
+
end
|
7
|
+
|
8
|
+
class XcodeServerGetAssetsAction < Action
|
9
|
+
|
10
|
+
require 'excon'
|
11
|
+
require 'json'
|
12
|
+
require 'fileutils'
|
13
|
+
|
14
|
+
def self.run(params)
|
15
|
+
|
16
|
+
host = params[:host]
|
17
|
+
bot_name = params[:bot_name]
|
18
|
+
integration_number_override = params[:integration_number]
|
19
|
+
target_folder = params[:target_folder]
|
20
|
+
keep_all_assets = params[:keep_all_assets]
|
21
|
+
username = params[:username]
|
22
|
+
password = params[:password]
|
23
|
+
trust_self_signed_certs = params[:trust_self_signed_certs]
|
24
|
+
|
25
|
+
# setup (not)trusting self signed certificates.
|
26
|
+
# it's normal to have a self signed certificate on your Xcode Server
|
27
|
+
Excon.defaults[:ssl_verify_peer] = !trust_self_signed_certs # for self-signed certificates
|
28
|
+
|
29
|
+
# create Xcode Server config
|
30
|
+
xcs = XcodeServer.new(host, username, password)
|
31
|
+
bots = xcs.fetch_all_bots
|
32
|
+
|
33
|
+
Helper.log.info "Fetched #{bots.count} Bots from Xcode Server at #{host}.".yellow
|
34
|
+
|
35
|
+
# pull out names
|
36
|
+
bot_names = bots.map { |bot| bot['name'] }
|
37
|
+
|
38
|
+
# match the bot name with a found bot, otherwise fail
|
39
|
+
found_bots = bots.select { |bot| bot['name'] == bot_name }
|
40
|
+
raise "Failed to find a Bot with name #{bot_name} on server #{host}, only available Bots: #{bot_names}".red if found_bots.count == 0
|
41
|
+
|
42
|
+
bot = found_bots[0]
|
43
|
+
|
44
|
+
Helper.log.info "Found Bot with name #{bot_name} with id #{bot['_id']}.".green
|
45
|
+
|
46
|
+
# we have our bot, get finished integrations, sorted from newest to oldest
|
47
|
+
integrations = xcs.fetch_integrations(bot['_id']).select { |i| i['currentStep'] == 'completed' }
|
48
|
+
raise "Failed to find any completed integration for Bot \"#{bot_name}\"".red if (integrations || []).count == 0
|
49
|
+
|
50
|
+
# if no integration number is specified, pick the newest one (this is sorted from newest to oldest)
|
51
|
+
if integration_number_override
|
52
|
+
integration = integrations.select { |i| i['number'] == integration_number_override }.first
|
53
|
+
raise "Specified integration number #{integration_number_override} does not exist.".red unless integration
|
54
|
+
else
|
55
|
+
integration = integrations.first
|
56
|
+
end
|
57
|
+
|
58
|
+
# consider: only taking the last successful one? or allow failing tests? warnings?
|
59
|
+
|
60
|
+
Helper.log.info "Using integration #{integration['number']}.".yellow
|
61
|
+
|
62
|
+
# fetch assets for this integration
|
63
|
+
assets_path = xcs.fetch_assets(integration['_id'], target_folder, self)
|
64
|
+
raise "Failed to fetch assets for integration #{integration['number']}." unless assets_path
|
65
|
+
|
66
|
+
asset_entries = Dir.entries(assets_path).map { |i| File.join(assets_path, i) }
|
67
|
+
|
68
|
+
Helper.log.info "Successfully downloaded #{asset_entries.count} assets to file #{assets_path}!".green
|
69
|
+
|
70
|
+
# now find the archive and unzip it
|
71
|
+
zipped_archive_path = asset_entries.select { |i| i.end_with?('xcarchive.zip') }.first
|
72
|
+
|
73
|
+
if zipped_archive_path
|
74
|
+
|
75
|
+
Helper.log.info "Found an archive in the assets folder...".yellow
|
76
|
+
|
77
|
+
archive_file_path = File.basename(zipped_archive_path, File.extname(zipped_archive_path))
|
78
|
+
archive_dir_path = File.dirname(zipped_archive_path)
|
79
|
+
archive_path = File.join(archive_dir_path, archive_file_path)
|
80
|
+
if File.exists?(archive_path)
|
81
|
+
# we already have the archive, skip
|
82
|
+
Helper.log.info "Archive #{archive_path} already exists, not unzipping again...".yellow
|
83
|
+
else
|
84
|
+
# unzip the archive
|
85
|
+
sh "unzip -q \"#{zipped_archive_path}\" -d \"#{archive_dir_path}\""
|
86
|
+
end
|
87
|
+
|
88
|
+
# reload asset entries to also contain the xcarchive file
|
89
|
+
asset_entries = Dir.entries(assets_path).map { |i| File.join(assets_path, i) }
|
90
|
+
|
91
|
+
# optionally delete everything except for the archive
|
92
|
+
if !keep_all_assets
|
93
|
+
files_to_delete = asset_entries.select do |i|
|
94
|
+
File.extname(i) != '.xcarchive' && ![".", ".."].include?(File.basename(i))
|
95
|
+
end
|
96
|
+
|
97
|
+
files_to_delete.each do |i|
|
98
|
+
FileUtils.rm_rf(i)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
Actions.lane_context[SharedValues::XCODE_SERVER_GET_ASSETS_ARCHIVE_PATH] = archive_path
|
103
|
+
end
|
104
|
+
|
105
|
+
Actions.lane_context[SharedValues::XCODE_SERVER_GET_ASSETS_PATH] = assets_path
|
106
|
+
|
107
|
+
return assets_path
|
108
|
+
end
|
109
|
+
|
110
|
+
class XcodeServer
|
111
|
+
|
112
|
+
def initialize(host, username, password)
|
113
|
+
@host = host.start_with?('https://') ? host : "https://#{host}"
|
114
|
+
@username = username
|
115
|
+
@password = password
|
116
|
+
end
|
117
|
+
|
118
|
+
def fetch_all_bots
|
119
|
+
response = get_endpoint('/bots')
|
120
|
+
raise "You are unauthorized to access data on #{@host}, please check that you're passing in a correct username and password.".red if response.status == 401
|
121
|
+
raise "Failed to fetch Bots from Xcode Server at #{@host}, response: #{response.status}: #{response.body}.".red if response.status != 200
|
122
|
+
bots = JSON.parse(response.body)['results']
|
123
|
+
end
|
124
|
+
|
125
|
+
def fetch_integrations(bot_id)
|
126
|
+
response = get_endpoint("/bots/#{bot_id}/integrations?limit=10")
|
127
|
+
raise "Failed to fetch Integrations for Bot #{bot_id} from Xcode Server at #{@host}, response: #{response.status}: #{response.body}".red if response.status != 200
|
128
|
+
integrations = JSON.parse(response.body)['results']
|
129
|
+
end
|
130
|
+
|
131
|
+
def fetch_assets(integration_id, target_folder, action)
|
132
|
+
|
133
|
+
# create a temp folder and a file, stream the download into it
|
134
|
+
Dir.mktmpdir do |dir|
|
135
|
+
|
136
|
+
temp_file = File.join(dir, "tmp_download.#{rand(1000000)}")
|
137
|
+
f = open(temp_file, 'w')
|
138
|
+
streamer = lambda do |chunk, remaining_bytes, total_bytes|
|
139
|
+
if remaining_bytes && total_bytes
|
140
|
+
Helper.log.info "Downloading: #{100 - (100 * remaining_bytes.to_f / total_bytes.to_f).to_i}%".yellow
|
141
|
+
else
|
142
|
+
Helper.log.error "#{chunk}".red
|
143
|
+
end
|
144
|
+
f.write(chunk)
|
145
|
+
end
|
146
|
+
|
147
|
+
response = self.get_endpoint("/integrations/#{integration_id}/assets", streamer)
|
148
|
+
f.close()
|
149
|
+
|
150
|
+
raise "Integration doesn't have any assets (it probably never ran).".red if response.status == 500
|
151
|
+
raise "Failed to fetch Assets zip for Integration #{integration_id} from Xcode Server at #{@host}, response: #{response.status}: #{response.body}".red if response.status != 200
|
152
|
+
|
153
|
+
# unzip it, it's a .tar.gz file
|
154
|
+
out_folder = File.join(dir, "out_#{rand(1000000)}")
|
155
|
+
FileUtils.mkdir_p(out_folder)
|
156
|
+
|
157
|
+
action.sh "cd \"#{out_folder}\"; cat \"#{temp_file}\" | gzip -d | tar -x"
|
158
|
+
|
159
|
+
# then pull the real name from headers
|
160
|
+
asset_filename = response.headers['Content-Disposition'].split(';')[1].split('=')[1].gsub('"', '')
|
161
|
+
asset_foldername = asset_filename.split('.')[0]
|
162
|
+
|
163
|
+
# rename the folder in out_folder to asset_foldername
|
164
|
+
found_folder = Dir.entries(out_folder).select { |item| item != '.' && item != '..' }[0]
|
165
|
+
|
166
|
+
raise "Internal error, couldn't find unzipped folder".red if found_folder.nil?
|
167
|
+
|
168
|
+
unzipped_folder_temp_name = File.join(out_folder, found_folder)
|
169
|
+
unzipped_folder = File.join(out_folder, asset_foldername)
|
170
|
+
|
171
|
+
# rename to destination name
|
172
|
+
FileUtils.mv(unzipped_folder_temp_name, unzipped_folder)
|
173
|
+
|
174
|
+
target_folder = File.absolute_path(target_folder)
|
175
|
+
|
176
|
+
# create target folder if it doesn't exist
|
177
|
+
FileUtils.mkdir_p(target_folder)
|
178
|
+
|
179
|
+
# and move+rename it to the destination place
|
180
|
+
FileUtils.cp_r(unzipped_folder, target_folder)
|
181
|
+
out = File.join(target_folder, asset_foldername)
|
182
|
+
return out
|
183
|
+
end
|
184
|
+
return nil
|
185
|
+
end
|
186
|
+
|
187
|
+
def headers
|
188
|
+
require 'base64'
|
189
|
+
headers = {
|
190
|
+
'User-Agent' => 'fastlane-xcode_server_get_assets', # XCS wants user agent. for some API calls. not for others. sigh.
|
191
|
+
'X-XCSAPIVersion' => 1 # XCS API version with this API, Xcode needs this otherwise it explodes in a 500 error fire. Currently Xcode 7 Beta 5 is on Version 5.
|
192
|
+
}
|
193
|
+
|
194
|
+
if @username && @password
|
195
|
+
userpass = "#{@username}:#{@password}"
|
196
|
+
headers['Authorization'] = "Basic #{Base64.strict_encode64(userpass)}"
|
197
|
+
end
|
198
|
+
|
199
|
+
return headers
|
200
|
+
end
|
201
|
+
|
202
|
+
def get_endpoint(endpoint, response_block=nil)
|
203
|
+
url = url_for_endpoint(endpoint)
|
204
|
+
headers = self.headers || {}
|
205
|
+
|
206
|
+
if response_block
|
207
|
+
response = Excon.get(url, :response_block => response_block, :headers => headers)
|
208
|
+
else
|
209
|
+
response = Excon.get(url, :headers => headers)
|
210
|
+
end
|
211
|
+
|
212
|
+
return response
|
213
|
+
end
|
214
|
+
|
215
|
+
private
|
216
|
+
|
217
|
+
def url_for_endpoint(endpoint)
|
218
|
+
"#{@host}:20343/api#{endpoint}"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
#####################################################
|
223
|
+
# @!group Documentation
|
224
|
+
#####################################################
|
225
|
+
|
226
|
+
def self.description
|
227
|
+
"Downloads Xcode Bot assets like the `.xcarchive` and logs"
|
228
|
+
end
|
229
|
+
|
230
|
+
def self.details
|
231
|
+
"This action downloads assets from your Xcode Server Bot (works with Xcode Server
|
232
|
+
using Xcode 6 and 7. By default this action downloads all assets, unzips them and
|
233
|
+
deletes everything except for the `.xcarchive`. If you'd like to keep all downloaded
|
234
|
+
assets, pass `:keep_all_assets: true`. This action returns the path to the downloaded
|
235
|
+
assets folder and puts into shared values the paths to the asset folder and to the `.xcarchive` inside it"
|
236
|
+
end
|
237
|
+
|
238
|
+
def self.available_options
|
239
|
+
[
|
240
|
+
FastlaneCore::ConfigItem.new(key: :host,
|
241
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_HOST",
|
242
|
+
description: "IP Address/Hostname of Xcode Server",
|
243
|
+
optional: false),
|
244
|
+
FastlaneCore::ConfigItem.new(key: :bot_name,
|
245
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_BOT_NAME",
|
246
|
+
description: "Name of the Bot to pull assets from",
|
247
|
+
optional: false),
|
248
|
+
FastlaneCore::ConfigItem.new(key: :integration_number,
|
249
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_INTEGRATION_NUMBER",
|
250
|
+
description: "Optionally you can override which integration's assets should be downloaded. If not provided, the latest integration is used",
|
251
|
+
is_string: false,
|
252
|
+
optional: true),
|
253
|
+
FastlaneCore::ConfigItem.new(key: :username,
|
254
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_USERNAME",
|
255
|
+
description: "Username for your Xcode Server",
|
256
|
+
optional: true,
|
257
|
+
default_value: ""),
|
258
|
+
FastlaneCore::ConfigItem.new(key: :password,
|
259
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_PASSWORD",
|
260
|
+
description: "Password for your Xcode Server",
|
261
|
+
optional: true,
|
262
|
+
default_value: ""),
|
263
|
+
FastlaneCore::ConfigItem.new(key: :target_folder,
|
264
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_TARGET_FOLDER",
|
265
|
+
description: "Relative path to a folder into which to download assets",
|
266
|
+
optional: true,
|
267
|
+
default_value: './xcs_assets'),
|
268
|
+
FastlaneCore::ConfigItem.new(key: :keep_all_assets,
|
269
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_KEEP_ALL_ASSETS",
|
270
|
+
description: "Whether to keep all assets or let the script delete everything except for the .xcarchive",
|
271
|
+
optional: true,
|
272
|
+
is_string: false,
|
273
|
+
default_value: false),
|
274
|
+
FastlaneCore::ConfigItem.new(key: :trust_self_signed_certs,
|
275
|
+
env_name: "FL_XCODE_SERVER_GET_ASSETS_TRUST_SELF_SIGNED_CERTS",
|
276
|
+
description: "Whether to trust self-signed certs on your Xcode Server",
|
277
|
+
optional: true,
|
278
|
+
is_string: false,
|
279
|
+
default_value: true)
|
280
|
+
]
|
281
|
+
end
|
282
|
+
|
283
|
+
def self.output
|
284
|
+
[
|
285
|
+
['XCODE_SERVER_GET_ASSETS_PATH', 'Absolute path to the downloaded assets folder'],
|
286
|
+
['XCODE_SERVER_GET_ASSETS_ARCHIVE_PATH', 'Absolute path to the downloaded xcarchive file']
|
287
|
+
]
|
288
|
+
end
|
289
|
+
|
290
|
+
def self.authors
|
291
|
+
["czechboy0"]
|
292
|
+
end
|
293
|
+
|
294
|
+
def self.is_supported?(platform)
|
295
|
+
true
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
data/lib/fastlane/lane.rb
CHANGED
@@ -19,6 +19,10 @@ module Fastlane
|
|
19
19
|
raise "lane name must not contain any spaces".red if name.to_s.include?" "
|
20
20
|
raise "lane name must start with :".red unless name.kind_of?Symbol
|
21
21
|
|
22
|
+
if self.class.black_list.include?(name.to_s)
|
23
|
+
Helper.log.error "Lane Name '#{name}' can not be one of the followings: #{self.class.black_list}".red
|
24
|
+
raise "Name '#{name}' is already taken"
|
25
|
+
end
|
22
26
|
|
23
27
|
self.platform = platform
|
24
28
|
self.name = name
|
@@ -36,5 +40,11 @@ module Fastlane
|
|
36
40
|
def pretty_name
|
37
41
|
[platform, name].reject(&:nil?).join(' ')
|
38
42
|
end
|
43
|
+
|
44
|
+
class << self
|
45
|
+
def black_list
|
46
|
+
%w{run init new_action lanes list docs action actions help}
|
47
|
+
end
|
48
|
+
end
|
39
49
|
end
|
40
50
|
end
|
data/lib/fastlane/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -94,20 +94,6 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.1'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: cupertino
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 1.3.3
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 1.3.3
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: terminal-notifier
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,30 +154,44 @@ dependencies:
|
|
168
154
|
name: fastlane_core
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
|
-
- - "
|
157
|
+
- - ">="
|
172
158
|
- !ruby/object:Gem::Version
|
173
159
|
version: 0.13.0
|
174
160
|
type: :runtime
|
175
161
|
prerelease: false
|
176
162
|
version_requirements: !ruby/object:Gem::Requirement
|
177
163
|
requirements:
|
178
|
-
- - "
|
164
|
+
- - ">="
|
179
165
|
- !ruby/object:Gem::Version
|
180
166
|
version: 0.13.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: credentials_manager
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.7.3
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.7.3
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: spaceship
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
|
-
- - "
|
185
|
+
- - ">="
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.
|
187
|
+
version: 0.5.0
|
188
188
|
type: :runtime
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- - "
|
192
|
+
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: 0.
|
194
|
+
version: 0.5.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: deliver
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -296,14 +296,14 @@ dependencies:
|
|
296
296
|
requirements:
|
297
297
|
- - ">="
|
298
298
|
- !ruby/object:Gem::Version
|
299
|
-
version: 0.
|
299
|
+
version: 0.2.0
|
300
300
|
type: :runtime
|
301
301
|
prerelease: false
|
302
302
|
version_requirements: !ruby/object:Gem::Requirement
|
303
303
|
requirements:
|
304
304
|
- - ">="
|
305
305
|
- !ruby/object:Gem::Version
|
306
|
-
version: 0.
|
306
|
+
version: 0.2.0
|
307
307
|
- !ruby/object:Gem::Dependency
|
308
308
|
name: bundler
|
309
309
|
requirement: !ruby/object:Gem::Requirement
|
@@ -514,6 +514,7 @@ files:
|
|
514
514
|
- lib/fastlane/actions/update_project_code_signing.rb
|
515
515
|
- lib/fastlane/actions/update_project_provisioning.rb
|
516
516
|
- lib/fastlane/actions/xcode_select.rb
|
517
|
+
- lib/fastlane/actions/xcode_server_get_assets.rb
|
517
518
|
- lib/fastlane/actions/xcodebuild.rb
|
518
519
|
- lib/fastlane/actions/xctool.rb
|
519
520
|
- lib/fastlane/actions_list.rb
|