fastlane 2.102.0 → 2.103.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +74 -74
- data/credentials_manager/lib/credentials_manager/account_manager.rb +9 -4
- data/deliver/lib/assets/DeliverfileDefault.swift +10 -0
- data/deliver/lib/assets/summary.html.erb +3 -3
- data/deliver/lib/deliver/html_generator.rb +9 -0
- data/deliver/lib/deliver/options.rb +56 -35
- data/deliver/lib/deliver/setup.rb +1 -2
- data/deliver/lib/deliver/submit_for_review.rb +2 -2
- data/deliver/lib/deliver/upload_metadata.rb +1 -1
- data/fastlane/lib/fastlane/action.rb +1 -0
- data/fastlane/lib/fastlane/actions/actions_helper.rb +11 -1
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +11 -3
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +1 -1
- data/fastlane/lib/fastlane/actions/create_app_online.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +15 -1
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +21 -0
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +1 -1
- data/fastlane/lib/fastlane/actions/gradle.rb +4 -0
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/set_changelog.rb +1 -1
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +2 -0
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
- data/fastlane/lib/fastlane/setup/setup_ios.rb +7 -5
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +13 -13
- data/fastlane/swift/Fastlane.swift +45 -43
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane_core/lib/fastlane_core/command_executor.rb +9 -14
- data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +12 -3
- data/fastlane_core/lib/fastlane_core/helper.rb +22 -10
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +1 -1
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +22 -15
- data/pilot/lib/pilot/build_manager.rb +1 -1
- data/pilot/lib/pilot/tester_importer.rb +2 -2
- data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +3 -3
- data/produce/lib/produce/cloud_container.rb +82 -0
- data/produce/lib/produce/commands_generator.rb +34 -0
- data/produce/lib/produce/itunes_connect.rb +1 -1
- data/snapshot/lib/snapshot/commands_generator.rb +0 -2
- data/snapshot/lib/snapshot/reports_generator.rb +8 -3
- data/snapshot/lib/snapshot/runner.rb +9 -0
- data/spaceship/README.md +2 -2
- data/spaceship/lib/spaceship/client.rb +6 -2
- data/spaceship/lib/spaceship/errors.rb +3 -0
- data/spaceship/lib/spaceship/portal/app.rb +22 -1
- data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
- data/spaceship/lib/spaceship/portal/portal.rb +1 -0
- data/spaceship/lib/spaceship/portal/portal_client.rb +45 -4
- data/spaceship/lib/spaceship/portal/spaceship.rb +9 -0
- data/spaceship/lib/spaceship/test_flight/client.rb +1 -1
- data/spaceship/lib/spaceship/tunes/app_ratings.rb +2 -2
- data/spaceship/lib/spaceship/tunes/app_submission.rb +9 -3
- data/spaceship/lib/spaceship/tunes/app_version.rb +1 -1
- data/spaceship/lib/spaceship/tunes/application.rb +4 -4
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +13 -2
- data/supply/lib/supply/client.rb +0 -1
- metadata +22 -20
@@ -49,23 +49,18 @@ module FastlaneCore
|
|
49
49
|
|
50
50
|
begin
|
51
51
|
status = FastlaneCore::FastlanePty.spawn(command) do |command_stdout, command_stdin, pid|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
output << line
|
52
|
+
command_stdout.each do |l|
|
53
|
+
line = l.strip # strip so that \n gets removed
|
54
|
+
output << line
|
56
55
|
|
57
|
-
|
56
|
+
next unless print_all
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
UI.command_output(line)
|
58
|
+
# Prefix the current line with a string
|
59
|
+
prefix.each do |element|
|
60
|
+
line = element[:prefix] + line if element[:block] && element[:block].call(line)
|
65
61
|
end
|
66
|
-
|
67
|
-
|
68
|
-
# and we kept trying to read, ignore it
|
62
|
+
|
63
|
+
UI.command_output(line)
|
69
64
|
end
|
70
65
|
end
|
71
66
|
rescue => ex
|
@@ -3,13 +3,22 @@
|
|
3
3
|
# https://github.com/DragonBox/u3d/blob/59e471ad78ac00cb629f479dbe386c5ad2dc5075/lib/u3d_core/command_runner.rb#L88-L96
|
4
4
|
module FastlaneCore
|
5
5
|
class FastlanePty
|
6
|
-
def self.spawn(command
|
6
|
+
def self.spawn(command)
|
7
7
|
require 'pty'
|
8
8
|
PTY.spawn(command) do |command_stdout, command_stdin, pid|
|
9
9
|
begin
|
10
|
-
|
10
|
+
yield(command_stdout, command_stdin, pid)
|
11
|
+
rescue Errno::EIO
|
12
|
+
# Exception ignored intentionally.
|
13
|
+
# https://stackoverflow.com/questions/10238298/ruby-on-linux-pty-goes-away-without-eof-raises-errnoeio
|
14
|
+
# This is expected on some linux systems, that indicates that the subcommand finished
|
15
|
+
# and we kept trying to read, ignore it
|
11
16
|
ensure
|
12
|
-
|
17
|
+
begin
|
18
|
+
Process.wait(pid)
|
19
|
+
rescue Errno::ECHILD, PTY::ChildExited
|
20
|
+
# The process might have exited.
|
21
|
+
end
|
13
22
|
end
|
14
23
|
end
|
15
24
|
$?.exitstatus
|
@@ -193,22 +193,34 @@ module FastlaneCore
|
|
193
193
|
|
194
194
|
# @return the full path to the iTMSTransporter executable
|
195
195
|
def self.transporter_path
|
196
|
-
return File.join(self.itms_path, 'bin', 'iTMSTransporter')
|
196
|
+
return File.join(self.itms_path, 'bin', 'iTMSTransporter') unless Helper.windows?
|
197
|
+
return File.join(self.itms_path, 'iTMSTransporter')
|
197
198
|
end
|
198
199
|
|
199
200
|
# @return the full path to the iTMSTransporter executable
|
200
201
|
def self.itms_path
|
201
202
|
return ENV["FASTLANE_ITUNES_TRANSPORTER_PATH"] if FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
203
|
+
|
204
|
+
if self.mac?
|
205
|
+
[
|
206
|
+
"../Applications/Application Loader.app/Contents/MacOS/itms",
|
207
|
+
"../Applications/Application Loader.app/Contents/itms"
|
208
|
+
].each do |path|
|
209
|
+
result = File.expand_path(File.join(self.xcode_path, path))
|
210
|
+
return result if File.exist?(result)
|
211
|
+
end
|
212
|
+
UI.user_error!("Could not find transporter at #{self.xcode_path}. Please make sure you set the correct path to your Xcode installation.")
|
213
|
+
elsif self.windows?
|
214
|
+
[
|
215
|
+
"C:/Program Files (x86)/itms"
|
216
|
+
].each do |path|
|
217
|
+
return path if File.exist?(path)
|
218
|
+
end
|
219
|
+
UI.user_error!("Could not find transporter at usual locations. Please use environment variable `FASTLANE_ITUNES_TRANSPORTER_PATH` to specify your installation path.")
|
220
|
+
else
|
221
|
+
# not Mac or Windows
|
222
|
+
return ''
|
210
223
|
end
|
211
|
-
UI.user_error!("Could not find transporter at #{self.xcode_path}. Please make sure you set the correct path to your Xcode installation.")
|
212
224
|
end
|
213
225
|
|
214
226
|
# keychain
|
@@ -21,7 +21,7 @@ module FastlaneCore
|
|
21
21
|
apple_id: app_id,
|
22
22
|
file_size: File.size(ipa_path),
|
23
23
|
ipa_path: File.basename(ipa_path), # this is only the base name as the ipa is inside the package
|
24
|
-
md5: Digest::MD5.
|
24
|
+
md5: Digest::MD5.file(ipa_path).hexdigest,
|
25
25
|
archive_type: "bundle",
|
26
26
|
platform: (platform || "ios") # pass "appletvos" for Apple TV's IPA
|
27
27
|
}
|
@@ -52,24 +52,18 @@ module FastlaneCore
|
|
52
52
|
end
|
53
53
|
|
54
54
|
begin
|
55
|
-
FastlaneCore::FastlanePty.spawn(command) do |command_stdout, command_stdin, pid|
|
55
|
+
exit_status = FastlaneCore::FastlanePty.spawn(command) do |command_stdout, command_stdin, pid|
|
56
56
|
begin
|
57
57
|
command_stdout.each do |line|
|
58
58
|
@all_lines << line
|
59
59
|
parse_line(line, hide_output) # this is where the parsing happens
|
60
60
|
end
|
61
|
-
rescue Errno::EIO
|
62
|
-
# Exception ignored intentionally.
|
63
|
-
# https://stackoverflow.com/questions/10238298/ruby-on-linux-pty-goes-away-without-eof-raises-errnoeio
|
64
|
-
ensure
|
65
|
-
Process.wait(pid)
|
66
61
|
end
|
67
62
|
end
|
68
63
|
rescue => ex
|
69
64
|
@errors << ex.to_s
|
70
65
|
end
|
71
66
|
|
72
|
-
exit_status = $?.exitstatus
|
73
67
|
unless exit_status.zero?
|
74
68
|
@errors << "The call to the iTMSTransporter completed with a non-zero exit status: #{exit_status}. This indicates a failure."
|
75
69
|
end
|
@@ -165,10 +159,11 @@ module FastlaneCore
|
|
165
159
|
"-m upload",
|
166
160
|
"-u \"#{username}\"",
|
167
161
|
"-p #{shell_escaped_password(password)}",
|
168
|
-
"-f
|
162
|
+
"-f \"#{source}\"",
|
169
163
|
ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"], # that's here, because the user might overwrite the -t option
|
170
|
-
"-t
|
164
|
+
"-t Signiant",
|
171
165
|
"-k 100000",
|
166
|
+
("-WONoPause true" if Helper.windows?), # Windows only: process instantly returns instead of waiting for key press
|
172
167
|
("-itc_provider #{provider_short_name}" unless provider_short_name.to_s.empty?)
|
173
168
|
].compact.join(' ')
|
174
169
|
end
|
@@ -187,13 +182,16 @@ module FastlaneCore
|
|
187
182
|
|
188
183
|
def handle_error(password)
|
189
184
|
# rubocop:disable Style/CaseEquality
|
190
|
-
|
185
|
+
# rubocop:disable Style/YodaCondition
|
186
|
+
unless /^[0-9a-zA-Z\.\$\_\-]*$/ === password
|
191
187
|
UI.error([
|
192
188
|
"Password contains special characters, which may not be handled properly by iTMSTransporter.",
|
193
189
|
"If you experience problems uploading to App Store Connect, please consider changing your password to something with only alphanumeric characters."
|
194
190
|
].join(' '))
|
195
191
|
end
|
196
192
|
# rubocop:enable Style/CaseEquality
|
193
|
+
# rubocop:enable Style/YodaCondition
|
194
|
+
|
197
195
|
UI.error("Could not download/upload from App Store Connect! It's probably related to your password or your internet connection.")
|
198
196
|
end
|
199
197
|
|
@@ -210,8 +208,11 @@ module FastlaneCore
|
|
210
208
|
"'\"\\'\"'"
|
211
209
|
end
|
212
210
|
|
213
|
-
# wrap the fully-escaped password in single quotes, since the transporter expects a escaped password string
|
214
|
-
|
211
|
+
# wrap the fully-escaped password in single quotes, since the transporter expects a escaped password string
|
212
|
+
# (which must be single-quoted for the shell's benefit [on non-Windows platforms])
|
213
|
+
password = "'" + password + "'" unless Helper.windows?
|
214
|
+
|
215
|
+
password
|
215
216
|
end
|
216
217
|
end
|
217
218
|
|
@@ -314,8 +315,9 @@ module FastlaneCore
|
|
314
315
|
# short names
|
315
316
|
def initialize(user = nil, password = nil, use_shell_script = false, provider_short_name = nil)
|
316
317
|
# Xcode 6.x doesn't have the same iTMSTransporter Java setup as later Xcode versions, so
|
317
|
-
# we can't default to using the
|
318
|
-
use_shell_script ||= Helper.xcode_version.start_with?('6.')
|
318
|
+
# we can't default to using the newer direct Java invocation strategy for those versions.
|
319
|
+
use_shell_script ||= Helper.is_mac? && Helper.xcode_version.start_with?('6.')
|
320
|
+
use_shell_script ||= Helper.windows?
|
319
321
|
use_shell_script ||= Feature.enabled?('FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT')
|
320
322
|
|
321
323
|
@user = user
|
@@ -419,8 +421,11 @@ module FastlaneCore
|
|
419
421
|
def handle_two_step_failure(ex)
|
420
422
|
if ENV[TWO_FACTOR_ENV_VARIABLE].to_s.length > 0
|
421
423
|
# Password provided, however we already used it
|
422
|
-
UI.error("
|
424
|
+
UI.error("")
|
425
|
+
UI.error("Application specific password you provided using")
|
426
|
+
UI.error("environment variable #{TWO_FACTOR_ENV_VARIABLE}")
|
423
427
|
UI.error("is invalid, please make sure it's correct")
|
428
|
+
UI.error("")
|
424
429
|
UI.user_error!("Invalid application specific password provided")
|
425
430
|
end
|
426
431
|
|
@@ -433,10 +438,12 @@ module FastlaneCore
|
|
433
438
|
UI.error("Please make sure to follow the instructions")
|
434
439
|
a.remove_from_keychain
|
435
440
|
end
|
441
|
+
UI.error("")
|
436
442
|
UI.error("Your account has 2 step verification enabled")
|
437
443
|
UI.error("Please go to https://appleid.apple.com/account/manage")
|
438
444
|
UI.error("and generate an application specific password for")
|
439
445
|
UI.error("the iTunes Transporter, which is used to upload builds")
|
446
|
+
UI.error("")
|
440
447
|
UI.error("To set the application specific password on a CI machine using")
|
441
448
|
UI.error("an environment variable, you can set the")
|
442
449
|
UI.error("#{TWO_FACTOR_ENV_VARIABLE} variable")
|
@@ -18,7 +18,7 @@ module Pilot
|
|
18
18
|
|
19
19
|
if options[:changelog].nil? && options[:distribute_external] == true
|
20
20
|
if UI.interactive?
|
21
|
-
options[:changelog] = UI.input("No changelog provided for new build.
|
21
|
+
options[:changelog] = UI.input("No changelog provided for new build. You can provide a changelog using the `changelog` option. For now, please provide a changelog here:")
|
22
22
|
else
|
23
23
|
UI.user_error!("No changelog provided for new build. Please either disable `distribute_external` or provide a changelog using the `changelog` option")
|
24
24
|
end
|
@@ -29,13 +29,13 @@ module Precheck
|
|
29
29
|
begin
|
30
30
|
uri = Addressable::URI.parse(url)
|
31
31
|
uri.fragment = nil
|
32
|
-
request = Faraday.new(
|
32
|
+
request = Faraday.new(uri.normalize.to_s) do |connection|
|
33
33
|
connection.use(FaradayMiddleware::FollowRedirects)
|
34
34
|
connection.adapter(:net_http)
|
35
35
|
end
|
36
36
|
return RuleReturn.new(validation_state: Precheck::VALIDATION_STATES[:failed], failure_data: url) unless request.head.status == 200
|
37
|
-
rescue
|
38
|
-
UI.verbose("URL #{url} not reachable
|
37
|
+
rescue StandardError => e
|
38
|
+
UI.verbose("URL #{url} not reachable 😵: #{e.message}")
|
39
39
|
# I can only return :fail here, but I also want to return #{url}
|
40
40
|
return RuleReturn.new(validation_state: VALIDATION_STATES[:failed], failure_data: "unreachable: #{url}")
|
41
41
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spaceship'
|
2
|
+
require_relative 'module'
|
3
|
+
|
4
|
+
module Produce
|
5
|
+
class CloudContainer
|
6
|
+
def create(options, _args)
|
7
|
+
login
|
8
|
+
|
9
|
+
container_identifier = options.container_identifier || UI.input("iCloud Container identifier: ")
|
10
|
+
|
11
|
+
if container_exists?(container_identifier)
|
12
|
+
UI.success("[DevCenter] iCloud Container '#{options.container_name} (#{options.container_identifier})' already exists, nothing to do on the Dev Center")
|
13
|
+
# Nothing to do here
|
14
|
+
else
|
15
|
+
container_name = options.container_name || container_identifier.gsub('.', ' ')
|
16
|
+
|
17
|
+
UI.success("Creating new iCloud Container '#{container_name}' with identifier '#{container_identifier}' on the Apple Dev Center")
|
18
|
+
|
19
|
+
container = Spaceship.cloud_container.create!(identifier: container_identifier, name: container_name)
|
20
|
+
|
21
|
+
if container.name != container_name
|
22
|
+
UI.important("Your container name includes non-ASCII characters, which are not supported by the Apple Developer Portal.")
|
23
|
+
UI.important("To fix this a unique (internal) name '#{container.name}' has been created for you.")
|
24
|
+
end
|
25
|
+
|
26
|
+
UI.message("Created iCloud Container #{container.cloud_container}")
|
27
|
+
UI.user_error!("Something went wrong when creating the new iCloud Container - it's not listed in the iCloud Container list") unless container_exists?(container_identifier)
|
28
|
+
UI.success("Finished creating new iCloud Container '#{container_name}' on the Dev Center")
|
29
|
+
end
|
30
|
+
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
|
34
|
+
def associate(_options, args)
|
35
|
+
login
|
36
|
+
|
37
|
+
if !app_exists?
|
38
|
+
UI.message("[DevCenter] App '#{Produce.config[:app_identifier]}' does not exist, nothing to associate with the containers")
|
39
|
+
else
|
40
|
+
app = Spaceship.app.find(app_identifier)
|
41
|
+
UI.user_error!("Something went wrong when fetching the app - it's not listed in the apps list") if app.nil?
|
42
|
+
|
43
|
+
new_containers = []
|
44
|
+
|
45
|
+
UI.message("Validating containers before association")
|
46
|
+
|
47
|
+
args.each do |container_identifier|
|
48
|
+
if !container_exists?(container_identifier)
|
49
|
+
UI.message("[DevCenter] iCloud Container '#{container_identifier}' does not exist, please create it first, skipping for now")
|
50
|
+
else
|
51
|
+
new_containers.push(Spaceship.cloud_container.find(container_identifier))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
UI.message("Finalising association with #{new_containers.count} containers")
|
56
|
+
app.associate_cloud_containers(new_containers)
|
57
|
+
UI.success("Done!")
|
58
|
+
end
|
59
|
+
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
|
63
|
+
def login
|
64
|
+
UI.message("Starting login with user '#{Produce.config[:username]}'")
|
65
|
+
Spaceship.login(Produce.config[:username], nil)
|
66
|
+
Spaceship.select_team
|
67
|
+
UI.message("Successfully logged in")
|
68
|
+
end
|
69
|
+
|
70
|
+
def app_identifier
|
71
|
+
Produce.config[:app_identifier].to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def container_exists?(identifier)
|
75
|
+
Spaceship.cloud_container.find(identifier) != nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def app_exists?
|
79
|
+
Spaceship.app.find(app_identifier) != nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -152,6 +152,40 @@ module Produce
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
+
command :cloud_container do |c|
|
156
|
+
c.syntax = 'fastlane produce cloud_container'
|
157
|
+
c.description = 'Ensure that a specific iCloud Container exists'
|
158
|
+
c.example('Create iCloud Container', 'fastlane produce cloud_container -g iCloud.com.example.app -n "Example iCloud Container"')
|
159
|
+
|
160
|
+
c.option('-n', '--container_name STRING', String, 'Name for the iCloud Container that is created (PRODUCE_CLOUD_CONTAINER_NAME)')
|
161
|
+
c.option('-g', '--container_identifier STRING', String, 'Identifier for the iCloud Container (PRODUCE_CLOUD_CONTAINER_IDENTIFIER')
|
162
|
+
|
163
|
+
FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
|
164
|
+
|
165
|
+
c.action do |args, options|
|
166
|
+
allowed_keys = Produce::Options.available_options.collect(&:key)
|
167
|
+
Produce.config = FastlaneCore::Configuration.create(Produce::Options.available_options, options.__hash__.select { |key, value| allowed_keys.include?(key) })
|
168
|
+
|
169
|
+
require 'produce/cloud_container'
|
170
|
+
Produce::CloudContainer.new.create(options, args)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
command :associate_cloud_container do |c|
|
175
|
+
c.syntax = 'fastlane produce associate_cloud_container -a APP_IDENTIFIER CONTAINER_IDENTIFIER1, CONTAINER_IDENTIFIER2, ...'
|
176
|
+
c.description = 'Associate with a iCloud Container, which is created if needed or simply located otherwise'
|
177
|
+
c.example('Associate with iCloud Container', 'fastlane produce associate_cloud_container -a com.example.app iCloud.com.example.com')
|
178
|
+
|
179
|
+
FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
|
180
|
+
|
181
|
+
c.action do |args, options|
|
182
|
+
Produce.config = FastlaneCore::Configuration.create(Produce::Options.available_options, options.__hash__)
|
183
|
+
|
184
|
+
require 'produce/cloud_container'
|
185
|
+
Produce::CloudContainer.new.associate(options, args)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
155
189
|
command :merchant do |c|
|
156
190
|
c.syntax = 'fastlane produce merchant'
|
157
191
|
c.description = 'Ensure that a specific Merchant exists'
|
@@ -18,7 +18,7 @@ module Produce
|
|
18
18
|
def create_new_app
|
19
19
|
application = fetch_application
|
20
20
|
if application
|
21
|
-
UI.success("
|
21
|
+
UI.success("App '#{Produce.config[:app_identifier]}' already exists (#{application.apple_id}), nothing to do on App Store Connect")
|
22
22
|
# Nothing to do here
|
23
23
|
else
|
24
24
|
UI.success("Creating new app '#{Produce.config[:app_name]}' on App Store Connect")
|
@@ -50,8 +50,6 @@ module Snapshot
|
|
50
50
|
path = Snapshot::Helper.fastlane_enabled? ? FastlaneCore::FastlaneFolder.path : '.'
|
51
51
|
is_swift_fastfile = args.include?("swift")
|
52
52
|
Snapshot::Setup.create(path, is_swift_fastfile: is_swift_fastfile)
|
53
|
-
# We do this outside of `Setup`, as it shouldn't be part of `fastlane init`
|
54
|
-
puts("More information: https://docs.fastlane.tools/getting-started/ios/screenshots/".green)
|
55
53
|
end
|
56
54
|
end
|
57
55
|
|