fastlane_hotfix 2.165.0 → 2.187.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (415) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +106 -86
  4. data/cert/lib/cert/commands_generator.rb +2 -1
  5. data/cert/lib/cert/options.rb +6 -5
  6. data/cert/lib/cert/runner.rb +8 -8
  7. data/deliver/lib/assets/summary.html.erb +10 -10
  8. data/deliver/lib/deliver/app_screenshot.rb +17 -11
  9. data/deliver/lib/deliver/app_screenshot_validator.rb +108 -0
  10. data/deliver/lib/deliver/commands_generator.rb +4 -3
  11. data/deliver/lib/deliver/detect_values.rb +5 -3
  12. data/deliver/lib/deliver/download_screenshots.rb +2 -3
  13. data/deliver/lib/deliver/html_generator.rb +2 -2
  14. data/deliver/lib/deliver/languages.rb +1 -1
  15. data/deliver/lib/deliver/loader.rb +123 -21
  16. data/deliver/lib/deliver/module.rb +6 -0
  17. data/deliver/lib/deliver/options.rb +41 -55
  18. data/deliver/lib/deliver/runner.rb +19 -14
  19. data/deliver/lib/deliver/setup.rb +9 -5
  20. data/deliver/lib/deliver/submit_for_review.rb +4 -4
  21. data/deliver/lib/deliver/upload_metadata.rb +32 -21
  22. data/deliver/lib/deliver/upload_price_tier.rb +1 -1
  23. data/deliver/lib/deliver/upload_screenshots.rb +14 -76
  24. data/fastlane/lib/fastlane/actions/actions_helper.rb +3 -3
  25. data/fastlane/lib/fastlane/actions/adb.rb +2 -5
  26. data/fastlane/lib/fastlane/actions/adb_devices.rb +0 -1
  27. data/fastlane/lib/fastlane/actions/add_git_tag.rb +22 -6
  28. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +17 -17
  29. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +21 -7
  30. data/fastlane/lib/fastlane/actions/appaloosa.rb +7 -2
  31. data/fastlane/lib/fastlane/actions/appetize.rb +13 -8
  32. data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +0 -11
  33. data/fastlane/lib/fastlane/actions/appium.rb +40 -65
  34. data/fastlane/lib/fastlane/actions/appledoc.rb +46 -46
  35. data/fastlane/lib/fastlane/actions/apteligent.rb +3 -2
  36. data/fastlane/lib/fastlane/actions/artifactory.rb +41 -9
  37. data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +7 -13
  38. data/fastlane/lib/fastlane/actions/backup_file.rb +1 -1
  39. data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +3 -3
  40. data/fastlane/lib/fastlane/actions/badge.rb +9 -13
  41. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +11 -5
  42. data/fastlane/lib/fastlane/actions/build_app.rb +7 -1
  43. data/fastlane/lib/fastlane/actions/bundle_install.rb +8 -10
  44. data/fastlane/lib/fastlane/actions/carthage.rb +22 -14
  45. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +8 -17
  46. data/fastlane/lib/fastlane/actions/chatwork.rb +3 -2
  47. data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +9 -1
  48. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +0 -1
  49. data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +0 -1
  50. data/fastlane/lib/fastlane/actions/clipboard.rb +3 -6
  51. data/fastlane/lib/fastlane/actions/cloc.rb +9 -13
  52. data/fastlane/lib/fastlane/actions/cocoapods.rb +23 -15
  53. data/fastlane/lib/fastlane/actions/commit_github_file.rb +12 -4
  54. data/fastlane/lib/fastlane/actions/commit_version_bump.rb +6 -7
  55. data/fastlane/lib/fastlane/actions/copy_artifacts.rb +3 -4
  56. data/fastlane/lib/fastlane/actions/crashlytics.rb +7 -11
  57. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +70 -76
  58. data/fastlane/lib/fastlane/actions/create_keychain.rb +13 -11
  59. data/fastlane/lib/fastlane/actions/create_pull_request.rb +15 -9
  60. data/fastlane/lib/fastlane/actions/create_xcframework.rb +123 -0
  61. data/fastlane/lib/fastlane/actions/danger.rb +13 -12
  62. data/fastlane/lib/fastlane/actions/deploygate.rb +1 -2
  63. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
  64. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +27 -28
  65. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +7 -3
  66. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +171 -67
  67. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +20 -3
  68. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +9 -3
  69. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +39 -16
  70. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -1
  71. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +15 -5
  72. data/fastlane/lib/fastlane/actions/download_app_privacy_details_from_app_store.rb +142 -0
  73. data/fastlane/lib/fastlane/actions/download_dsyms.rb +8 -20
  74. data/fastlane/lib/fastlane/actions/dsym_zip.rb +1 -1
  75. data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +2 -6
  76. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +0 -1
  77. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +3 -4
  78. data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +3 -5
  79. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -2
  80. data/fastlane/lib/fastlane/actions/environment_variable.rb +13 -21
  81. data/fastlane/lib/fastlane/actions/erb.rb +2 -5
  82. data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +1 -1
  83. data/fastlane/lib/fastlane/actions/get_certificates.rb +5 -1
  84. data/fastlane/lib/fastlane/actions/get_github_release.rb +11 -1
  85. data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +0 -1
  86. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +32 -35
  87. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +9 -1
  88. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
  89. data/fastlane/lib/fastlane/actions/get_version_number.rb +17 -10
  90. data/fastlane/lib/fastlane/actions/git_add.rb +5 -10
  91. data/fastlane/lib/fastlane/actions/git_branch.rb +4 -10
  92. data/fastlane/lib/fastlane/actions/git_commit.rb +12 -10
  93. data/fastlane/lib/fastlane/actions/git_pull.rb +4 -10
  94. data/fastlane/lib/fastlane/actions/git_remote_branch.rb +57 -0
  95. data/fastlane/lib/fastlane/actions/git_submodule_update.rb +16 -8
  96. data/fastlane/lib/fastlane/actions/git_tag_exists.rb +4 -0
  97. data/fastlane/lib/fastlane/actions/github_api.rb +17 -8
  98. data/fastlane/lib/fastlane/actions/gradle.rb +12 -20
  99. data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +1 -1
  100. data/fastlane/lib/fastlane/actions/hg_push.rb +1 -1
  101. data/fastlane/lib/fastlane/actions/hipchat.rb +6 -6
  102. data/fastlane/lib/fastlane/actions/hockey.rb +5 -12
  103. data/fastlane/lib/fastlane/actions/ifttt.rb +3 -6
  104. data/fastlane/lib/fastlane/actions/import_from_git.rb +7 -9
  105. data/fastlane/lib/fastlane/actions/increment_build_number.rb +8 -2
  106. data/fastlane/lib/fastlane/actions/install_on_device.rb +3 -6
  107. data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +4 -0
  108. data/fastlane/lib/fastlane/actions/installr.rb +22 -25
  109. data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
  110. data/fastlane/lib/fastlane/actions/jazzy.rb +11 -8
  111. data/fastlane/lib/fastlane/actions/jira.rb +61 -14
  112. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +6 -6
  113. data/fastlane/lib/fastlane/actions/lcov.rb +0 -4
  114. data/fastlane/lib/fastlane/actions/mailgun.rb +21 -27
  115. data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +1 -1
  116. data/fastlane/lib/fastlane/actions/match_nuke.rb +59 -0
  117. data/fastlane/lib/fastlane/actions/modify_services.rb +59 -24
  118. data/fastlane/lib/fastlane/actions/nexus_upload.rb +3 -2
  119. data/fastlane/lib/fastlane/actions/notarize.rb +98 -54
  120. data/fastlane/lib/fastlane/actions/notification.rb +1 -1
  121. data/fastlane/lib/fastlane/actions/number_of_commits.rb +1 -1
  122. data/fastlane/lib/fastlane/actions/oclint.rb +15 -14
  123. data/fastlane/lib/fastlane/actions/onesignal.rb +13 -3
  124. data/fastlane/lib/fastlane/actions/pod_push.rb +9 -2
  125. data/fastlane/lib/fastlane/actions/podio_item.rb +0 -7
  126. data/fastlane/lib/fastlane/actions/prompt.rb +3 -4
  127. data/fastlane/lib/fastlane/actions/push_git_tags.rb +1 -1
  128. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +14 -3
  129. data/fastlane/lib/fastlane/actions/puts.rb +1 -2
  130. data/fastlane/lib/fastlane/actions/register_device.rb +10 -13
  131. data/fastlane/lib/fastlane/actions/register_devices.rb +11 -14
  132. data/fastlane/lib/fastlane/actions/reset_git_repo.rb +5 -8
  133. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +0 -2
  134. data/fastlane/lib/fastlane/actions/resign.rb +2 -9
  135. data/fastlane/lib/fastlane/actions/restore_file.rb +1 -1
  136. data/fastlane/lib/fastlane/actions/rsync.rb +3 -6
  137. data/fastlane/lib/fastlane/actions/run_tests.rb +1 -1
  138. data/fastlane/lib/fastlane/actions/s3.rb +1 -1
  139. data/fastlane/lib/fastlane/actions/say.rb +2 -3
  140. data/fastlane/lib/fastlane/actions/scp.rb +4 -10
  141. data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +1 -1
  142. data/fastlane/lib/fastlane/actions/set_changelog.rb +10 -13
  143. data/fastlane/lib/fastlane/actions/set_github_release.rb +23 -16
  144. data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +1 -1
  145. data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -4
  146. data/fastlane/lib/fastlane/actions/setup_ci.rb +1 -2
  147. data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +1 -1
  148. data/fastlane/lib/fastlane/actions/setup_jenkins.rb +7 -12
  149. data/fastlane/lib/fastlane/actions/setup_travis.rb +1 -1
  150. data/fastlane/lib/fastlane/actions/sh.rb +2 -4
  151. data/fastlane/lib/fastlane/actions/slack.rb +164 -145
  152. data/fastlane/lib/fastlane/actions/slather.rb +5 -21
  153. data/fastlane/lib/fastlane/actions/sonar.rb +12 -19
  154. data/fastlane/lib/fastlane/actions/sourcedocs.rb +128 -0
  155. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +1 -1
  156. data/fastlane/lib/fastlane/actions/splunkmint.rb +2 -2
  157. data/fastlane/lib/fastlane/actions/spm.rb +8 -2
  158. data/fastlane/lib/fastlane/actions/ssh.rb +5 -10
  159. data/fastlane/lib/fastlane/actions/swiftlint.rb +21 -19
  160. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +6 -1
  161. data/fastlane/lib/fastlane/actions/testfairy.rb +0 -1
  162. data/fastlane/lib/fastlane/actions/tryouts.rb +2 -3
  163. data/fastlane/lib/fastlane/actions/twitter.rb +0 -5
  164. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +3 -3
  165. data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +1 -4
  166. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +8 -15
  167. data/fastlane/lib/fastlane/actions/update_fastlane.rb +31 -10
  168. data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +1 -4
  169. data/fastlane/lib/fastlane/actions/update_info_plist.rb +1 -1
  170. data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +1 -4
  171. data/fastlane/lib/fastlane/actions/update_plist.rb +1 -1
  172. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +3 -4
  173. data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +0 -1
  174. data/fastlane/lib/fastlane/actions/update_url_schemes.rb +15 -26
  175. data/fastlane/lib/fastlane/actions/upload_app_privacy_details_to_app_store.rb +290 -0
  176. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +8 -7
  177. data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +3 -10
  178. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +8 -4
  179. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +7 -2
  180. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +40 -44
  181. data/fastlane/lib/fastlane/actions/version_get_podspec.rb +1 -2
  182. data/fastlane/lib/fastlane/actions/xcode_install.rb +8 -5
  183. data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +3 -3
  184. data/fastlane/lib/fastlane/actions/xcodebuild.rb +5 -5
  185. data/fastlane/lib/fastlane/cli_tools_distributor.rb +6 -3
  186. data/fastlane/lib/fastlane/commands_generator.rb +2 -1
  187. data/fastlane/lib/fastlane/documentation/actions_list.rb +2 -2
  188. data/fastlane/lib/fastlane/documentation/docs_generator.rb +1 -1
  189. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +1 -1
  190. data/fastlane/lib/fastlane/environment_printer.rb +1 -0
  191. data/fastlane/lib/fastlane/erb_template_helper.rb +7 -1
  192. data/fastlane/lib/fastlane/fast_file.rb +19 -7
  193. data/fastlane/lib/fastlane/fastlane_require.rb +7 -1
  194. data/fastlane/lib/fastlane/features.rb +1 -1
  195. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  196. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +4 -4
  197. data/fastlane/lib/fastlane/helper/gem_helper.rb +2 -2
  198. data/fastlane/lib/fastlane/helper/git_helper.rb +34 -5
  199. data/fastlane/lib/fastlane/lane_manager.rb +3 -2
  200. data/fastlane/lib/fastlane/notification/slack.rb +56 -0
  201. data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -2
  202. data/fastlane/lib/fastlane/plugins/plugin_info.rb +2 -2
  203. data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -2
  204. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +2 -3
  205. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +7 -6
  206. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +1 -1
  207. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +1 -1
  208. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +31 -35
  209. data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +1 -1
  210. data/fastlane/lib/fastlane/setup/setup.rb +23 -10
  211. data/fastlane/lib/fastlane/setup/setup_ios.rb +3 -3
  212. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +3 -0
  213. data/fastlane/lib/fastlane/swift_fastlane_function.rb +44 -16
  214. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +2 -0
  215. data/fastlane/lib/fastlane/version.rb +2 -2
  216. data/fastlane/swift/Actions.swift +1 -1
  217. data/fastlane/swift/Appfile.swift +1 -1
  218. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  219. data/fastlane/swift/ControlCommand.swift +1 -1
  220. data/fastlane/swift/Deliverfile.swift +2 -2
  221. data/fastlane/swift/DeliverfileProtocol.swift +23 -23
  222. data/fastlane/swift/Fastfile.swift +1 -1
  223. data/fastlane/swift/Fastlane.swift +7965 -4213
  224. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -0
  225. data/fastlane/swift/Gymfile.swift +2 -2
  226. data/fastlane/swift/GymfileProtocol.swift +15 -3
  227. data/fastlane/swift/LaneFileProtocol.swift +12 -6
  228. data/fastlane/swift/MainProcess.swift +3 -1
  229. data/fastlane/swift/Matchfile.swift +2 -2
  230. data/fastlane/swift/MatchfileProtocol.swift +4 -4
  231. data/fastlane/swift/OptionalConfigValue.swift +101 -0
  232. data/fastlane/swift/Plugins.swift +1 -1
  233. data/fastlane/swift/Precheckfile.swift +2 -2
  234. data/fastlane/swift/PrecheckfileProtocol.swift +8 -4
  235. data/fastlane/swift/RubyCommand.swift +2 -2
  236. data/fastlane/swift/RubyCommandable.swift +1 -1
  237. data/fastlane/swift/Runner.swift +3 -3
  238. data/fastlane/swift/RunnerArgument.swift +1 -1
  239. data/fastlane/swift/Scanfile.swift +2 -2
  240. data/fastlane/swift/ScanfileProtocol.swift +34 -2
  241. data/fastlane/swift/Screengrabfile.swift +2 -2
  242. data/fastlane/swift/ScreengrabfileProtocol.swift +5 -5
  243. data/fastlane/swift/Snapshotfile.swift +2 -2
  244. data/fastlane/swift/SnapshotfileProtocol.swift +19 -3
  245. data/fastlane/swift/SocketClient.swift +4 -3
  246. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  247. data/fastlane/swift/SocketResponse.swift +5 -3
  248. data/fastlane/swift/formatting/Brewfile.lock.json +24 -16
  249. data/fastlane/swift/main.swift +1 -1
  250. data/fastlane/swift/upgrade_manifest.json +1 -1
  251. data/fastlane_core/lib/fastlane_core.rb +22 -20
  252. data/fastlane_core/lib/fastlane_core/build_watcher.rb +89 -12
  253. data/fastlane_core/lib/fastlane_core/cert_checker.rb +12 -7
  254. data/fastlane_core/lib/fastlane_core/clipboard.rb +20 -0
  255. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -9
  256. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +6 -1
  257. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +41 -3
  258. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +14 -8
  259. data/fastlane_core/lib/fastlane_core/device_manager.rb +1 -1
  260. data/fastlane_core/lib/fastlane_core/helper.rb +78 -14
  261. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +41 -16
  262. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +3 -2
  263. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +20 -15
  264. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +1 -1
  265. data/fastlane_core/lib/fastlane_core/languages.rb +2 -2
  266. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +3 -2
  267. data/fastlane_core/lib/fastlane_core/print_table.rb +5 -3
  268. data/fastlane_core/lib/fastlane_core/project.rb +48 -28
  269. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +3 -1
  270. data/{deliver/lib/deliver → fastlane_core/lib/fastlane_core}/queue_worker.rb +4 -4
  271. data/fastlane_core/lib/fastlane_core/swag.rb +1 -1
  272. data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +8 -0
  273. data/fastlane_core/lib/fastlane_core/ui/help.erb +35 -0
  274. data/fastlane_core/lib/fastlane_core/ui/help_formatter.rb +16 -0
  275. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +16 -2
  276. data/fastlane_core/lib/fastlane_core/ui/interface.rb +1 -1
  277. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +2 -2
  278. data/frameit/lib/frameit/commands_generator.rb +2 -1
  279. data/frameit/lib/frameit/config_parser.rb +2 -2
  280. data/frameit/lib/frameit/device_types.rb +7 -1
  281. data/frameit/lib/frameit/frame_downloader.rb +2 -1
  282. data/gym/lib/gym/code_signing_mapping.rb +3 -3
  283. data/gym/lib/gym/commands_generator.rb +2 -1
  284. data/gym/lib/gym/error_handler.rb +8 -0
  285. data/gym/lib/gym/generators/build_command_generator.rb +3 -0
  286. data/gym/lib/gym/generators/package_command_generator.rb +4 -0
  287. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +21 -15
  288. data/gym/lib/gym/options.rb +19 -3
  289. data/gym/lib/gym/runner.rb +15 -4
  290. data/match/lib/match/change_password.rb +3 -3
  291. data/match/lib/match/commands_generator.rb +2 -1
  292. data/match/lib/match/encryption/interface.rb +1 -1
  293. data/match/lib/match/encryption/openssl.rb +5 -3
  294. data/match/lib/match/importer.rb +9 -10
  295. data/match/lib/match/migrate.rb +2 -3
  296. data/match/lib/match/module.rb +2 -1
  297. data/match/lib/match/nuke.rb +19 -15
  298. data/match/lib/match/options.rb +4 -3
  299. data/match/lib/match/runner.rb +3 -4
  300. data/match/lib/match/spaceship_ensure.rb +3 -0
  301. data/match/lib/match/storage/git_storage.rb +14 -10
  302. data/match/lib/match/storage/google_cloud_storage.rb +2 -2
  303. data/match/lib/match/storage/s3_storage.rb +2 -2
  304. data/pem/lib/pem/commands_generator.rb +2 -1
  305. data/pilot/lib/pilot.rb +0 -1
  306. data/pilot/lib/pilot/build_manager.rb +41 -15
  307. data/pilot/lib/pilot/commands_generator.rb +2 -1
  308. data/pilot/lib/pilot/manager.rb +11 -8
  309. data/pilot/lib/pilot/options.rb +18 -9
  310. data/pilot/lib/pilot/tester_exporter.rb +0 -1
  311. data/pilot/lib/pilot/tester_manager.rb +0 -1
  312. data/precheck/lib/precheck/commands_generator.rb +2 -1
  313. data/precheck/lib/precheck/options.rb +9 -3
  314. data/precheck/lib/precheck/rule_processor.rb +1 -1
  315. data/precheck/lib/precheck/runner.rb +14 -9
  316. data/produce/lib/produce/commands_generator.rb +101 -28
  317. data/produce/lib/produce/developer_center.rb +42 -4
  318. data/produce/lib/produce/options.rb +1 -1
  319. data/produce/lib/produce/service.rb +270 -179
  320. data/scan/lib/scan/commands_generator.rb +2 -1
  321. data/scan/lib/scan/detect_values.rb +7 -2
  322. data/scan/lib/scan/module.rb +4 -0
  323. data/scan/lib/scan/options.rb +46 -1
  324. data/scan/lib/scan/runner.rb +88 -3
  325. data/scan/lib/scan/slack_poster.rb +4 -1
  326. data/scan/lib/scan/test_command_generator.rb +13 -8
  327. data/screengrab/lib/screengrab/android_environment.rb +5 -53
  328. data/screengrab/lib/screengrab/commands_generator.rb +2 -1
  329. data/screengrab/lib/screengrab/dependency_checker.rb +0 -20
  330. data/screengrab/lib/screengrab/options.rb +5 -2
  331. data/screengrab/lib/screengrab/runner.rb +111 -108
  332. data/sigh/lib/assets/resign.sh +81 -61
  333. data/sigh/lib/sigh/commands_generator.rb +2 -1
  334. data/sigh/lib/sigh/download_all.rb +4 -8
  335. data/sigh/lib/sigh/options.rb +3 -2
  336. data/sigh/lib/sigh/runner.rb +9 -9
  337. data/snapshot/lib/assets/SnapfileTemplate +3 -2
  338. data/snapshot/lib/assets/SnapfileTemplate.swift +2 -1
  339. data/snapshot/lib/assets/SnapshotHelper.swift +20 -12
  340. data/snapshot/lib/snapshot/commands_generator.rb +3 -1
  341. data/snapshot/lib/snapshot/options.rb +22 -2
  342. data/snapshot/lib/snapshot/reports_generator.rb +7 -1
  343. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  344. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
  345. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +10 -5
  346. data/snapshot/lib/snapshot/test_command_generator.rb +18 -4
  347. data/snapshot/lib/snapshot/test_command_generator_base.rb +3 -1
  348. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +1 -1
  349. data/snapshot/lib/snapshot/update.rb +1 -1
  350. data/spaceship/README.md +4 -14
  351. data/spaceship/lib/spaceship/base.rb +2 -2
  352. data/spaceship/lib/spaceship/client.rb +44 -16
  353. data/spaceship/lib/spaceship/commands_generator.rb +4 -2
  354. data/spaceship/lib/spaceship/connect_api.rb +6 -0
  355. data/spaceship/lib/spaceship/connect_api/api_client.rb +67 -9
  356. data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
  357. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +39 -6
  358. data/spaceship/lib/spaceship/connect_api/models/app.rb +95 -55
  359. data/spaceship/lib/spaceship/connect_api/models/app_data_usage.rb +59 -0
  360. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_category.rb +65 -0
  361. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_data_protection.rb +27 -0
  362. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_grouping.rb +18 -0
  363. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_purposes.rb +37 -0
  364. data/spaceship/lib/spaceship/connect_api/models/app_data_usages_publish_state.rb +36 -0
  365. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +26 -10
  366. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +8 -4
  367. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +15 -11
  368. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +18 -9
  369. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +10 -8
  370. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +20 -11
  371. data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +7 -5
  372. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +6 -4
  373. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +62 -38
  374. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +27 -14
  375. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +3 -2
  376. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +3 -2
  377. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +6 -4
  378. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +29 -3
  379. data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +15 -9
  380. data/spaceship/lib/spaceship/connect_api/models/build.rb +34 -17
  381. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +4 -0
  382. data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +3 -2
  383. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +41 -6
  384. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +86 -21
  385. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +12 -8
  386. data/spaceship/lib/spaceship/connect_api/models/device.rb +36 -4
  387. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +6 -4
  388. data/spaceship/lib/spaceship/connect_api/models/profile.rb +18 -8
  389. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +3 -2
  390. data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +9 -6
  391. data/spaceship/lib/spaceship/connect_api/models/territory.rb +3 -2
  392. data/spaceship/lib/spaceship/connect_api/models/user.rb +6 -4
  393. data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +22 -6
  394. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +99 -2
  395. data/spaceship/lib/spaceship/connect_api/response.rb +3 -1
  396. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +50 -0
  397. data/spaceship/lib/spaceship/connect_api/token.rb +15 -3
  398. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +122 -2
  399. data/spaceship/lib/spaceship/errors.rb +19 -0
  400. data/spaceship/lib/spaceship/playground.rb +2 -2
  401. data/spaceship/lib/spaceship/spaceauth_runner.rb +38 -15
  402. data/spaceship/lib/spaceship/tunes/iap_detail.rb +1 -1
  403. data/spaceship/lib/spaceship/tunes/members.rb +1 -1
  404. data/spaceship/lib/spaceship/tunes/tunes_client.rb +4 -4
  405. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +59 -33
  406. data/spaceship/lib/spaceship/ui.rb +2 -2
  407. data/spaceship/lib/spaceship/upgrade_2fa_later_client.rb +91 -0
  408. data/supply/lib/supply.rb +1 -1
  409. data/supply/lib/supply/client.rb +5 -3
  410. data/supply/lib/supply/commands_generator.rb +2 -1
  411. data/supply/lib/supply/options.rb +3 -3
  412. data/supply/lib/supply/uploader.rb +6 -4
  413. metadata +124 -92
  414. data/pilot/lib/pilot/features.rb +0 -0
  415. data/pilot/lib/pilot/tester_util.rb +0 -0
