fastlane 2.196.0 → 2.212.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +88 -81
  4. data/cert/lib/cert/runner.rb +19 -8
  5. data/deliver/lib/assets/ScreenshotsHelp +29 -6
  6. data/deliver/lib/deliver/app_screenshot.rb +30 -4
  7. data/deliver/lib/deliver/app_screenshot_iterator.rb +1 -1
  8. data/deliver/lib/deliver/options.rb +6 -2
  9. data/deliver/lib/deliver/runner.rb +88 -24
  10. data/deliver/lib/deliver/submit_for_review.rb +25 -3
  11. data/deliver/lib/deliver/upload_price_tier.rb +3 -1
  12. data/deliver/lib/deliver/upload_screenshots.rb +2 -2
  13. data/fastlane/lib/assets/AppfileTemplate +1 -1
  14. data/fastlane/lib/assets/AppfileTemplate.swift +1 -1
  15. data/fastlane/lib/fastlane/actions/badge.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/danger.rb +14 -0
  18. data/fastlane/lib/fastlane/actions/docs/build_app.md +5 -5
  19. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +19 -2
  20. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -1
  21. data/fastlane/lib/fastlane/actions/docs/run_tests.md +1 -1
  22. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
  23. data/fastlane/lib/fastlane/actions/download_dsyms.rb +62 -46
  24. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +15 -4
  25. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -1
  26. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/get_version_number.rb +8 -3
  28. data/fastlane/lib/fastlane/actions/git_commit.rb +4 -6
  29. data/fastlane/lib/fastlane/actions/import_certificate.rb +1 -1
  30. data/fastlane/lib/fastlane/actions/notarize.rb +29 -11
  31. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +1 -1
  32. data/fastlane/lib/fastlane/actions/pod_push.rb +19 -1
  33. data/fastlane/lib/fastlane/actions/read_podspec.rb +1 -1
  34. data/fastlane/lib/fastlane/actions/run_tests.rb +19 -9
  35. data/fastlane/lib/fastlane/actions/set_github_release.rb +11 -5
  36. data/fastlane/lib/fastlane/actions/setup_ci.rb +13 -4
  37. data/fastlane/lib/fastlane/actions/trainer.rb +49 -0
  38. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +31 -4
  39. data/fastlane/lib/fastlane/actions/update_info_plist.rb +1 -1
  40. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +10 -1
  41. data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +1 -1
  42. data/fastlane/lib/fastlane/actions/verify_build.rb +1 -1
  43. data/fastlane/lib/fastlane/actions/xcode_install.rb +5 -1
  44. data/fastlane/lib/fastlane/actions/xcode_select.rb +1 -1
  45. data/fastlane/lib/fastlane/actions/xcodebuild.rb +8 -2
  46. data/fastlane/lib/fastlane/actions/xcodes.rb +152 -0
  47. data/fastlane/lib/fastlane/actions/xcov.rb +5 -0
  48. data/fastlane/lib/fastlane/actions/xcversion.rb +17 -7
  49. data/fastlane/lib/fastlane/cli_tools_distributor.rb +5 -0
  50. data/fastlane/lib/fastlane/commands_generator.rb +2 -1
  51. data/fastlane/lib/fastlane/documentation/docs_generator.rb +17 -12
  52. data/fastlane/lib/fastlane/fast_file.rb +18 -5
  53. data/fastlane/lib/fastlane/features.rb +3 -0
  54. data/fastlane/lib/fastlane/helper/xcodebuild_formatter_helper.rb +9 -0
  55. data/fastlane/lib/fastlane/helper/xcodes_helper.rb +28 -0
  56. data/fastlane/lib/fastlane/helper/xcversion_helper.rb +0 -9
  57. data/fastlane/lib/fastlane/lane_manager.rb +1 -1
  58. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  59. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +5 -1
  60. data/fastlane/lib/fastlane/setup/setup_ios.rb +1 -1
  61. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +1 -1
  62. data/fastlane/lib/fastlane/swift_lane_manager.rb +11 -3
  63. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +54 -1
  64. data/fastlane/lib/fastlane/tools.rb +18 -1
  65. data/fastlane/lib/fastlane/version.rb +1 -1
  66. data/fastlane/swift/Actions.swift +1 -1
  67. data/fastlane/swift/Appfile.swift +2 -2
  68. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  69. data/fastlane/swift/Atomic.swift +150 -0
  70. data/fastlane/swift/ControlCommand.swift +1 -1
  71. data/fastlane/swift/Deliverfile.swift +2 -2
  72. data/fastlane/swift/DeliverfileProtocol.swift +8 -4
  73. data/fastlane/swift/Fastlane.swift +570 -239
  74. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +30 -20
  75. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +1 -1
  76. data/fastlane/swift/Gymfile.swift +2 -2
  77. data/fastlane/swift/GymfileProtocol.swift +20 -8
  78. data/fastlane/swift/LaneFileProtocol.swift +2 -2
  79. data/fastlane/swift/MainProcess.swift +3 -3
  80. data/fastlane/swift/Matchfile.swift +2 -2
  81. data/fastlane/swift/MatchfileProtocol.swift +21 -5
  82. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  83. data/fastlane/swift/Plugins.swift +1 -1
  84. data/fastlane/swift/Precheckfile.swift +2 -2
  85. data/fastlane/swift/PrecheckfileProtocol.swift +3 -3
  86. data/fastlane/swift/RubyCommand.swift +1 -1
  87. data/fastlane/swift/RubyCommandable.swift +1 -1
  88. data/fastlane/swift/Runner.swift +13 -9
  89. data/fastlane/swift/RunnerArgument.swift +1 -1
  90. data/fastlane/swift/Scanfile.swift +2 -2
  91. data/fastlane/swift/ScanfileProtocol.swift +31 -11
  92. data/fastlane/swift/Screengrabfile.swift +2 -2
  93. data/fastlane/swift/ScreengrabfileProtocol.swift +3 -3
  94. data/fastlane/swift/Snapshotfile.swift +2 -2
  95. data/fastlane/swift/SnapshotfileProtocol.swift +12 -8
  96. data/fastlane/swift/SocketClient.swift +9 -5
  97. data/fastlane/swift/SocketClientDelegateProtocol.swift +2 -2
  98. data/fastlane/swift/SocketResponse.swift +1 -1
  99. data/fastlane/swift/formatting/Brewfile.lock.json +46 -23
  100. data/fastlane/swift/main.swift +1 -1
  101. data/fastlane/swift/upgrade_manifest.json +1 -1
  102. data/fastlane_core/README.md +1 -0
  103. data/fastlane_core/lib/fastlane_core/cert_checker.rb +79 -17
  104. data/fastlane_core/lib/fastlane_core/device_manager.rb +5 -1
  105. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +10 -5
  106. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +409 -26
  107. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +1 -0
  108. data/fastlane_core/lib/fastlane_core/project.rb +19 -2
  109. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +7 -0
  110. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +4 -2
  111. data/frameit/lib/frameit/device.rb +1 -1
  112. data/frameit/lib/frameit/device_types.rb +9 -0
  113. data/frameit/lib/frameit/editor.rb +16 -18
  114. data/frameit/lib/frameit/frame_downloader.rb +1 -1
  115. data/frameit/lib/frameit/trim_box.rb +6 -0
  116. data/gym/lib/gym/generators/build_command_generator.rb +70 -23
  117. data/gym/lib/gym/options.rb +30 -5
  118. data/match/lib/match/change_password.rb +2 -0
  119. data/match/lib/match/commands_generator.rb +2 -1
  120. data/match/lib/match/encryption/openssl.rb +1 -1
  121. data/match/lib/match/encryption.rb +3 -0
  122. data/match/lib/match/generator.rb +1 -0
  123. data/match/lib/match/importer.rb +10 -1
  124. data/match/lib/match/migrate.rb +4 -3
  125. data/match/lib/match/module.rb +54 -2
  126. data/match/lib/match/nuke.rb +114 -47
  127. data/match/lib/match/options.rb +22 -1
  128. data/match/lib/match/runner.rb +25 -6
  129. data/match/lib/match/setup.rb +1 -1
  130. data/match/lib/match/spaceship_ensure.rb +5 -2
  131. data/match/lib/match/storage/gitlab/client.rb +102 -0
  132. data/match/lib/match/storage/gitlab/secure_file.rb +65 -0
  133. data/match/lib/match/storage/gitlab_secure_files.rb +182 -0
  134. data/match/lib/match/storage/google_cloud_storage.rb +7 -6
  135. data/match/lib/match/storage/s3_storage.rb +3 -3
  136. data/match/lib/match/storage.rb +4 -0
  137. data/match/lib/match/table_printer.rb +2 -1
  138. data/match/lib/match/utils.rb +15 -2
  139. data/pem/lib/pem/manager.rb +30 -7
  140. data/pem/lib/pem/options.rb +9 -0
  141. data/pilot/lib/pilot/build_manager.rb +34 -14
  142. data/pilot/lib/pilot/options.rb +6 -1
  143. data/scan/lib/scan/detect_values.rb +6 -0
  144. data/scan/lib/scan/error_handler.rb +9 -0
  145. data/scan/lib/scan/options.rb +49 -9
  146. data/scan/lib/scan/runner.rb +171 -25
  147. data/scan/lib/scan/test_command_generator.rb +65 -5
  148. data/sigh/lib/sigh/download_all.rb +14 -2
  149. data/sigh/lib/sigh/module.rb +3 -1
  150. data/sigh/lib/sigh/options.rb +5 -0
  151. data/sigh/lib/sigh/runner.rb +12 -2
  152. data/snapshot/lib/assets/SnapshotHelper.swift +3 -3
  153. data/snapshot/lib/snapshot/latest_os_version.rb +2 -5
  154. data/snapshot/lib/snapshot/options.rb +24 -8
  155. data/snapshot/lib/snapshot/reports_generator.rb +1 -0
  156. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +10 -3
  157. data/snapshot/lib/snapshot/test_command_generator.rb +37 -2
  158. data/spaceship/lib/spaceship/client.rb +71 -40
  159. data/spaceship/lib/spaceship/commands_generator.rb +1 -1
  160. data/spaceship/lib/spaceship/connect_api/api_client.rb +10 -5
  161. data/spaceship/lib/spaceship/connect_api/models/actor.rb +26 -0
  162. data/spaceship/lib/spaceship/connect_api/models/app.rb +52 -6
  163. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +1 -0
  164. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +5 -0
  165. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -0
  166. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -1
  167. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +27 -10
  168. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -2
  169. data/spaceship/lib/spaceship/connect_api/models/build_bundle.rb +68 -0
  170. data/spaceship/lib/spaceship/connect_api/models/build_bundle_file_sizes.rb +34 -0
  171. data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +2 -1
  172. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +4 -0
  173. data/spaceship/lib/spaceship/connect_api/models/device.rb +47 -4
  174. data/spaceship/lib/spaceship/connect_api/models/profile.rb +4 -0
  175. data/spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb +29 -0
  176. data/spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb +67 -0
  177. data/spaceship/lib/spaceship/connect_api/models/review_rejection.rb +19 -0
  178. data/spaceship/lib/spaceship/connect_api/models/review_submission.rb +86 -0
  179. data/spaceship/lib/spaceship/connect_api/models/review_submission_item.rb +40 -0
  180. data/spaceship/lib/spaceship/connect_api/models/user.rb +5 -0
  181. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +19 -0
  182. data/spaceship/lib/spaceship/connect_api/response.rb +23 -6
  183. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +33 -2
  184. data/spaceship/lib/spaceship/connect_api/token.rb +5 -2
  185. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +124 -8
  186. data/spaceship/lib/spaceship/connect_api.rb +9 -0
  187. data/spaceship/lib/spaceship/errors.rb +34 -0
  188. data/spaceship/lib/spaceship/globals.rb +9 -0
  189. data/spaceship/lib/spaceship/hashcash.rb +52 -0
  190. data/spaceship/lib/spaceship/portal/certificate.rb +4 -3
  191. data/spaceship/lib/spaceship/spaceauth_runner.rb +1 -1
  192. data/spaceship/lib/spaceship/tunes/app_ratings.rb +6 -6
  193. data/spaceship/lib/spaceship/tunes/iap_families.rb +1 -1
  194. data/spaceship/lib/spaceship/tunes/tunes.rb +0 -1
  195. data/spaceship/lib/spaceship/tunes/tunes_client.rb +79 -21
  196. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +11 -3
  197. data/spaceship/lib/spaceship.rb +1 -0
  198. data/supply/lib/supply/client.rb +2 -7
  199. data/supply/lib/supply/options.rb +8 -0
  200. data/supply/lib/supply/uploader.rb +6 -2
  201. data/trainer/lib/assets/junit.xml.erb +28 -0
  202. data/trainer/lib/trainer/commands_generator.rb +51 -0
  203. data/trainer/lib/trainer/junit_generator.rb +31 -0
  204. data/trainer/lib/trainer/module.rb +10 -0
  205. data/trainer/lib/trainer/options.rb +66 -0
  206. data/trainer/lib/trainer/test_parser.rb +398 -0
  207. data/trainer/lib/trainer/xcresult.rb +403 -0
  208. data/trainer/lib/trainer.rb +7 -0
  209. metadata +49 -24
  210. data/spaceship/lib/spaceship/connect_api/testflight/.testflight.rb.swp +0 -0
  211. data/spaceship/lib/spaceship/tunes/user_detail.rb +0 -15
