fastlane 2.102.0 → 2.103.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -74
  3. data/credentials_manager/lib/credentials_manager/account_manager.rb +9 -4
  4. data/deliver/lib/assets/DeliverfileDefault.swift +10 -0
  5. data/deliver/lib/assets/summary.html.erb +3 -3
  6. data/deliver/lib/deliver/html_generator.rb +9 -0
  7. data/deliver/lib/deliver/options.rb +56 -35
  8. data/deliver/lib/deliver/setup.rb +1 -2
  9. data/deliver/lib/deliver/submit_for_review.rb +2 -2
  10. data/deliver/lib/deliver/upload_metadata.rb +1 -1
  11. data/fastlane/lib/fastlane/action.rb +1 -0
  12. data/fastlane/lib/fastlane/actions/actions_helper.rb +11 -1
  13. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  14. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +11 -3
  15. data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/create_app_online.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +15 -1
  18. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +21 -0
  19. data/fastlane/lib/fastlane/actions/download_dsyms.rb +1 -1
  20. data/fastlane/lib/fastlane/actions/gradle.rb +4 -0
  21. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  22. data/fastlane/lib/fastlane/actions/set_changelog.rb +1 -1
  23. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +2 -0
  24. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
  25. data/fastlane/lib/fastlane/setup/setup_ios.rb +7 -5
  26. data/fastlane/lib/fastlane/version.rb +1 -1
  27. data/fastlane/swift/Deliverfile.swift +1 -1
  28. data/fastlane/swift/DeliverfileProtocol.swift +13 -13
  29. data/fastlane/swift/Fastlane.swift +45 -43
  30. data/fastlane/swift/Gymfile.swift +1 -1
  31. data/fastlane/swift/Matchfile.swift +1 -1
  32. data/fastlane/swift/Precheckfile.swift +1 -1
  33. data/fastlane/swift/Scanfile.swift +1 -1
  34. data/fastlane/swift/Screengrabfile.swift +1 -1
  35. data/fastlane/swift/Snapshotfile.swift +1 -1
  36. data/fastlane_core/lib/fastlane_core/command_executor.rb +9 -14
  37. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +12 -3
  38. data/fastlane_core/lib/fastlane_core/helper.rb +22 -10
  39. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +1 -1
  40. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +22 -15
  41. data/pilot/lib/pilot/build_manager.rb +1 -1
  42. data/pilot/lib/pilot/tester_importer.rb +2 -2
  43. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +3 -3
  44. data/produce/lib/produce/cloud_container.rb +82 -0
  45. data/produce/lib/produce/commands_generator.rb +34 -0
  46. data/produce/lib/produce/itunes_connect.rb +1 -1
  47. data/snapshot/lib/snapshot/commands_generator.rb +0 -2
  48. data/snapshot/lib/snapshot/reports_generator.rb +8 -3
  49. data/snapshot/lib/snapshot/runner.rb +9 -0
  50. data/spaceship/README.md +2 -2
  51. data/spaceship/lib/spaceship/client.rb +6 -2
  52. data/spaceship/lib/spaceship/errors.rb +3 -0
  53. data/spaceship/lib/spaceship/portal/app.rb +22 -1
  54. data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
  55. data/spaceship/lib/spaceship/portal/portal.rb +1 -0
  56. data/spaceship/lib/spaceship/portal/portal_client.rb +45 -4
  57. data/spaceship/lib/spaceship/portal/spaceship.rb +9 -0
  58. data/spaceship/lib/spaceship/test_flight/client.rb +1 -1
  59. data/spaceship/lib/spaceship/tunes/app_ratings.rb +2 -2
  60. data/spaceship/lib/spaceship/tunes/app_submission.rb +9 -3
  61. data/spaceship/lib/spaceship/tunes/app_version.rb +1 -1
  62. data/spaceship/lib/spaceship/tunes/application.rb +4 -4
  63. data/spaceship/lib/spaceship/tunes/tunes_client.rb +13 -2
  64. data/supply/lib/supply/client.rb +0 -1
  65. metadata +22 -20
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.102.0
21
+ // Generated with fastlane 2.103.0
@@ -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
- begin
53
- command_stdout.each do |l|
54
- line = l.strip # strip so that \n gets removed
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
- next unless print_all
56
+ next unless print_all
58
57
 
59
- # Prefix the current line with a string
60
- prefix.each do |element|
61
- line = element[:prefix] + line if element[:block] && element[:block].call(line)
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
- rescue Errno::EIO
67
- # This is expected on some linux systems, that indicates that the subcommand finished
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, &block)
6
+ def self.spawn(command)
7
7
  require 'pty'
8
8
  PTY.spawn(command) do |command_stdout, command_stdin, pid|
9
9
  begin
10
- block.call(command_stdout, command_stdin, pid)
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
- Process.wait(pid)
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
- return '' unless self.mac? # so tests work on Linux and Windows too
203
-
204
- [
205
- "../Applications/Application Loader.app/Contents/MacOS/itms",
206
- "../Applications/Application Loader.app/Contents/itms"
207
- ].each do |path|
208
- result = File.expand_path(File.join(self.xcode_path, path))
209
- return result if File.exist?(result)
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.hexdigest(File.read(ipa_path)),
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 '#{source}'",
162
+ "-f \"#{source}\"",
169
163
  ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"], # that's here, because the user might overwrite the -t option
170
- "-t 'Signiant'",
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
- unless password === /^[0-9a-zA-Z\.\$\_]*$/
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 (which must be single-quoted for the shell's benefit)
214
- "'" + password + "'"
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 better direct Java invocation strategy for those versions.
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("Application specific password you provided using #{TWO_FACTOR_ENV_VARIABLE}")
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. Please provide a changelog. You can also provide a changelog using the `changelog` option")
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
@@ -42,8 +42,8 @@ module Pilot
42
42
  begin
43
43
  tester_manager.add_tester(config)
44
44
  imported_tester_count += 1
45
- rescue
46
- # do nothing, move on to the next row
45
+ rescue => exception
46
+ UI.error("Error adding tester #{email}: #{exception}")
47
47
  end
48
48
  end
49
49
 
@@ -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(URI.encode(uri.to_s)) do |connection|
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("[iTC] App '#{Produce.config[:app_identifier]}' already exists (#{application.apple_id}), nothing to do on App Store Connect")
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