@@ -22,7 +22,7 @@ module FastlaneCore
22
22
  end
23
23
 
24
24
  def self.installed_identies(in_keychain: nil)
25
- install_wwdr_certificate unless wwdr_certificate_installed?
25
+ install_wwdr_certificates unless wwdr_certificates_installed?
26
26
 
27
27
  available = list_available_identities(in_keychain: in_keychain)
28
28
  # Match for this text against word boundaries to avoid edge cases around multiples of 10 identities!
@@ -81,16 +81,21 @@ module FastlaneCore
81
81
  `#{commands.join(' ')}`
82
82
  end
83
83
 
84
- def self.wwdr_certificate_installed?
84
+ def self.wwdr_certificates_installed?
85
85
  certificate_name = "Apple Worldwide Developer Relations Certification Authority"
86
86
  keychain = wwdr_keychain
87
- response = Helper.backticks("security find-certificate -c '#{certificate_name}' #{keychain.shellescape}", print: FastlaneCore::Globals.verbose?)
88
- return response.include?("attributes:")
87
+ response = Helper.backticks("security find-certificate -a -c '#{certificate_name}' #{keychain.shellescape}", print: FastlaneCore::Globals.verbose?)
88
+ certs = response.split("keychain: \"#{keychain}\"").drop(1)
89
+ certs.count == 2
89
90
  end