@@ -0,0 +1,49 @@
1
+ module Fastlane
2
+ module Actions
3
+ class TrainerAction < Action
4
+ def self.run(params)
5
+ require "trainer"
6
+
7
+ params[:path] = Actions.lane_context[Actions::SharedValues::SCAN_GENERATED_PLIST_FILE] if Actions.lane_context[Actions::SharedValues::SCAN_GENERATED_PLIST_FILE]
8
+ params[:path] ||= Actions.lane_context[Actions::SharedValues::SCAN_DERIVED_DATA_PATH] if Actions.lane_context[Actions::SharedValues::SCAN_DERIVED_DATA_PATH]
9
+
10
+ fail_build = params[:fail_build]
11
+ resulting_paths = Trainer::TestParser.auto_convert(params)
12
+ resulting_paths.each do |path, test_results|
13
+ UI.test_failure!("Unit tests failed") if fail_build && !test_results[:successful]
14
+ end
15
+
16
+ return resulting_paths
17
+ end
18
+
19
+ def self.description
20
+ "Convert the Xcode plist log to a JUnit report"
21
+ end
22
+
23
+ def self.detail
24
+ "Convert the Xcode plist log to a JUnit report. This will raise an exception if the tests failed"
25
+ end
26
+
27
+ def self.authors
28
+ ["KrauseFx"]
29
+ end
30
+
31
+ def self.return_value
32
+ "A hash with the key being the path of the generated file, the value being if the tests were successful"
33
+ end
34
+
35
+ def self.available_options
36
+ require 'trainer'
37
+ FastlaneCore::CommanderGenerator.new.generate(Trainer::Options.available_options)
38
+ end
39
+
40
+ def self.is_supported?(platform)
41
+ %i[ios mac].include?(platform)
42
+ end
43
+
44
+ def self.category
45
+ :testing
46
+ end
47
+ end
48
+ end
49
+ end
@@ -36,20 +36,28 @@ module Fastlane
36
36
  end
37
37
 
38
38
  style_value = params[:use_automatic_signing] ? 'Automatic' : 'Manual'
39
+ development_team_setting = params[:sdk] ? "DEVELOPMENT_TEAM[sdk=#{params[:sdk]}]" : "DEVELOPMENT_TEAM"
40
+ code_sign_identity_setting = params[:sdk] ? "CODE_SIGN_IDENTITY[sdk=#{params[:sdk]}]" : "CODE_SIGN_IDENTITY"
41
+ provisioning_profile_setting = params[:sdk] ? "PROVISIONING_PROFILE_SPECIFIER[sdk=#{params[:sdk]}]" : "PROVISIONING_PROFILE_SPECIFIER"
42
+
39
43
  set_build_setting(config, "CODE_SIGN_STYLE", style_value)
40
44
 
41
45
  if params[:team_id]
42
- set_build_setting(config, "DEVELOPMENT_TEAM", params[:team_id])
46
+ set_build_setting(config, development_team_setting, params[:team_id])
43
47
  UI.important("Set Team id to: #{params[:team_id]} for target: #{target.name} for build configuration: #{config.name}")
44
48
  end
45
49
  if params[:code_sign_identity]
46
- set_build_setting(config, "CODE_SIGN_IDENTITY", params[:code_sign_identity])
50
+ set_build_setting(config, code_sign_identity_setting, params[:code_sign_identity])
47
51
  UI.important("Set Code Sign identity to: #{params[:code_sign_identity]} for target: #{target.name} for build configuration: #{config.name}")
48
52
  end
49
53
  if params[:profile_name]
50
- set_build_setting(config, "PROVISIONING_PROFILE_SPECIFIER", params[:profile_name])
54
+ set_build_setting(config, provisioning_profile_setting, params[:profile_name])
51
55
  UI.important("Set Provisioning Profile name to: #{params[:profile_name]} for target: #{target.name} for build configuration: #{config.name}")
52
56
  end