90
91
 
91
- def self.install_wwdr_certificate
92
- url = 'https://developer.apple.com/certificationauthority/AppleWWDRCA.cer'
93
- file = Tempfile.new('AppleWWDRCA')
92
+ def self.install_wwdr_certificates
93
+ install_wwdr_certificate('https://developer.apple.com/certificationauthority/AppleWWDRCA.cer')
94
+ install_wwdr_certificate('https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer')
95
+ end
96
+
97
+ def self.install_wwdr_certificate(url)
98
+ file = Tempfile.new(File.basename(url))
94
99
  filename = file.path
95
100
  keychain = wwdr_keychain
96
101
  keychain = "-k #{keychain.shellescape}" unless keychain.empty?
@@ -0,0 +1,20 @@
1
+ require 'fastlane_core'
2
+ require 'open3'
3
+
4
+ module FastlaneCore
5
+ class Clipboard
6
+ def self.copy(content: nil)
7
+ return UI.crash!("'pbcopy' or 'pbpaste' command not found.") unless is_supported?
8
+ Open3.popen3('pbcopy') { |input, _, _| input << content }
9
+ end
10
+
11
+ def self.paste
12
+ return UI.crash!("'pbcopy' or 'pbpaste' command not found.") unless is_supported?
13
+ return `pbpaste`
14
+ end
15
+
16
+ def self.is_supported?
17
+ return `which pbcopy`.length > 0 && `which pbpaste`.length > 0
18
+ end
19
+ end
20
+ end
@@ -13,16 +13,10 @@ module FastlaneCore
13
13
  #