57
+ if params[:entitlements_file_path]
58
+ set_build_setting(config, "CODE_SIGN_ENTITLEMENTS", params[:entitlements_file_path])
59
+ UI.important("Set Entitlements file path to: #{params[:entitlements_file_path]} for target: #{target.name} for build configuration: #{config.name}")
60
+ end
53
61
  # Since Xcode 8, this is no longer needed, you simply use PROVISIONING_PROFILE_SPECIFIER
54
62
  if params[:profile_uuid]
55
63
  set_build_setting(config, "PROVISIONING_PROFILE", params[:profile_uuid])
@@ -125,6 +133,10 @@ module Fastlane
125
133
  description: "Defines if project should use automatic signing",
126
134
  type: Boolean,
127
135
  default_value: false),
136
+ FastlaneCore::ConfigItem.new(key: :sdk,
137
+ env_name: "FASTLANE_BUILD_SDK",
138
+ optional: true,
139
+ description: "Build target SDKs (iphoneos*, macosx*, iphonesimulator*)"),
128
140
  FastlaneCore::ConfigItem.new(key: :team_id,
129
141
  env_name: "FASTLANE_TEAM_ID",
130
142
  optional: true,
@@ -143,6 +155,10 @@ module Fastlane
143
155
  env_name: "FL_CODE_SIGN_IDENTITY",
144
156
  description: "Code signing identity type (iPhone Developer, iPhone Distribution)",
145
157
  optional: true),
158
+ FastlaneCore::ConfigItem.new(key: :entitlements_file_path,
159
+ env_name: "FL_CODE_SIGN_ENTITLEMENTS_FILE_PATH",
160
+ description: "Path to your entitlements file",
161
+ optional: true),
146
162
  FastlaneCore::ConfigItem.new(key: :profile_name,
147
163
  env_name: "FL_PROVISIONING_PROFILE_SPECIFIER",
148
164
  description: "Provisioning profile name to use for code signing",
@@ -172,6 +188,17 @@ module Fastlane
172
188
  update_code_signing_settings(
173
189
  use_automatic_signing: true,
174
190
  path: "demo-project/demo/demo.xcodeproj"
191
+ )',
192
+ ' # more advanced manual code signing
193
+ update_code_signing_settings(
194
+ use_automatic_signing: false,
195
+ path: "demo-project/demo/demo.xcodeproj",
196
+ team_id: "QABC123DEV",
197
+ bundle_identifier: "com.demoapp.QABC123DEV",
198
+ code_sign_identity: "iPhone Distribution",
199
+ sdk: "iphoneos*",
200
+ profile_name: "Demo App Deployment Profile",
201
+ entitlements_file_path: "Demo App/generated/New.entitlements"
175
202
  )'
176
203
  ]
177
204
  end
@@ -185,7 +212,7 @@ module Fastlane
185
212
  end
186
213
 
187
214
  def self.authors
188
- ["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55"]
215
+ ["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55", "abcdev"]
189
216
  end
190
217
 
191
218
  def self.is_supported?(platform)
@@ -80,7 +80,7 @@ module Fastlane
80
80
  description: "Path to info plist",
81
81
  optional: true,
82
82
  verify_block: proc do |value|
83
- UI.user_error!("Invalid plist file") unless value[-6..-1].casecmp(".plist").zero?
83
+ UI.user_error!("Invalid plist file") unless value.downcase.end_with?(".plist")
84
84
  end),
85
85
  FastlaneCore::ConfigItem.new(key: :scheme,
86
86
  env_name: "FL_UPDATE_PLIST_APP_SCHEME",
@@ -19,7 +19,7 @@ module Fastlane
19
19
  UI.user_error!("Could not find path to project config '#{project_file_path}'. Pass the path to your project (not workspace)!") unless File.exist?(project_file_path)
20
20
 
21
21
  # download certificate
22
- unless File.exist?(params[:certificate])
22
+ unless File.exist?(params[:certificate]) && File.size(params[:certificate]) > 0
23
23
  UI.message("Downloading root certificate from (#{ROOT_CERTIFICATE_URL}) to path '#{params[:certificate]}'")
24
24
  File.open(params[:certificate], "w:ASCII-8BIT") do |file|
25
25
  file.write(FastlaneCore::Helper.open_uri(ROOT_CERTIFICATE_URL, "rb").read)
@@ -34,7 +34,9 @@ module Fastlane
34
34
  UI.user_error!("Could not find valid certificate at '#{params[:certificate]}'") unless File.size(params[:certificate]) > 0
35
35
  cert = OpenSSL::X509::Certificate.new(File.read(params[:certificate]))
36
36
  store.add_cert(cert)
37
+
37
38
  p7.verify([cert], store)
39
+ check_verify!(p7)
38
40
  data = Plist.parse_xml(p7.data)
39
41
 
40
42
  target_filter = params[:target_filter] || params[:build_configuration_filter]
@@ -81,6 +83,13 @@ module Fastlane
81
83
  UI.success("Successfully updated project settings in '#{folder}'")
82
84
  end
83
85
 
86
+ def self.check_verify!(p7)
87
+ failed_to_verify = (p7.data.nil? || p7.data == "") && !(p7.error_string || "").empty?
88
+ if failed_to_verify
89
+ UI.crash!("Profile could not be verified with error: '#{p7.error_string}'. Try regenerating provisioning profile.")
90
+ end
91
+ end
92
+
84
93
  def self.description
85
94
  "Update projects code signing settings from your provisioning profile"
86
95
  end
@@ -48,7 +48,7 @@ module Fastlane
48
48
  upload_dsym(resource, dsym)
49
49
  end
50
50
 
51
- # Return uplaoded dSYM paths
51
+ # Return uploaded dSYM paths
52
52
  uploaded_paths
53
53
  end
54
54
 
@@ -101,7 +101,7 @@ module Fastlane
101
101
  UI.user_error!("Mismatched team_identifier. Required: '#{params[:team_identifier]}'; Found: '#{values['team_identifier']}'") unless params[:team_identifier] == values['team_identifier']
102
102
  end
103
103
  if params[:team_name]
104
- UI.user_error!("Mismatched team_name. Required: '#{params[:team_name]}'; Found: 'values['team_name']'") unless params[:team_name] == values['team_name']
104
+ UI.user_error!("Mismatched team_name. Required: '#{params[:team_name]}'; Found: '#{values['team_name']}'") unless params[:team_name] == values['team_name']
105
105
  end
106
106
  if params[:app_name]
107
107
  UI.user_error!("Mismatched app_name. Required: '#{params[:app_name]}'; Found: '#{values['app_name']}'") unless params[:app_name] == values['app_name']
@@ -101,7 +101,11 @@ module Fastlane
101
101
  end
102
102
 
103
103
  def self.category
104
- :building
104
+ :deprecated
105
+ end
106
+
107
+ def self.deprecated_notes
108
+ "The xcode-install gem, which this action depends on, has been sunset. Please migrate to [xcodes](https://docs.fastlane.tools/actions/xcodes). You can find a migration guide here: [xcpretty/xcode-install/MIGRATION.md](https://github.com/xcpretty/xcode-install/blob/master/MIGRATION.md)"
105
109
  end
106
110
  end
107
111
  end
@@ -40,7 +40,7 @@ module Fastlane
40
40
  def self.details
41
41
  [
42
42
  "Select and build with the Xcode installed at the provided path.",
43
- "Use the `xcversion` action if you want to select an Xcode:",
43
+ "Use the `xcodes` action if you want to select an Xcode:",
44
44
  "- Based on a version specifier or",
45
45
  "- You don't have known, stable paths, as may happen in a CI environment."
46
46
  ].join("\n")
@@ -267,10 +267,11 @@ module Fastlane
267
267
 
268
268
  output_result = ""
269
269
 
270
+ override_architecture_prefix = params[:xcodebuild_architecture] ? "arch -#{params[:xcodebuild_architecture]} " : ""
270
271
  # In some cases the simulator is not booting up in time
271
272
  # One way to solve it is to try to rerun it for one more time
272
273
  begin
273
- output_result = Actions.sh "set -o pipefail && xcodebuild #{xcodebuild_args} #{pipe_command}"
274
+ output_result = Actions.sh "set -o pipefail && #{override_architecture_prefix}xcodebuild #{xcodebuild_args} #{pipe_command}"
274
275
  rescue => ex
275
276
  exit_status = $?.exitstatus
276
277
 
@@ -383,8 +384,9 @@ module Fastlane
383
384
  ['scheme', 'The scheme to build'],
384
385
  ['build_settings', 'Hash of additional build information'],
385
386
  ['xcargs', 'Pass additional xcodebuild options'],
386
- ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
387
387
  ['buildlog_path', 'The path where the xcodebuild.log will be created, by default it is created in ~/Library/Logs/fastlane/xcbuild'],
388
+ ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
389
+ ['xcodebuild_architecture', 'Allows to set the architecture that `xcodebuild` is run with, for example to force it to run under Rosetta on an Apple Silicon mac'],
388
390
  ['raw_buildlog', 'Set to true to see xcodebuild raw output. Default value is false'],
389
391
  ['xcpretty_output', 'specifies the output type for xcpretty. eg. \'test\', or \'simple\''],
390
392
  ['xcpretty_utf', 'Specifies xcpretty should use utf8 when reporting builds. This has no effect when raw_buildlog is specified.']
@@ -437,6 +439,7 @@ module Fastlane
437
439
  ['build_settings', 'Hash of additional build information'],
438
440
  ['xcargs', 'Pass additional xcodebuild options'],
439
441
  ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
442
+ ['xcodebuild_architecture', 'Allows to set the architecture that `xcodebuild` is run with, for example to force it to run under Rosetta on an Apple Silicon mac'],
440
443
  ['buildlog_path', 'The path where the xcodebuild.log will be created, by default it is created in ~/Library/Logs/fastlane/xcbuild'],
441
444
  ['raw_buildlog', 'Set to true to see xcodebuild raw output. Default value is false'],
442
445
  ['xcpretty_output', 'specifies the output type for xcpretty. eg. \'test\', or \'simple\''],
@@ -529,6 +532,7 @@ module Fastlane
529
532
  ['build_settings', 'Hash of additional build information'],
530
533
  ['xcargs', 'Pass additional xcodebuild options'],
531
534
  ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
535
+ ['xcodebuild_architecture', 'Allows to set the architecture that `xcodebuild` is run with, for example to force it to run under Rosetta on an Apple Silicon mac'],
532
536
  ['buildlog_path', 'The path where the xcodebuild.log will be created, by default it is created in ~/Library/Logs/fastlane/xcbuild'],
533
537
  ['raw_buildlog', 'Set to true to see xcodebuild raw output. Default value is false'],
534
538
  ['xcpretty_output', 'specifies the output type for xcpretty. eg. \'test\', or \'simple\''],
@@ -571,6 +575,7 @@ module Fastlane
571
575
  ['build_settings', 'Hash of additional build information'],
572
576
  ['xcargs', 'Pass additional xcodebuild options'],
573
577
  ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
578
+ ['xcodebuild_architecture', 'Allows to set the architecture that `xcodebuild` is run with, for example to force it to run under Rosetta on an Apple Silicon mac'],
574
579
  ['buildlog_path', 'The path where the xcodebuild.log will be created, by default it is created in ~/Library/Logs/fastlane/xcbuild'],
575
580
  ['raw_buildlog', 'Set to true to see xcodebuild raw output. Default value is false'],
576
581
  ['xcpretty_output', 'specifies the output type for xcpretty. eg. \'test\', or \'simple\''],
@@ -621,6 +626,7 @@ module Fastlane
621
626
  ['destination_timeout', 'The timeout for connecting to the simulator, in seconds'],
622
627
  ['enable_code_coverage', 'Turn code coverage on or off when testing. eg. true|false. Requires Xcode 7+'],
623
628
  ['output_style', 'Set the output format to one of: :standard (Colored UTF8 output, default), :basic (black & white ASCII output)'],
629
+ ['xcodebuild_architecture', 'Allows to set the architecture that `xcodebuild` is run with, for example to force it to run under Rosetta on an Apple Silicon mac'],
624
630
  ['buildlog_path', 'The path where the xcodebuild.log will be created, by default it is created in ~/Library/Logs/fastlane/xcbuild'],
625
631
  ['raw_buildlog', 'Set to true to see xcodebuild raw output. Default value is false'],
626
632
  ['xcpretty_output', 'specifies the output type for xcpretty. eg. \'test\', or \'simple\''],
@@ -0,0 +1,152 @@
1
+ module Fastlane
2
+ module Actions
3
+ module SharedValues
4
+ XCODES_XCODE_PATH = :XCODES_XCODE_PATH
5
+ end
6
+
7
+ class XcodesAction < Action
8
+ def self.run(params)
9
+ binary = params[:binary_path]
10
+ xcodes_raw_version = Actions.sh("#{binary} version", log: false)
11
+ xcodes_version = Gem::Version.new(xcodes_raw_version)
12
+ UI.message("Running xcodes version #{xcodes_version}")
13
+ if xcodes_version < Gem::Version.new("1.1.0")
14
+ UI.user_error!([
15
+ "xcodes action requires the minimum version of xcodes binary to be v1.1.0.",
16
+ "Please update xcodes. If you installed it via Homebrew, this can be done via 'brew upgrade xcodes'"
17
+ ].join(" "))
18
+ end
19
+
20
+ version = params[:version]
21
+ command = []
22
+ command << binary
23
+
24
+ if (xcodes_args = params[:xcodes_args])
25
+ command << xcodes_args
26
+ Actions.sh(command.join(" "))
27
+ elsif !params[:select_for_current_build_only]
28
+ command << "install"
29
+ command << "'#{version}'"
30
+ command << "--update" if params[:update_list]
31
+ command << "--select"
32
+ Actions.sh(command.join(" "))
33
+ end
34
+
35
+ command = []
36
+ command << binary
37
+ command << "installed"
38
+ command << "'#{version}'"
39
+
40
+ # `installed <version>` will either return the path to the given
41
+ # version or fail because the version can't be found.
42
+ #
43
+ # Store the path if we get one, fail the action otherwise.
44
+ xcode_path = Actions.sh(command.join(" ")) do |status, result, sh_command|
45
+ formatted_result = result.chomp
46
+
47
+ unless status.success?
48
+ UI.user_error!("Command `#{sh_command}` failed with status #{status.exitstatus} and message: #{formatted_result}")
49
+ end
50
+
51
+ formatted_result
52
+ end
53
+
54
+ # If the command succeeded, `xcode_path` will be something like:
55
+ # /Applications/Xcode-14.app
56
+ xcode_developer_path = File.join(xcode_path, "/Contents/Developer")
57
+
58
+ UI.message("Setting Xcode version '#{version}' at '#{xcode_path}' for all build steps")
59
+ ENV["DEVELOPER_DIR"] = xcode_developer_path
60
+ Actions.lane_context[SharedValues::XCODES_XCODE_PATH] = xcode_developer_path
61
+ return xcode_path
62
+ end
63
+
64
+ #####################################################
65
+ # @!group Documentation
66
+ #####################################################
67
+
68
+ def self.description
69
+ "Make sure a certain version of Xcode is installed, installing it only if needed"
70
+ end
71
+
72
+ def self.details
73
+ [
74
+ "Makes sure a specific version of Xcode is installed. If that's not the case, it will automatically be downloaded by [xcodes](https://github.com/RobotsAndPencils/xcodes).",
75
+ "This will make sure to use the correct Xcode version for later actions.",
76
+ "Note that this action depends on [xcodes](https://github.com/RobotsAndPencils/xcodes) CLI, so make sure you have it installed in your environment. For the installation guide, see: https://github.com/RobotsAndPencils/xcodes#installation"
77
+ ].join("\n")
78
+ end
79
+
80
+ def self.available_options
81
+ [
82
+ FastlaneCore::ConfigItem.new(key: :version,
83
+ env_name: "FL_XCODE_VERSION",
84
+ description: "The version number of the version of Xcode to install. Defaults to the value specified in the .xcode-version file",
85
+ default_value: Helper::XcodesHelper.read_xcode_version_file,
86
+ default_value_dynamic: true,
87
+ verify_block: Helper::XcodesHelper::Verify.method(:requirement)),
88
+ FastlaneCore::ConfigItem.new(key: :update_list,
89
+ env_name: "FL_XCODES_UPDATE_LIST",
90
+ description: "Whether the list of available Xcode versions should be updated before running the install command",
91
+ type: Boolean,
92
+ default_value: true),
93
+ FastlaneCore::ConfigItem.new(key: :select_for_current_build_only,
94
+ env_name: "FL_XCODES_SELECT_FOR_CURRENT_BUILD_ONLY",
95
+ description: [
96
+ "When true, it won't attempt to install an Xcode version, just find the installed Xcode version that best matches the passed version argument, and select it for the current build steps.",
97
+ "It doesn't change the global Xcode version (e.g. via 'xcrun xcode-select'), which would require sudo permissions — when this option is true, this action doesn't require sudo permissions"
98
+ ].join(" "),
99
+ type: Boolean,
100
+ default_value: false),
101
+ FastlaneCore::ConfigItem.new(key: :binary_path,
102
+ env_name: "FL_XCODES_BINARY_PATH",
103
+ description: "Where the xcodes binary lives on your system (full path)",
104
+ default_value: Helper::XcodesHelper.find_xcodes_binary_path,
105
+ default_value_dynamic: true,
106
+ verify_block: proc do |value|
107
+ UI.user_error!("'xcodes' doesn't seem to be installed. Please follow the installation guide at https://github.com/RobotsAndPencils/xcodes#installation before proceeding") if value.empty?
108
+ UI.user_error!("Couldn't find xcodes binary at path '#{value}'") unless File.exist?(value)
109
+ end),
110
+ FastlaneCore::ConfigItem.new(key: :xcodes_args,
111
+ env_name: "FL_XCODES_ARGS",
112
+ description: "Pass in xcodes command line arguments directly. When present, other parameters are ignored and only this parameter is used to build the command to be executed",
113
+ type: :shell_string,
114
+ optional: true)
115
+ ]
116
+ end
117
+
118
+ def self.output
119
+ [
120
+ ['XCODES_XCODE_PATH', 'The path to the newly installed Xcode version']
121
+ ]
122
+ end
123
+
124
+ def self.return_value
125
+ "The path to the newly installed Xcode version"
126
+ end
127
+
128
+ def self.return_type
129
+ :string
130
+ end
131
+
132
+ def self.authors
133
+ ["rogerluan"]
134
+ end
135
+
136
+ def self.is_supported?(platform)
137
+ [:ios, :mac].include?(platform)
138
+ end
139
+
140
+ def self.example_code
141
+ [
142
+ 'xcodes(version: "14.1")',
143
+ 'xcodes # When missing, the version value defaults to the value specified in the .xcode-version file'
144
+ ]
145
+ end
146
+
147
+ def self.category
148
+ :building
149
+ end
150
+ end
151
+ end
152
+ end
@@ -5,6 +5,11 @@ module Fastlane
5
5
  Actions.verify_gem!('xcov')
6
6
  require 'xcov'
7
7
 
8
+ if values[:xccov_file_direct_path].nil? && (path = Actions.lane_context[SharedValues::SCAN_GENERATED_XCRESULT_PATH])
9
+ UI.verbose("Pulling xcov 'xccov_file_direct_path' from SharedValues::SCAN_GENERATED_XCRESULT_PATH")
10
+ values[:xccov_file_direct_path] = path
11
+ end
12
+
8
13
  Xcov::Manager.new(values).run
9
14
  end
10
15
 
@@ -5,6 +5,7 @@ module Fastlane
5
5
  Actions.verify_gem!('xcode-install')
6
6
 
7
7
  version = params[:version]
8
+
8
9
  xcode = Helper::XcversionHelper.find_xcode(version)
9
10
  UI.user_error!("Cannot find an installed Xcode satisfying '#{version}'") if xcode.nil?
10
11
 
@@ -19,20 +20,24 @@ module Fastlane
19
20
  end
20
21
 
21
22
  def self.details
22
- "Finds and selects a version of an installed Xcode that best matches the provided [`Gem::Version` requirement specifier](http://www.rubydoc.info/github/rubygems/rubygems/Gem/Version)"
23
+ [
24
+ "Finds and selects a version of an installed Xcode that best matches the provided [`Gem::Version` requirement specifier](http://www.rubydoc.info/github/rubygems/rubygems/Gem/Version)",
25
+ "You can either manually provide a specific version using `version:` or you make use of the `.xcode-version` file."
26
+ ].join("\n")
23
27
  end
24
28
 
25
29
  def self.authors
26
- ["oysta"]
30
+ ["oysta", "rogerluan"]
27
31
  end
28
32
 
29
33
  def self.available_options
30
34
  [
31
35
  FastlaneCore::ConfigItem.new(key: :version,
32
36
  env_name: "FL_XCODE_VERSION",
33
- description: "The version of Xcode to select specified as a Gem::Version requirement string (e.g. '~> 7.1.0')",
34
- optional: false,
35
- verify_block: Helper::XcversionHelper::Verify.method(:requirement))
37
+ description: "The version of Xcode to select specified as a Gem::Version requirement string (e.g. '~> 7.1.0'). Defaults to the value specified in the .xcode-version file ",
38
+ default_value: Helper::XcodesHelper.read_xcode_version_file,
39
+ default_value_dynamic: true,
40
+ verify_block: Helper::XcodesHelper::Verify.method(:requirement))
36
41
  ]