14
14
  # Derived from https://stackoverflow.com/a/5471032/3005
15
15
  def which(cmd)
16
- # PATHEXT contains the list of file extensions that Windows considers executable, semicolon separated.
17
- # e.g. ".COM;.EXE;.BAT;.CMD"
18
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : []
19
- exts << '' # Always have an empty string (= no file extension)
20
-
21
16
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
22
- exts.each do |ext|
23
- cmd_path = File.join(path, "#{cmd}#{ext}")
24
- return cmd_path if Helper.executable?(cmd_path)
25
- end
17
+ cmd_path = File.join(path, cmd)
18
+ executable_path = Helper.get_executable_path(cmd_path)
19
+ return executable_path if Helper.executable?(executable_path)
26
20
  end
27
21
 
28
22
  return nil
@@ -30,6 +30,11 @@ module FastlaneCore
30
30
  type = option.is_string ? String : nil
31
31
  end
32
32
 
33
+ # OptionParser doesn't like symbol but a symbol and string can be easily cast with `to_sym` and `to_s`
34
+ if type == Symbol
35
+ type = String
36
+ end
37
+
33
38
  # Boolean is a fastlane thing, it's either TrueClass, or FalseClass, but we won't know
34
39
  # that until runtime, so nil is the best we get
35
40
  if type == Fastlane::Boolean