37
42
  end
38
43
 
@@ -43,12 +48,17 @@ module Fastlane
43
48
  def self.example_code
44
49
  [
45
50
  'xcversion(version: "8.1") # Selects Xcode 8.1.0',
46
- 'xcversion(version: "~> 8.1.0") # Selects the latest installed version from the 8.1.x set'
51
+ 'xcversion(version: "~> 8.1.0") # Selects the latest installed version from the 8.1.x set',
52
+ 'xcversion # When missing, the version value defaults to the value specified in the .xcode-version file'
47
53
  ]
48
54
  end
49
55
 
50
56
  def self.category
51
- :building
57
+ :deprecated
58
+ end
59
+
60
+ def self.deprecated_notes
61
+ "The xcode-install gem, which this action depends on, has been sunset. Please migrate to [xcodes](https://docs.fastlane.tools/actions/xcodes). You can find a migration guide here: [xcpretty/xcode-install/MIGRATION.md](https://github.com/xcpretty/xcode-install/blob/master/MIGRATION.md)"
52
62
  end
53
63
  end
54
64
  end
@@ -78,6 +78,7 @@ module Fastlane
78
78
  tool_name = ARGV.first ? ARGV.first.downcase : nil
79
79
 
80
80
  tool_name = process_emojis(tool_name)
81
+ tool_name = map_aliased_tools(tool_name)
81
82
 
82
83
  if tool_name && Fastlane::TOOLS.include?(tool_name.to_sym) && !available_lanes.include?(tool_name.to_sym)
83
84
  # Triggering a specific tool
@@ -125,6 +126,10 @@ module Fastlane
125
126
  FastlaneCore::UpdateChecker.show_update_status('fastlane', Fastlane::VERSION)
126
127
  end
127
128
 
129
+ def map_aliased_tools(tool_name)
130
+ Fastlane::TOOL_ALIASES[tool_name&.to_sym] || tool_name
131
+ end
132
+
128
133
  # Since loading dotenv should respect additional environments passed using
129
134
  # --env, we must extract the arguments out of ARGV and process them before
130
135
  # calling into commander. This is required since the ENV must be configured
@@ -36,7 +36,8 @@ module Fastlane
36
36
  # do not use "include" as it may be some where in the commandline where "env" is required, therefore explicit index->0
37
37
  unless ARGV[0] == "env" || CLIToolsDistributor.running_version_command? || CLIToolsDistributor.running_help_command?
38
38
  # *after* loading the plugins
39
- Fastlane.plugin_manager.load_plugins
39
+ hide_plugins_table = FastlaneCore::Env.truthy?("FASTLANE_HIDE_PLUGINS_TABLE")
40
+ Fastlane.plugin_manager.load_plugins(print_table: !hide_plugins_table)
40
41
  Fastlane::PluginUpdateManager.start_looking_for_updates