@@ -67,7 +72,7 @@ module FastlaneCore
67
72
  long_switch = "--#{option.key} #{value_appendix}"
68
73
 
69
74
  description = option.description
70
- description += " (#{option.env_name})" unless option.env_name.to_s.empty?
75
+ description += " (#{option.env_names.join(', ')})" unless option.env_names.empty?
71
76
 
72
77
  # We compact this array here to remove the short_switch variable if it is nil.
73
78
  # Passing a nil value to global_option has been shown to create problems with
@@ -12,6 +12,9 @@ module FastlaneCore
12
12
  # [String] the name of the environment variable, which is only used if no other values were found
13
13
  attr_accessor :env_name
14
14
 
15
+ # [Array] the names of the environment variables, which is only used if no other values were found
16
+ attr_accessor :env_names
17
+
15
18
  # [String] A description shown to the user
16
19
  attr_accessor :description
17
20
 
@@ -71,6 +74,7 @@ module FastlaneCore
71
74
  # Creates a new option
72
75
  # @param key (Symbol) the key which is used as command parameters or key in the fastlane tools
73
76
  # @param env_name (String) the name of the environment variable, which is only used if no other values were found
77
+ # @param env_names (Array) the names of the environment variables, which is only used if no other values were found
74
78
  # @param description (String) A description shown to the user
75
79
  # @param short_option (String) A string of length 1 which is used for the command parameters (e.g. -f)
76
80
  # @param default_value the value which is used if there was no given values and no environment values