41
42
  end
42
43
  self.new.run
@@ -4,21 +4,18 @@ module Fastlane
4
4
  output_path ||= File.join(FastlaneCore::FastlaneFolder.path || '.', 'README.md')
5
5
 
6
6
  output = ["fastlane documentation"]
7
- output << "================"
7
+ output << "----"
8
+ output << ""
8
9
 
9
10
  output << "# Installation"
10
11
  output << ""
11
12
  output << "Make sure you have the latest version of the Xcode command line tools installed:"
12
13
  output << ""
13
- output << "```"
14
+ output << "```sh"
14
15
  output << "xcode-select --install"
15
16
  output << "```"
16
17
  output << ""
17
- output << "Install _fastlane_ using"
18
- output << "```"
19
- output << "[sudo] gem install fastlane -NV"
20
- output << "```"
21
- output << "or alternatively using `brew install fastlane`"
18
+ output << "For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)"
22
19
  output << ""
23
20
  output << "# Available Actions"
24
21
 
@@ -32,7 +29,10 @@ module Fastlane
32
29
  next
33
30
  end
34
31
 
35
- output << "## #{formatted_platform(platform)}" if platform
32
+ if platform
33
+ output << ""
34
+ output << "## #{formatted_platform(platform)}"
35
+ end
36
36
 
37
37
  lanes.each do |lane_name, lane|
38
38
  next if lane.is_private
@@ -45,8 +45,10 @@ module Fastlane
45
45
  end
46
46
 
47
47
  output << "This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run."
48
- output << "More information about fastlane can be found on [fastlane.tools](https://fastlane.tools)."
49
- output << "The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools)."
48
+ output << ""
49
+ output << "More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools)."
50
+ output << ""
51
+ output << "The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools)."
50
52
  output << ""
51
53
 
52
54
  begin
@@ -78,10 +80,13 @@ module Fastlane
78
80
  full_name = [platform, lane].reject(&:nil?).join(' ')
79
81
 
80
82
  output = []
83
+ output << ""
81
84
  output << "### #{full_name}"
85
+ output << ""
86
+ output << "```sh"
87
+ output << "[bundle exec] fastlane #{full_name}"
82
88
  output << "```"
83
- output << "fastlane #{full_name}"
84
- output << "```"
89
+ output << ""
85
90
  output << description
86
91
  output
87
92
  end
@@ -338,11 +338,24 @@ module Fastlane
338
338
  UI.user_error!("No tag found matching #{version.inspect}") if checkout_param.nil?
339
339
  end
340
340
 
341
- if is_eligible_for_caching && version.nil?
342
- # Update the repo if it's eligible for caching but the version isn't specified
343
- UI.message("Fetching remote git branches and updating git repo...")
344
- Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
345
- Actions.sh("cd #{clone_folder.shellescape} && git fetch --all --quiet && git checkout #{checkout_param.shellescape} #{checkout_path} && git reset --hard && git rebase")
341
+ if is_eligible_for_caching
342
+ if version.nil?
343
+ # Update the repo if it's eligible for caching but the version isn't specified
344
+ UI.message("Fetching remote git branches and updating git repo...")
345
+ Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
346
+ Actions.sh("cd #{clone_folder.shellescape} && git fetch --all --quiet && git checkout #{checkout_param.shellescape} #{checkout_path} && git reset --hard && git rebase")
347
+ end
348
+ else
349
+ begin
350
+ # https://stackoverflow.com/a/1593574/865175
351
+ current_tag = Actions.sh("cd #{clone_folder.shellescape} && git describe --exact-match --tags HEAD").strip
352
+ rescue
353
+ current_tag = nil
354
+ end
355
+
356
+ if current_tag != version
357
+ Actions.sh("cd #{clone_folder.shellescape} && git checkout #{checkout_param.shellescape} #{checkout_path}")
358
+ end
346
359
  end
347
360
  else
348
361
  Actions.sh("cd #{clone_folder.shellescape} && git checkout #{checkout_param.shellescape} #{checkout_path}")
@@ -5,3 +5,6 @@
5
5
 
6
6
  FastlaneCore::Feature.register(env_var: 'FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS',
7
7
  description: 'Use a newly implemented screenshots synchronization logic')
8
+
9
+ FastlaneCore::Feature.register(env_var: 'FASTLANE_WWDR_USE_HTTP1_AND_RETRIES',
10
+ description: 'Adds --http1.1 and --retry 3 --retry-all-errors to the curl command to download WWDR certificates')
@@ -0,0 +1,9 @@
1
+ module Fastlane
2
+ module Helper
3
+ class XcodebuildFormatterHelper
4
+ def self.xcbeautify_installed?
5
+ return `which xcbeautify`.include?("xcbeautify")
6
+ end
7
+ end
8
+ end
9
+ end