@@ -88,8 +92,10 @@ module FastlaneCore
88
92
  # @param sensitive (Boolean) Set if the variable is sensitive, such as a password or API token, to prevent echoing when prompted for the parameter
89
93
  # @param display_in_shell (Boolean) Set if the variable can be used from shell
90
94
  # rubocop:disable Metrics/ParameterLists
95
+ # rubocop:disable Metrics/PerceivedComplexity
91
96
  def initialize(key: nil,
92
97
  env_name: nil,
98
+ env_names: nil,
93
99
  description: nil,
94
100
  short_option: nil,
95
101
  default_value: nil,
@@ -109,6 +115,11 @@ module FastlaneCore
109
115
  UI.user_error!("key must be a symbol") unless key.kind_of?(Symbol)
110
116
  UI.user_error!("env_name must be a String") unless (env_name || '').kind_of?(String)
111
117
 
118
+ UI.user_error!("env_names must be an Array") unless (env_names || []).kind_of?(Array)
119
+ (env_names || []).each do |name|
120
+ UI.user_error!("env_names must only contain String") unless (name || '').kind_of?(String)
121
+ end
122
+
112
123
  if short_option
113
124
  UI.user_error!("short_option for key :#{key} must of type String") unless short_option.kind_of?(String)
114
125
  UI.user_error!("short_option for key :#{key} must be a string of length 1") unless short_option.delete('-').length == 1
@@ -138,6 +149,7 @@ module FastlaneCore
138
149
 
139
150
  @key = key
140
151
  @env_name = env_name
152
+ @env_names = [env_name].compact + (env_names || [])
141
153
  @description = description
142
154
  @short_option = short_option
143
155
  @default_value = default_value
@@ -160,6 +172,7 @@ module FastlaneCore
160
172
 
161
173
  update_code_gen_default_value_if_able!
162
174
  end
175
+ # rubocop:enable Metrics/PerceivedComplexity
163
176
  # rubocop:enable Metrics/ParameterLists
164
177
 
165
178
  # if code_gen_default_value is nil, use the default value if it isn't a `code_gen_sensitive` value
@@ -203,6 +216,17 @@ module FastlaneCore
203
216
  end
204
217
  end
205
218
 
219
+ def ensure_array_type_passes_validation(value)
220
+ if @skip_type_validation
221
+ return
222
+ end
223
+
224
+ # Arrays can be an either be an array or string that gets split by comma in auto_convert_type
225
+ if !value.kind_of?(Array) && !value.kind_of?(String)
226
+ UI.user_error!("'#{self.key}' value must be either `Array` or `comma-separated String`! Found #{value.class} instead.")
227
+ end
228
+ end
229
+
206
230
  # Make sure, the value is valid (based on the verify block)
207
231
  # Raises an exception if the value is invalid
208
232
  def valid?(value)
@@ -212,6 +236,8 @@ module FastlaneCore
212
236
  # Verify that value is the type that we're expecting, if we are expecting a type
213
237
  if data_type == Fastlane::Boolean
214
238
  ensure_boolean_type_passes_validation(value)
239
+ elsif data_type == Array
240
+ ensure_array_type_passes_validation(value)
215
241
  else
216
242
  ensure_generic_type_passes_validation(value)
217
243
  end
@@ -228,6 +254,16 @@ module FastlaneCore
228
254
  true
229
255
  end
230
256
 
257
+ def fetch_env_value
258
+ env_names.each do |name|
259
+ next if ENV[name].nil?
260
+ # verify! before using (see https://github.com/fastlane/fastlane/issues/14449)
261
+ return ENV[name].dup if verify!(auto_convert_value(ENV[name]))
262
+ end
263
+
264
+ return nil
265
+ end
266
+
231
267
  # rubocop:disable Metrics/PerceivedComplexity
232
268
  # Returns an updated value type (if necessary)
233
269
  def auto_convert_value(value)
@@ -239,6 +275,8 @@ module FastlaneCore
239
275
  return value.to_i if value.to_i.to_s == value.to_s
240
276
  elsif data_type == Float
241
277
  return value.to_f if value.to_f.to_s == value.to_s
278
+ elsif data_type == Symbol
279
+ return value.to_sym if value.to_sym.to_s == value.to_s
242
280
  elsif allow_shell_conversion
243
281
  return value.shelljoin if value.kind_of?(Array)
244
282
  return value.map { |k, v| "#{k.to_s.shellescape}=#{v.shellescape}" }.join(' ') if value.kind_of?(Hash)
@@ -249,11 +287,11 @@ module FastlaneCore
249
287
  rescue JSON::ParserError
250
288
  end
251
289
  elsif data_type != String
252
- # Special treatment if the user specified true, false or YES, NO
290
+ # Special treatment if the user specified true, false, on, off or YES, NO
253
291
  # There is no boolean type, so we just do it here
254
- if %w(YES yes true TRUE).include?(value)
292
+ if %w(yes YES true TRUE on ON).include?(value)
255
293
  return true
256
- elsif %w(NO no false FALSE).include?(value)
294
+ elsif %w(no NO false FALSE off OFF).include?(value)
257
295
  return false
258
296
  end
259
297
  end
@@ -208,19 +208,19 @@ module FastlaneCore
208
208
  #####################################################
209
209
 
210
210
  # Returns the value for a certain key. fastlane_core tries to fetch the value from different sources
211
- # if 'ask' is true and the value is not present, the user will be prompted to provide a value
211
+ # if 'ask' is true and the value is not present, the user will be prompted to provide a value if optional
212
+ # if 'force_ask' is true, the option is not required to be optional to ask
212
213
  # rubocop:disable Metrics/PerceivedComplexity
213
- def fetch(key, ask: true)
214
- UI.crash!("Key '#{key}' must be a symbol. Example :app_id.") unless key.kind_of?(Symbol)
214
+ def fetch(key, ask: true, force_ask: false)
215
+ UI.crash!("Key '#{key}' must be a symbol. Example :#{key}") unless key.kind_of?(Symbol)
215
216
 
216
217
  option = verify_options_key!(key)
217
218
 
218
219
  # Same order as https://docs.fastlane.tools/advanced/#priorities-of-parameters-and-options
219
220
  value = if @values.key?(key) && !@values[key].nil?
220
221
  @values[key]
221
- elsif option.env_name && !ENV[option.env_name].nil?
222
- # verify! before using (see https://github.com/fastlane/fastlane/issues/14449)
223
- ENV[option.env_name].dup if option.verify!(option.auto_convert_value(ENV[option.env_name]))
222
+ elsif (env_value = option.fetch_env_value)
223
+ env_value
224
224
  elsif self.config_file_options.key?(key)
225
225
  self.config_file_options[key]
226
226
  else
@@ -229,7 +229,7 @@ module FastlaneCore
229
229
 
230
230
  value = option.auto_convert_value(value)
231
231
  value = nil if value.nil? && !option.string? # by default boolean flags are false
232
- return value unless value.nil? && !option.optional && ask
232
+ return value unless value.nil? && (!option.optional || force_ask) && ask
233
233
 
234
234
  # fallback to asking
235
235
  if Helper.test? || !UI.interactive?
@@ -243,11 +243,17 @@ module FastlaneCore
243
243
  while value.nil?
244
244
  UI.important("To not be asked about this value, you can specify it using '#{option.key}'") if ENV["FASTLANE_ONBOARDING_IN_PROCESS"].to_s.length == 0
245
245
  value = option.sensitive ? UI.password("#{option.description}: ") : UI.input("#{option.description}: ")
246
+
247
+ # ConfigItem allows to specify a type for the item but UI.password and
248
+ # UI.input return String values. Try to convert the String input to
249
+ # the option's type before passing it along.
250
+ value = option.auto_convert_value(value)
251
+
246
252
  # Also store this value to use it from now on
247
253
  begin
248
254
  set(key, value)
249
255
  rescue => ex
250
- puts(ex)
256
+ UI.error(ex)
251
257
  value = nil
252
258
  end
253
259
  end
@@ -118,7 +118,7 @@ module FastlaneCore
118
118
  discover_devices(child_item, device_types, discovered_device_udids)
119
119
  end
120
120
 
121
- is_supported_device = device_types.any? { |device_type| usb_item['_name'] == device_type }
121
+ is_supported_device = device_types.any?(usb_item['_name'])
122
122
  serial_num = usb_item['serial_num'] || ''
123
123
  has_serial_number = serial_num.length == 40 || serial_num.length == 24
124
124
 
@@ -14,7 +14,7 @@ module FastlaneCore
14
14
 
15
15
  def self.fastlane_enabled?
16
16
  # This is called from the root context on the first start
17
- @enabled ||= !FastlaneCore::FastlaneFolder.path.nil?
17
+ !FastlaneCore::FastlaneFolder.path.nil?
18
18
  end
19
19
 
20
20
  # Checks if fastlane is enabled for this project and returns the folder where the configuration lives
@@ -74,8 +74,8 @@ module FastlaneCore
74
74
  return true if self.is_circle_ci?
75
75
 
76
76
  # Check for Jenkins, Travis CI, ... environment variables
77
- ['JENKINS_HOME', 'JENKINS_URL', 'TRAVIS', 'CI', 'APPCENTER_BUILD_ID', 'TEAMCITY_VERSION', 'GO_PIPELINE_NAME', 'bamboo_buildKey', 'GITLAB_CI', 'XCS', 'TF_BUILD', 'GITHUB_ACTION', 'GITHUB_ACTIONS', 'BITRISE_IO'].each do |current|
78
- return true if ENV.key?(current)
77
+ ['JENKINS_HOME', 'JENKINS_URL', 'TRAVIS', 'CI', 'APPCENTER_BUILD_ID', 'TEAMCITY_VERSION', 'GO_PIPELINE_NAME', 'bamboo_buildKey', 'GITLAB_CI', 'XCS', 'TF_BUILD', 'GITHUB_ACTION', 'GITHUB_ACTIONS', 'BITRISE_IO', 'BUDDY'].each do |current|
78
+ return true if FastlaneCore::Env.truthy?(current)
79
79
  end
80
80
  return false
81
81
  end
@@ -107,7 +107,7 @@ module FastlaneCore
107
107
 
108
108
  # Do we want to disable the colored output?
109
109
  def self.colors_disabled?
110
- FastlaneCore::Env.truthy?("FASTLANE_DISABLE_COLORS")
110
+ FastlaneCore::Env.truthy?("FASTLANE_DISABLE_COLORS") || ENV.key?("NO_COLOR")
111
111
  end
112
112
 
113
113
  # Does the user use the Mac stock terminal
@@ -167,11 +167,23 @@ module FastlaneCore
167
167
  @xcode_version
168
168
  end
169
169
 
170
- # @return true if Xcode version is higher than 8.3
170
+ # @return true if installed Xcode version is 'greater than or equal to' the input parameter version
171
171
  def self.xcode_at_least?(version)
172
- FastlaneCore::UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if xcode_version.nil?
173
- v = xcode_version
174
- Gem::Version.new(v) >= Gem::Version.new(version)
172
+ installed_xcode_version = xcode_version
173
+ UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if installed_xcode_version.nil?
174
+ Gem::Version.new(installed_xcode_version) >= Gem::Version.new(version)
175
+ end
176
+
177
+ # Swift
178
+ #
179
+
180
+ # @return Swift version
181
+ def self.swift_version
182
+ if system("which swift > /dev/null 2>&1")
183
+ output = `swift --version`
184
+ return output.split("\n").first.match(/version ([0-9.]+)/).captures.first
185
+ end
186
+ return nil
175
187
  end
176
188
 
177
189
  # iTMSTransporter
@@ -203,9 +215,17 @@ module FastlaneCore
203
215
  return File.join(self.itms_path, 'iTMSTransporter')
204
216
  end
205
217
 
218
+ def self.user_defined_itms_path?
219
+ return FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
220
+ end
221
+
222
+ def self.user_defined_itms_path
223
+ return ENV["FASTLANE_ITUNES_TRANSPORTER_PATH"] if self.user_defined_itms_path?
224
+ end
225
+
206
226
  # @return the full path to the iTMSTransporter executable
207
227
  def self.itms_path
208
- return ENV["FASTLANE_ITUNES_TRANSPORTER_PATH"] if FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
228
+ return self.user_defined_itms_path if FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
209
229
 
210
230
  if self.mac?
211
231
  # First check for manually install iTMSTransporter
@@ -360,8 +380,37 @@ module FastlaneCore
360
380
 
361
381
  # checks if a given path is an executable file
362
382
  def self.executable?(cmd_path)
363
- # no executable files on Windows, so existing is enough there
364
- cmd_path && !File.directory?(cmd_path) && (File.executable?(cmd_path) || (self.windows? && File.exist?(cmd_path)))
383
+ if !cmd_path || File.directory?(cmd_path)
384
+ return false
385
+ end
386
+
387
+ return File.exist?(get_executable_path(cmd_path))
388
+ end
389
+
390
+ # returns the path of the executable with the correct extension on Windows
391
+ def self.get_executable_path(cmd_path)
392
+ cmd_path = localize_file_path(cmd_path)
393
+
394
+ if self.windows?
395
+ # PATHEXT contains the list of file extensions that Windows considers executable, semicolon separated.
396
+ # e.g. ".COM;.EXE;.BAT;.CMD"
397
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : []
398
+
399
+ # no executable files on Windows, so existing is enough there
400
+ # also check if command + ext is present
401
+ exts.each do |ext|
402
+ executable_path = "#{cmd_path}#{ext.downcase}"
403
+ return executable_path if File.exist?(executable_path)
404
+ end
405
+ end
406
+
407
+ return cmd_path
408
+ end
409
+
410
+ # returns the path with the platform-specific path separator (`/` on UNIX, `\` on Windows)
411
+ def self.localize_file_path(path)
412
+ # change `/` to `\` on Windows
413
+ return self.windows? ? path.gsub('/', '\\') : path
365
414
  end
366
415
 
367
416
  # checks if given file is a valid json file
@@ -417,20 +466,35 @@ module FastlaneCore
417
466
  UI.current.log
418
467
  end
419
468
 
420
- def self.ask_password(message: "Passphrase: ", confirm: nil)
469
+ def self.ask_password(message: "Passphrase: ", confirm: nil, confirmation_message: "Type passphrase again: ")
421
470
  raise "This code should only run in interactive mode" unless UI.interactive?
422
471
 
423
472
  loop do
424
473
  password = UI.password(message)
425
474
  if confirm
426
- password2 = UI.password("Type passphrase again: ")
475
+ password2 = UI.password(confirmation_message)
427
476
  if password == password2
428
477
  return password
429
478
  end
430
479
  else
431
480
  return password
432
481
  end
433
- UI.error("Passphrases differ. Try again")
482
+ UI.error("Your entries do not match. Please try again")
483
+ end
484
+ end
485
+
486
+ # URI.open added by `require 'open-uri'` is not available in Ruby 2.4. This helper lets you open a URI
487
+ # by choosing appropriate interface to do so depending on Ruby version. This helper is subject to be removed
488
+ # when fastlane drops Ruby 2.4 support.
489
+ def self.open_uri(*rest, &block)
490
+ require 'open-uri'
491
+
492
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5')
493
+ dup = rest.dup
494
+ uri = dup.shift
495
+ URI.parse(uri).open(*dup, &block)
496
+ else
497
+ URI.open(*rest, &block)
434
498
  end
435
499
  end
436
500
  end
@@ -1,3 +1,4 @@
1
+ require 'open3'
1
2
  require 'zip'
2
3
 
3
4
  require_relative 'core_ext/cfpropertylist'
@@ -37,27 +38,51 @@ module FastlaneCore
37
38
 
38
39
  def self.fetch_info_plist_file(path)
39
40
  UI.user_error!("Could not find file at path '#{path}'") unless File.exist?(path)
40
- Zip::File.open(path, "rb") do |zipfile|
41
- file = zipfile.glob('**/Payload/*.app/Info.plist').first
42
- return nil unless file
41
+ plist_data = self.fetch_info_plist_with_rubyzip(path)
42
+ if plist_data.nil?
43
+ # Xcode produces invalid zip files for IPAs larger than 4GB. RubyZip
44
+ # can't read them, but the unzip command is able to work around this.
45
+ plist_data = self.fetch_info_plist_with_unzip(path)
46
+ end
47
+ return nil if plist_data.nil?
43
48
 
44
- # Creates a temporary directory with a unique name tagged with 'fastlane'
45
- # The directory is deleted automatically at the end of the block
46
- Dir.mktmpdir("fastlane") do |tmp|
47
- # The XML file has to be properly unpacked first
48
- tmp_path = File.join(tmp, "Info.plist")
49
- File.open(tmp_path, 'wb') do |output|
50
- output.write(zipfile.read(file))
51
- end
52
- result = CFPropertyList.native_types(CFPropertyList::List.new(file: tmp_path).value)
53
-
54
- if result['CFBundleIdentifier'] || result['CFBundleVersion']
55
- return result
56
- end
49
+ # Creates a temporary directory with a unique name tagged with 'fastlane'
50
+ # The directory is deleted automatically at the end of the block
51
+ Dir.mktmpdir("fastlane") do |tmp|
52
+ # The XML file has to be properly unpacked first
53
+ tmp_path = File.join(tmp, "Info.plist")
54
+ File.open(tmp_path, 'wb') do |output|
55
+ output.write(plist_data)
56
+ end
57
+ result = CFPropertyList.native_types(CFPropertyList::List.new(file: tmp_path).value)
58
+
59
+ if result['CFBundleIdentifier'] || result['CFBundleVersion']
60
+ return result
57
61
  end
58
62
  end
59
63
 
60
64
  return nil
61
65
  end
66
+
67
+ def self.fetch_info_plist_with_rubyzip(path)
68
+ Zip::File.open(path, "rb") do |zipfile|
69
+ file = zipfile.glob('**/Payload/*.app/Info.plist').first
70
+ return nil unless file
71
+ zipfile.read(file)
72
+ end
73
+ end
74
+
75
+ def self.fetch_info_plist_with_unzip(path)
76
+ list, error, = Open3.capture3("unzip", "-Z", "-1", path)
77
+ UI.command_output(error) unless error.empty?
78
+ return nil if list.empty?
79
+ entry = list.chomp.split("\n").find do |e|
80
+ File.fnmatch("**/Payload/*.app/Info.plist", e, File::FNM_PATHNAME)
81
+ end
82
+ data, error, = Open3.capture3("unzip", "-p", path, entry)
83
+ UI.command_output(error) unless error.empty?
84
+ return nil if data.empty?
85
+ data
86
+ end
62
87
  end
63
88
  end