fastlane_hotfix 2.165.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (868) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE +21 -0
  4. data/README.md +208 -0
  5. data/bin/bin-proxy +19 -0
  6. data/bin/fastlane +23 -0
  7. data/cert/README.md +17 -0
  8. data/cert/lib/cert.rb +4 -0
  9. data/cert/lib/cert/commands_generator.rb +60 -0
  10. data/cert/lib/cert/module.rb +16 -0
  11. data/cert/lib/cert/options.rb +132 -0
  12. data/cert/lib/cert/runner.rb +239 -0
  13. data/credentials_manager/README.md +64 -0
  14. data/credentials_manager/lib/credentials_manager.rb +7 -0
  15. data/credentials_manager/lib/credentials_manager/account_manager.rb +157 -0
  16. data/credentials_manager/lib/credentials_manager/appfile_config.rb +196 -0
  17. data/credentials_manager/lib/credentials_manager/cli.rb +69 -0
  18. data/deliver/README.md +17 -0
  19. data/deliver/lib/assets/DeliverfileDefault +3 -0
  20. data/deliver/lib/assets/DeliverfileDefault.swift +13 -0
  21. data/deliver/lib/assets/ScreenshotsHelp +7 -0
  22. data/deliver/lib/assets/summary.html.erb +299 -0
  23. data/deliver/lib/deliver.rb +15 -0
  24. data/deliver/lib/deliver/app_screenshot.rb +354 -0
  25. data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
  26. data/deliver/lib/deliver/commands_generator.rb +190 -0
  27. data/deliver/lib/deliver/detect_values.rb +102 -0
  28. data/deliver/lib/deliver/download_screenshots.rb +76 -0
  29. data/deliver/lib/deliver/generate_summary.rb +13 -0
  30. data/deliver/lib/deliver/html_generator.rb +78 -0
  31. data/deliver/lib/deliver/languages.rb +7 -0
  32. data/deliver/lib/deliver/loader.rb +55 -0
  33. data/deliver/lib/deliver/module.rb +18 -0
  34. data/deliver/lib/deliver/options.rb +465 -0
  35. data/deliver/lib/deliver/queue_worker.rb +49 -0
  36. data/deliver/lib/deliver/runner.rb +233 -0
  37. data/deliver/lib/deliver/setup.rb +199 -0
  38. data/deliver/lib/deliver/submit_for_review.rb +214 -0
  39. data/deliver/lib/deliver/upload_metadata.rb +688 -0
  40. data/deliver/lib/deliver/upload_price_tier.rb +40 -0
  41. data/deliver/lib/deliver/upload_screenshots.rb +333 -0
  42. data/fastlane/README.md +11 -0
  43. data/fastlane/lib/assets/ActionDetails.md.erb +106 -0
  44. data/fastlane/lib/assets/Actions.md.erb +43 -0
  45. data/fastlane/lib/assets/AppfileTemplate +6 -0
  46. data/fastlane/lib/assets/AppfileTemplate.swift +7 -0
  47. data/fastlane/lib/assets/AppfileTemplateAndroid +2 -0
  48. data/fastlane/lib/assets/DefaultFastfileTemplate +20 -0
  49. data/fastlane/lib/assets/DefaultFastfileTemplate.swift +13 -0
  50. data/fastlane/lib/assets/completions/completion.bash +23 -0
  51. data/fastlane/lib/assets/completions/completion.fish +39 -0
  52. data/fastlane/lib/assets/completions/completion.sh +12 -0
  53. data/fastlane/lib/assets/completions/completion.zsh +23 -0
  54. data/fastlane/lib/assets/custom_action_template.rb +82 -0
  55. data/fastlane/lib/assets/mailgun_html_template.erb +142 -0
  56. data/fastlane/lib/assets/report_template.xml.erb +15 -0
  57. data/fastlane/lib/assets/s3_html_template.erb +105 -0
  58. data/fastlane/lib/assets/s3_plist_template.erb +31 -0
  59. data/fastlane/lib/assets/s3_version_template.erb +4 -0
  60. data/fastlane/lib/fastlane.rb +53 -0
  61. data/fastlane/lib/fastlane/action.rb +198 -0
  62. data/fastlane/lib/fastlane/action_collector.rb +35 -0
  63. data/fastlane/lib/fastlane/actions/README.md +5 -0
  64. data/fastlane/lib/fastlane/actions/actions_helper.rb +185 -0
  65. data/fastlane/lib/fastlane/actions/adb.rb +78 -0
  66. data/fastlane/lib/fastlane/actions/adb_devices.rb +71 -0
  67. data/fastlane/lib/fastlane/actions/add_extra_platforms.rb +45 -0
  68. data/fastlane/lib/fastlane/actions/add_git_tag.rb +122 -0
  69. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +249 -0
  70. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +134 -0
  71. data/fastlane/lib/fastlane/actions/appaloosa.rb +266 -0
  72. data/fastlane/lib/fastlane/actions/appetize.rb +188 -0
  73. data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +146 -0
  74. data/fastlane/lib/fastlane/actions/appium.rb +206 -0
  75. data/fastlane/lib/fastlane/actions/appledoc.rb +226 -0
  76. data/fastlane/lib/fastlane/actions/appstore.rb +14 -0
  77. data/fastlane/lib/fastlane/actions/apteligent.rb +105 -0
  78. data/fastlane/lib/fastlane/actions/artifactory.rb +157 -0
  79. data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +226 -0
  80. data/fastlane/lib/fastlane/actions/backup_file.rb +41 -0
  81. data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +135 -0
  82. data/fastlane/lib/fastlane/actions/badge.rb +155 -0
  83. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +107 -0
  84. data/fastlane/lib/fastlane/actions/build_android_app.rb +14 -0
  85. data/fastlane/lib/fastlane/actions/build_app.rb +165 -0
  86. data/fastlane/lib/fastlane/actions/build_ios_app.rb +47 -0
  87. data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
  88. data/fastlane/lib/fastlane/actions/bundle_install.rb +156 -0
  89. data/fastlane/lib/fastlane/actions/capture_android_screenshots.rb +63 -0
  90. data/fastlane/lib/fastlane/actions/capture_ios_screenshots.rb +61 -0
  91. data/fastlane/lib/fastlane/actions/capture_screenshots.rb +14 -0
  92. data/fastlane/lib/fastlane/actions/carthage.rb +230 -0
  93. data/fastlane/lib/fastlane/actions/cert.rb +14 -0
  94. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +197 -0
  95. data/fastlane/lib/fastlane/actions/chatwork.rb +94 -0
  96. data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +54 -0
  97. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +72 -0
  98. data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +52 -0
  99. data/fastlane/lib/fastlane/actions/clear_derived_data.rb +70 -0
  100. data/fastlane/lib/fastlane/actions/clipboard.rb +52 -0
  101. data/fastlane/lib/fastlane/actions/cloc.rb +89 -0
  102. data/fastlane/lib/fastlane/actions/cocoapods.rb +170 -0
  103. data/fastlane/lib/fastlane/actions/commit_github_file.rb +186 -0
  104. data/fastlane/lib/fastlane/actions/commit_version_bump.rb +301 -0
  105. data/fastlane/lib/fastlane/actions/copy_artifacts.rb +114 -0
  106. data/fastlane/lib/fastlane/actions/crashlytics.rb +211 -0
  107. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +174 -0
  108. data/fastlane/lib/fastlane/actions/create_app_online.rb +75 -0
  109. data/fastlane/lib/fastlane/actions/create_keychain.rb +177 -0
  110. data/fastlane/lib/fastlane/actions/create_pull_request.rb +265 -0
  111. data/fastlane/lib/fastlane/actions/danger.rb +131 -0
  112. data/fastlane/lib/fastlane/actions/debug.rb +32 -0
  113. data/fastlane/lib/fastlane/actions/default_platform.rb +47 -0
  114. data/fastlane/lib/fastlane/actions/delete_keychain.rb +68 -0
  115. data/fastlane/lib/fastlane/actions/deliver.rb +14 -0
  116. data/fastlane/lib/fastlane/actions/deploygate.rb +210 -0
  117. data/fastlane/lib/fastlane/actions/device_grid/README.md +157 -0
  118. data/fastlane/lib/fastlane/actions/docs/build_app.md +245 -0
  119. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +333 -0
  120. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +371 -0
  121. data/fastlane/lib/fastlane/actions/docs/check_app_store_metadata.md +103 -0
  122. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +282 -0
  123. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +349 -0
  124. data/fastlane/lib/fastlane/actions/docs/get_certificates.md +86 -0
  125. data/fastlane/lib/fastlane/actions/docs/get_provisioning_profile.md +223 -0
  126. data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +134 -0
  127. data/fastlane/lib/fastlane/actions/docs/run_tests.md +151 -0
  128. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +573 -0
  129. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +725 -0
  130. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +203 -0
  131. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +250 -0
  132. data/fastlane/lib/fastlane/actions/dotgpg_environment.rb +57 -0
  133. data/fastlane/lib/fastlane/actions/download.rb +76 -0
  134. data/fastlane/lib/fastlane/actions/download_dsyms.rb +369 -0
  135. data/fastlane/lib/fastlane/actions/download_from_play_store.rb +61 -0
  136. data/fastlane/lib/fastlane/actions/dsym_zip.rb +93 -0
  137. data/fastlane/lib/fastlane/actions/echo.rb +14 -0
  138. data/fastlane/lib/fastlane/actions/ensure_bundle_exec.rb +59 -0
  139. data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +58 -0
  140. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +69 -0
  141. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +92 -0
  142. data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +135 -0
  143. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +125 -0
  144. data/fastlane/lib/fastlane/actions/environment_variable.rb +77 -0
  145. data/fastlane/lib/fastlane/actions/erb.rb +96 -0
  146. data/fastlane/lib/fastlane/actions/fastlane_version.rb +15 -0
  147. data/fastlane/lib/fastlane/actions/flock.rb +82 -0
  148. data/fastlane/lib/fastlane/actions/frame_screenshots.rb +64 -0
  149. data/fastlane/lib/fastlane/actions/frameit.rb +14 -0
  150. data/fastlane/lib/fastlane/actions/gcovr.rb +163 -0
  151. data/fastlane/lib/fastlane/actions/get_build_number.rb +106 -0
  152. data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +120 -0
  153. data/fastlane/lib/fastlane/actions/get_certificates.rb +77 -0
  154. data/fastlane/lib/fastlane/actions/get_github_release.rb +166 -0
  155. data/fastlane/lib/fastlane/actions/get_info_plist_value.rb +78 -0
  156. data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +82 -0
  157. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +120 -0
  158. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +101 -0
  159. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +87 -0
  160. data/fastlane/lib/fastlane/actions/get_version_number.rb +200 -0
  161. data/fastlane/lib/fastlane/actions/git_add.rb +93 -0
  162. data/fastlane/lib/fastlane/actions/git_branch.rb +61 -0
  163. data/fastlane/lib/fastlane/actions/git_commit.rb +80 -0
  164. data/fastlane/lib/fastlane/actions/git_pull.rb +64 -0
  165. data/fastlane/lib/fastlane/actions/git_submodule_update.rb +52 -0
  166. data/fastlane/lib/fastlane/actions/git_tag_exists.rb +74 -0
  167. data/fastlane/lib/fastlane/actions/github_api.rb +262 -0
  168. data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
  169. data/fastlane/lib/fastlane/actions/google_play_track_version_codes.rb +77 -0
  170. data/fastlane/lib/fastlane/actions/gradle.rb +329 -0
  171. data/fastlane/lib/fastlane/actions/gym.rb +10 -0
  172. data/fastlane/lib/fastlane/actions/hg_add_tag.rb +48 -0
  173. data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +183 -0
  174. data/fastlane/lib/fastlane/actions/hg_ensure_clean_status.rb +53 -0
  175. data/fastlane/lib/fastlane/actions/hg_push.rb +64 -0
  176. data/fastlane/lib/fastlane/actions/hipchat.rb +200 -0
  177. data/fastlane/lib/fastlane/actions/hockey.rb +406 -0
  178. data/fastlane/lib/fastlane/actions/ifttt.rb +96 -0
  179. data/fastlane/lib/fastlane/actions/import.rb +49 -0
  180. data/fastlane/lib/fastlane/actions/import_certificate.rb +77 -0
  181. data/fastlane/lib/fastlane/actions/import_from_git.rb +83 -0
  182. data/fastlane/lib/fastlane/actions/increment_build_number.rb +117 -0
  183. data/fastlane/lib/fastlane/actions/increment_version_number.rb +180 -0
  184. data/fastlane/lib/fastlane/actions/install_on_device.rb +95 -0
  185. data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +58 -0
  186. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +91 -0
  187. data/fastlane/lib/fastlane/actions/installr.rb +132 -0
  188. data/fastlane/lib/fastlane/actions/ipa.rb +246 -0
  189. data/fastlane/lib/fastlane/actions/is_ci.rb +51 -0
  190. data/fastlane/lib/fastlane/actions/jazzy.rb +56 -0
  191. data/fastlane/lib/fastlane/actions/jira.rb +115 -0
  192. data/fastlane/lib/fastlane/actions/lane_context.rb +60 -0
  193. data/fastlane/lib/fastlane/actions/last_git_commit.rb +58 -0
  194. data/fastlane/lib/fastlane/actions/last_git_tag.rb +60 -0
  195. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +155 -0
  196. data/fastlane/lib/fastlane/actions/lcov.rb +102 -0
  197. data/fastlane/lib/fastlane/actions/mailgun.rb +197 -0
  198. data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +81 -0
  199. data/fastlane/lib/fastlane/actions/match.rb +14 -0
  200. data/fastlane/lib/fastlane/actions/min_fastlane_version.rb +57 -0
  201. data/fastlane/lib/fastlane/actions/modify_services.rb +173 -0
  202. data/fastlane/lib/fastlane/actions/nexus_upload.rb +230 -0
  203. data/fastlane/lib/fastlane/actions/notarize.rb +193 -0
  204. data/fastlane/lib/fastlane/actions/notification.rb +75 -0
  205. data/fastlane/lib/fastlane/actions/notify.rb +40 -0
  206. data/fastlane/lib/fastlane/actions/number_of_commits.rb +75 -0
  207. data/fastlane/lib/fastlane/actions/oclint.rb +269 -0
  208. data/fastlane/lib/fastlane/actions/onesignal.rb +186 -0
  209. data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +33 -0
  210. data/fastlane/lib/fastlane/actions/opt_out_usage.rb +40 -0
  211. data/fastlane/lib/fastlane/actions/pem.rb +14 -0
  212. data/fastlane/lib/fastlane/actions/pilot.rb +14 -0
  213. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +189 -0
  214. data/fastlane/lib/fastlane/actions/pod_push.rb +173 -0
  215. data/fastlane/lib/fastlane/actions/podio_item.rb +217 -0
  216. data/fastlane/lib/fastlane/actions/precheck.rb +14 -0
  217. data/fastlane/lib/fastlane/actions/println.rb +14 -0
  218. data/fastlane/lib/fastlane/actions/produce.rb +14 -0
  219. data/fastlane/lib/fastlane/actions/prompt.rb +119 -0
  220. data/fastlane/lib/fastlane/actions/push_git_tags.rb +76 -0
  221. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +127 -0
  222. data/fastlane/lib/fastlane/actions/puts.rb +68 -0
  223. data/fastlane/lib/fastlane/actions/read_podspec.rb +90 -0
  224. data/fastlane/lib/fastlane/actions/recreate_schemes.rb +46 -0
  225. data/fastlane/lib/fastlane/actions/register_device.rb +151 -0
  226. data/fastlane/lib/fastlane/actions/register_devices.rb +214 -0
  227. data/fastlane/lib/fastlane/actions/reset_git_repo.rb +121 -0
  228. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +92 -0
  229. data/fastlane/lib/fastlane/actions/resign.rb +132 -0
  230. data/fastlane/lib/fastlane/actions/restore_file.rb +44 -0
  231. data/fastlane/lib/fastlane/actions/rocket.rb +83 -0
  232. data/fastlane/lib/fastlane/actions/rsync.rb +74 -0
  233. data/fastlane/lib/fastlane/actions/ruby_version.rb +56 -0
  234. data/fastlane/lib/fastlane/actions/run_tests.rb +114 -0
  235. data/fastlane/lib/fastlane/actions/s3.rb +174 -0
  236. data/fastlane/lib/fastlane/actions/say.rb +56 -0
  237. data/fastlane/lib/fastlane/actions/scan.rb +14 -0
  238. data/fastlane/lib/fastlane/actions/scp.rb +114 -0
  239. data/fastlane/lib/fastlane/actions/screengrab.rb +14 -0
  240. data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +76 -0
  241. data/fastlane/lib/fastlane/actions/set_changelog.rb +204 -0
  242. data/fastlane/lib/fastlane/actions/set_github_release.rb +274 -0
  243. data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +92 -0
  244. data/fastlane/lib/fastlane/actions/set_pod_key.rb +78 -0
  245. data/fastlane/lib/fastlane/actions/setup_ci.rb +132 -0
  246. data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +58 -0
  247. data/fastlane/lib/fastlane/actions/setup_jenkins.rb +202 -0
  248. data/fastlane/lib/fastlane/actions/setup_travis.rb +57 -0
  249. data/fastlane/lib/fastlane/actions/sh.rb +71 -0
  250. data/fastlane/lib/fastlane/actions/sigh.rb +14 -0
  251. data/fastlane/lib/fastlane/actions/skip_docs.rb +52 -0
  252. data/fastlane/lib/fastlane/actions/slack.rb +288 -0
  253. data/fastlane/lib/fastlane/actions/slather.rb +329 -0
  254. data/fastlane/lib/fastlane/actions/snapshot.rb +14 -0
  255. data/fastlane/lib/fastlane/actions/sonar.rb +177 -0
  256. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +135 -0
  257. data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
  258. data/fastlane/lib/fastlane/actions/splunkmint.rb +156 -0
  259. data/fastlane/lib/fastlane/actions/spm.rb +138 -0
  260. data/fastlane/lib/fastlane/actions/ssh.rb +162 -0
  261. data/fastlane/lib/fastlane/actions/supply.rb +14 -0
  262. data/fastlane/lib/fastlane/actions/swiftlint.rb +240 -0
  263. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +109 -0
  264. data/fastlane/lib/fastlane/actions/team_id.rb +42 -0
  265. data/fastlane/lib/fastlane/actions/team_name.rb +42 -0
  266. data/fastlane/lib/fastlane/actions/testfairy.rb +285 -0
  267. data/fastlane/lib/fastlane/actions/testflight.rb +14 -0
  268. data/fastlane/lib/fastlane/actions/tryouts.rb +149 -0
  269. data/fastlane/lib/fastlane/actions/twitter.rb +89 -0
  270. data/fastlane/lib/fastlane/actions/typetalk.rb +93 -0
  271. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +132 -0
  272. data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +91 -0
  273. data/fastlane/lib/fastlane/actions/update_app_identifier.rb +124 -0
  274. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +203 -0
  275. data/fastlane/lib/fastlane/actions/update_fastlane.rb +137 -0
  276. data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +99 -0
  277. data/fastlane/lib/fastlane/actions/update_info_plist.rb +143 -0
  278. data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +94 -0
  279. data/fastlane/lib/fastlane/actions/update_plist.rb +115 -0
  280. data/fastlane/lib/fastlane/actions/update_project_code_signing.rb +76 -0
  281. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +173 -0
  282. data/fastlane/lib/fastlane/actions/update_project_team.rb +95 -0
  283. data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +91 -0
  284. data/fastlane/lib/fastlane/actions/update_url_schemes.rb +123 -0
  285. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +231 -0
  286. data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +165 -0
  287. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +67 -0
  288. data/fastlane/lib/fastlane/actions/upload_to_play_store.rb +80 -0
  289. data/fastlane/lib/fastlane/actions/upload_to_play_store_internal_app_sharing.rb +78 -0
  290. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +119 -0
  291. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +104 -0
  292. data/fastlane/lib/fastlane/actions/verify_build.rb +199 -0
  293. data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +67 -0
  294. data/fastlane/lib/fastlane/actions/verify_xcode.rb +159 -0
  295. data/fastlane/lib/fastlane/actions/version_bump_podspec.rb +105 -0
  296. data/fastlane/lib/fastlane/actions/version_get_podspec.rb +71 -0
  297. data/fastlane/lib/fastlane/actions/xcode_install.rb +105 -0
  298. data/fastlane/lib/fastlane/actions/xcode_select.rb +68 -0
  299. data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +312 -0
  300. data/fastlane/lib/fastlane/actions/xcodebuild.rb +641 -0
  301. data/fastlane/lib/fastlane/actions/xcov.rb +66 -0
  302. data/fastlane/lib/fastlane/actions/xctool.rb +55 -0
  303. data/fastlane/lib/fastlane/actions/xcversion.rb +55 -0
  304. data/fastlane/lib/fastlane/actions/zip.rb +120 -0
  305. data/fastlane/lib/fastlane/auto_complete.rb +82 -0
  306. data/fastlane/lib/fastlane/boolean.rb +5 -0
  307. data/fastlane/lib/fastlane/cli_tools_distributor.rb +207 -0
  308. data/fastlane/lib/fastlane/command_line_handler.rb +49 -0
  309. data/fastlane/lib/fastlane/commands_generator.rb +369 -0
  310. data/fastlane/lib/fastlane/configuration_helper.rb +26 -0
  311. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +14 -0
  312. data/fastlane/lib/fastlane/documentation/actions_list.rb +214 -0
  313. data/fastlane/lib/fastlane/documentation/docs_generator.rb +89 -0
  314. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +228 -0
  315. data/fastlane/lib/fastlane/environment_printer.rb +303 -0
  316. data/fastlane/lib/fastlane/erb_template_helper.rb +30 -0
  317. data/fastlane/lib/fastlane/fast_file.rb +439 -0
  318. data/fastlane/lib/fastlane/fastlane_require.rb +75 -0
  319. data/fastlane/lib/fastlane/features.rb +4 -0
  320. data/fastlane/lib/fastlane/helper/README.md +29 -0
  321. data/fastlane/lib/fastlane/helper/adb_helper.rb +66 -0
  322. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +157 -0
  323. data/fastlane/lib/fastlane/helper/dotenv_helper.rb +50 -0
  324. data/fastlane/lib/fastlane/helper/gem_helper.rb +26 -0
  325. data/fastlane/lib/fastlane/helper/git_helper.rb +137 -0
  326. data/fastlane/lib/fastlane/helper/gradle_helper.rb +62 -0
  327. data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
  328. data/fastlane/lib/fastlane/helper/podspec_helper.rb +75 -0
  329. data/fastlane/lib/fastlane/helper/s3_client_helper.rb +78 -0
  330. data/fastlane/lib/fastlane/helper/sh_helper.rb +134 -0
  331. data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +12 -0
  332. data/fastlane/lib/fastlane/helper/xcversion_helper.rb +25 -0
  333. data/fastlane/lib/fastlane/junit_generator.rb +27 -0
  334. data/fastlane/lib/fastlane/lane.rb +97 -0
  335. data/fastlane/lib/fastlane/lane_list.rb +137 -0
  336. data/fastlane/lib/fastlane/lane_manager.rb +130 -0
  337. data/fastlane/lib/fastlane/lane_manager_base.rb +92 -0
  338. data/fastlane/lib/fastlane/markdown_table_formatter.rb +62 -0
  339. data/fastlane/lib/fastlane/new_action.rb +47 -0
  340. data/fastlane/lib/fastlane/one_off.rb +45 -0
  341. data/fastlane/lib/fastlane/other_action.rb +29 -0
  342. data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +55 -0
  343. data/fastlane/lib/fastlane/plugins/plugin_generator.rb +86 -0
  344. data/fastlane/lib/fastlane/plugins/plugin_generator_ui.rb +19 -0
  345. data/fastlane/lib/fastlane/plugins/plugin_info.rb +49 -0
  346. data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +159 -0
  347. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +399 -0
  348. data/fastlane/lib/fastlane/plugins/plugin_search.rb +46 -0
  349. data/fastlane/lib/fastlane/plugins/plugin_update_manager.rb +70 -0
  350. data/fastlane/lib/fastlane/plugins/plugins.rb +12 -0
  351. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +35 -0
  352. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +43 -0
  353. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
  354. data/fastlane/lib/fastlane/plugins/template/.gitignore +12 -0
  355. data/fastlane/lib/fastlane/plugins/template/.rspec +5 -0
  356. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +188 -0
  357. data/fastlane/lib/fastlane/plugins/template/.travis.yml +4 -0
  358. data/fastlane/lib/fastlane/plugins/template/Gemfile +6 -0
  359. data/fastlane/lib/fastlane/plugins/template/LICENSE.erb +21 -0
  360. data/fastlane/lib/fastlane/plugins/template/README.md.erb +52 -0
  361. data/fastlane/lib/fastlane/plugins/template/Rakefile +9 -0
  362. data/fastlane/lib/fastlane/plugins/template/fastlane/Fastfile.erb +3 -0
  363. data/fastlane/lib/fastlane/plugins/template/fastlane/Pluginfile.erb +1 -0
  364. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%.rb.erb +16 -0
  365. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb +47 -0
  366. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb +16 -0
  367. data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/version.rb.erb +5 -0
  368. data/fastlane/lib/fastlane/plugins/template/spec/%plugin_name%_action_spec.rb.erb +9 -0
  369. data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +15 -0
  370. data/fastlane/lib/fastlane/runner.rb +378 -0
  371. data/fastlane/lib/fastlane/server/action_command.rb +61 -0
  372. data/fastlane/lib/fastlane/server/action_command_return.rb +14 -0
  373. data/fastlane/lib/fastlane/server/command_executor.rb +7 -0
  374. data/fastlane/lib/fastlane/server/command_parser.rb +44 -0
  375. data/fastlane/lib/fastlane/server/control_command.rb +23 -0
  376. data/fastlane/lib/fastlane/server/json_return_value_processor.rb +72 -0
  377. data/fastlane/lib/fastlane/server/socket_server.rb +238 -0
  378. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +101 -0
  379. data/fastlane/lib/fastlane/setup/setup.rb +355 -0
  380. data/fastlane/lib/fastlane/setup/setup_android.rb +97 -0
  381. data/fastlane/lib/fastlane/setup/setup_ios.rb +504 -0
  382. data/fastlane/lib/fastlane/shells.rb +6 -0
  383. data/fastlane/lib/fastlane/supported_platforms.rb +28 -0
  384. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +477 -0
  385. data/fastlane/lib/fastlane/swift_fastlane_function.rb +419 -0
  386. data/fastlane/lib/fastlane/swift_lane_manager.rb +296 -0
  387. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +210 -0
  388. data/fastlane/lib/fastlane/tools.rb +33 -0
  389. data/fastlane/lib/fastlane/version.rb +6 -0
  390. data/fastlane/swift/Actions.swift +16 -0
  391. data/fastlane/swift/Appfile.swift +15 -0
  392. data/fastlane/swift/ArgumentProcessor.swift +89 -0
  393. data/fastlane/swift/ControlCommand.swift +74 -0
  394. data/fastlane/swift/Deliverfile.swift +20 -0
  395. data/fastlane/swift/DeliverfileProtocol.swift +259 -0
  396. data/fastlane/swift/Fastfile.swift +16 -0
  397. data/fastlane/swift/Fastlane.swift +9402 -0
  398. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +434 -0
  399. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  400. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  401. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +97 -0
  402. data/fastlane/swift/FastlaneSwiftRunner/README.txt +10 -0
  403. data/fastlane/swift/Gymfile.swift +20 -0
  404. data/fastlane/swift/GymfileProtocol.swift +187 -0
  405. data/fastlane/swift/LaneFileProtocol.swift +149 -0
  406. data/fastlane/swift/MainProcess.swift +77 -0
  407. data/fastlane/swift/Matchfile.swift +20 -0
  408. data/fastlane/swift/MatchfileProtocol.swift +187 -0
  409. data/fastlane/swift/Plugins.swift +16 -0
  410. data/fastlane/swift/Precheckfile.swift +20 -0
  411. data/fastlane/swift/PrecheckfileProtocol.swift +51 -0
  412. data/fastlane/swift/RubyCommand.swift +157 -0
  413. data/fastlane/swift/RubyCommandable.swift +43 -0
  414. data/fastlane/swift/Runner.swift +275 -0
  415. data/fastlane/swift/RunnerArgument.swift +20 -0
  416. data/fastlane/swift/Scanfile.swift +20 -0
  417. data/fastlane/swift/ScanfileProtocol.swift +263 -0
  418. data/fastlane/swift/Screengrabfile.swift +20 -0
  419. data/fastlane/swift/ScreengrabfileProtocol.swift +99 -0
  420. data/fastlane/swift/Snapshotfile.swift +20 -0
  421. data/fastlane/swift/SnapshotfileProtocol.swift +187 -0
  422. data/fastlane/swift/SocketClient.swift +327 -0
  423. data/fastlane/swift/SocketClientDelegateProtocol.swift +21 -0
  424. data/fastlane/swift/SocketResponse.swift +82 -0
  425. data/fastlane/swift/formatting/Brewfile +1 -0
  426. data/fastlane/swift/formatting/Brewfile.lock.json +47 -0
  427. data/fastlane/swift/formatting/Rakefile +18 -0
  428. data/fastlane/swift/main.swift +47 -0
  429. data/fastlane/swift/upgrade_manifest.json +1 -0
  430. data/fastlane_core/README.md +79 -0
  431. data/fastlane_core/lib/assets/XMLTemplate.xml.erb +12 -0
  432. data/fastlane_core/lib/fastlane_core.rb +46 -0
  433. data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +34 -0
  434. data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +38 -0
  435. data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +23 -0
  436. data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +54 -0
  437. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +70 -0
  438. data/fastlane_core/lib/fastlane_core/analytics/app_identifier_guesser.rb +64 -0
  439. data/fastlane_core/lib/fastlane_core/android_package_name_guesser.rb +79 -0
  440. data/fastlane_core/lib/fastlane_core/build_watcher.rb +96 -0
  441. data/fastlane_core/lib/fastlane_core/cert_checker.rb +144 -0
  442. data/fastlane_core/lib/fastlane_core/command_executor.rb +100 -0
  443. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +103 -0
  444. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +321 -0
  445. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +332 -0
  446. data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +182 -0
  447. data/fastlane_core/lib/fastlane_core/core_ext/cfpropertylist.rb +23 -0
  448. data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
  449. data/fastlane_core/lib/fastlane_core/core_ext/string.rb +17 -0
  450. data/fastlane_core/lib/fastlane_core/device_manager.rb +374 -0
  451. data/fastlane_core/lib/fastlane_core/env.rb +9 -0
  452. data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +72 -0
  453. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +57 -0
  454. data/fastlane_core/lib/fastlane_core/feature/feature.rb +51 -0
  455. data/fastlane_core/lib/fastlane_core/features.rb +4 -0
  456. data/fastlane_core/lib/fastlane_core/globals.rb +27 -0
  457. data/fastlane_core/lib/fastlane_core/helper.rb +437 -0
  458. data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +112 -0
  459. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +63 -0
  460. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +52 -0
  461. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +595 -0
  462. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +120 -0
  463. data/fastlane_core/lib/fastlane_core/languages.rb +16 -0
  464. data/fastlane_core/lib/fastlane_core/module.rb +31 -0
  465. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +51 -0
  466. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +48 -0
  467. data/fastlane_core/lib/fastlane_core/print_table.rb +131 -0
  468. data/fastlane_core/lib/fastlane_core/project.rb +509 -0
  469. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +124 -0
  470. data/fastlane_core/lib/fastlane_core/string_filters.rb +51 -0
  471. data/fastlane_core/lib/fastlane_core/swag.rb +85 -0
  472. data/fastlane_core/lib/fastlane_core/tag_version.rb +31 -0
  473. data/fastlane_core/lib/fastlane_core/test_parser.rb +107 -0
  474. data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +17 -0
  475. data/fastlane_core/lib/fastlane_core/ui/errors.rb +1 -0
  476. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb +19 -0
  477. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_crash.rb +11 -0
  478. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_error.rb +25 -0
  479. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_exception.rb +19 -0
  480. data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_shell_error.rb +11 -0
  481. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +294 -0
  482. data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +62 -0
  483. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +159 -0
  484. data/fastlane_core/lib/fastlane_core/ui/interface.rb +205 -0
  485. data/fastlane_core/lib/fastlane_core/ui/ui.rb +26 -0
  486. data/fastlane_core/lib/fastlane_core/update_checker/changelog.rb +37 -0
  487. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +109 -0
  488. data/frameit/README.md +17 -0
  489. data/frameit/lib/assets/empty.png +0 -0
  490. data/frameit/lib/frameit.rb +13 -0
  491. data/frameit/lib/frameit/commands_generator.rb +140 -0
  492. data/frameit/lib/frameit/config_parser.rb +136 -0
  493. data/frameit/lib/frameit/dependency_checker.rb +22 -0
  494. data/frameit/lib/frameit/device.rb +90 -0
  495. data/frameit/lib/frameit/device_types.rb +144 -0
  496. data/frameit/lib/frameit/editor.rb +560 -0
  497. data/frameit/lib/frameit/frame_downloader.rb +85 -0
  498. data/frameit/lib/frameit/mac_editor.rb +35 -0
  499. data/frameit/lib/frameit/module.rb +42 -0
  500. data/frameit/lib/frameit/offsets.rb +28 -0
  501. data/frameit/lib/frameit/options.rb +112 -0
  502. data/frameit/lib/frameit/runner.rb +97 -0
  503. data/frameit/lib/frameit/screenshot.rb +134 -0
  504. data/frameit/lib/frameit/strings_parser.rb +46 -0
  505. data/frameit/lib/frameit/template_finder.rb +45 -0
  506. data/frameit/lib/frameit/trim_box.rb +35 -0
  507. data/gym/README.md +17 -0
  508. data/gym/lib/assets/GymfileTemplate +13 -0
  509. data/gym/lib/assets/GymfileTemplate.swift +13 -0
  510. data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +61 -0
  511. data/gym/lib/gym.rb +9 -0
  512. data/gym/lib/gym/code_signing_mapping.rb +210 -0
  513. data/gym/lib/gym/commands_generator.rb +78 -0
  514. data/gym/lib/gym/detect_values.rb +206 -0
  515. data/gym/lib/gym/error_handler.rb +306 -0
  516. data/gym/lib/gym/generators/README.md +1 -0
  517. data/gym/lib/gym/generators/build_command_generator.rb +147 -0
  518. data/gym/lib/gym/generators/package_command_generator.rb +68 -0
  519. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +232 -0
  520. data/gym/lib/gym/manager.rb +22 -0
  521. data/gym/lib/gym/module.rb +74 -0
  522. data/gym/lib/gym/options.rb +286 -0
  523. data/gym/lib/gym/runner.rb +365 -0
  524. data/gym/lib/gym/xcode.rb +27 -0
  525. data/gym/lib/gym/xcodebuild_fixes/README.md +9 -0
  526. data/gym/lib/gym/xcodebuild_fixes/generic_archive_fix.rb +35 -0
  527. data/match/README.md +17 -0
  528. data/match/lib/assets/MatchfileTemplate +11 -0
  529. data/match/lib/assets/MatchfileTemplate.swift +9 -0
  530. data/match/lib/assets/READMETemplate.md +59 -0
  531. data/match/lib/match.rb +14 -0
  532. data/match/lib/match/change_password.rb +53 -0
  533. data/match/lib/match/commands_generator.rb +190 -0
  534. data/match/lib/match/encryption.rb +49 -0
  535. data/match/lib/match/encryption/interface.rb +17 -0
  536. data/match/lib/match/encryption/openssl.rb +161 -0
  537. data/match/lib/match/generator.rb +122 -0
  538. data/match/lib/match/importer.rb +157 -0
  539. data/match/lib/match/migrate.rb +109 -0
  540. data/match/lib/match/module.rb +32 -0
  541. data/match/lib/match/nuke.rb +350 -0
  542. data/match/lib/match/options.rb +315 -0
  543. data/match/lib/match/runner.rb +369 -0
  544. data/match/lib/match/setup.rb +40 -0
  545. data/match/lib/match/spaceship_ensure.rb +97 -0
  546. data/match/lib/match/storage.rb +46 -0
  547. data/match/lib/match/storage/git_storage.rb +250 -0
  548. data/match/lib/match/storage/google_cloud_storage.rb +382 -0
  549. data/match/lib/match/storage/interface.rb +119 -0
  550. data/match/lib/match/storage/s3_storage.rb +205 -0
  551. data/match/lib/match/table_printer.rb +51 -0
  552. data/match/lib/match/utils.rb +75 -0
  553. data/pem/README.md +17 -0
  554. data/pem/lib/pem.rb +4 -0
  555. data/pem/lib/pem/commands_generator.rb +47 -0
  556. data/pem/lib/pem/manager.rb +112 -0
  557. data/pem/lib/pem/module.rb +19 -0
  558. data/pem/lib/pem/options.rb +103 -0
  559. data/pilot/README.md +17 -0
  560. data/pilot/lib/pilot.rb +9 -0
  561. data/pilot/lib/pilot/build_manager.rb +546 -0
  562. data/pilot/lib/pilot/commands_generator.rb +174 -0
  563. data/pilot/lib/pilot/features.rb +0 -0
  564. data/pilot/lib/pilot/manager.rb +90 -0
  565. data/pilot/lib/pilot/module.rb +11 -0
  566. data/pilot/lib/pilot/options.rb +303 -0
  567. data/pilot/lib/pilot/tester_exporter.rb +58 -0
  568. data/pilot/lib/pilot/tester_importer.rb +53 -0
  569. data/pilot/lib/pilot/tester_manager.rb +168 -0
  570. data/pilot/lib/pilot/tester_util.rb +0 -0
  571. data/precheck/README.md +17 -0
  572. data/precheck/lib/assets/PrecheckfileTemplate +27 -0
  573. data/precheck/lib/assets/PrecheckfileTemplate.swift +19 -0
  574. data/precheck/lib/precheck.rb +3 -0
  575. data/precheck/lib/precheck/commands_generator.rb +74 -0
  576. data/precheck/lib/precheck/item_to_check.rb +58 -0
  577. data/precheck/lib/precheck/module.rb +21 -0
  578. data/precheck/lib/precheck/options.rb +104 -0
  579. data/precheck/lib/precheck/rule.rb +171 -0
  580. data/precheck/lib/precheck/rule_check_result.rb +19 -0
  581. data/precheck/lib/precheck/rule_processor.rb +265 -0
  582. data/precheck/lib/precheck/rules/abstract_text_match_rule.rb +80 -0
  583. data/precheck/lib/precheck/rules/all.rb +1 -0
  584. data/precheck/lib/precheck/rules/copyright_date_rule.rb +37 -0
  585. data/precheck/lib/precheck/rules/curse_words_rule.rb +62 -0
  586. data/precheck/lib/precheck/rules/custom_text_rule.rb +35 -0
  587. data/precheck/lib/precheck/rules/free_stuff_iap_rule.rb +31 -0
  588. data/precheck/lib/precheck/rules/future_functionality_rule.rb +33 -0
  589. data/precheck/lib/precheck/rules/negative_apple_sentiment_rule.rb +37 -0
  590. data/precheck/lib/precheck/rules/other_platforms_rule.rb +43 -0
  591. data/precheck/lib/precheck/rules/placeholder_words_rule.rb +31 -0
  592. data/precheck/lib/precheck/rules/rules_data/curse_word_hashes/en_us.txt +349 -0
  593. data/precheck/lib/precheck/rules/test_words_rule.rb +30 -0
  594. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +47 -0
  595. data/precheck/lib/precheck/runner.rb +197 -0
  596. data/produce/README.md +17 -0
  597. data/produce/lib/produce.rb +6 -0
  598. data/produce/lib/produce/available_default_languages.rb +51 -0
  599. data/produce/lib/produce/cloud_container.rb +82 -0
  600. data/produce/lib/produce/commands_generator.rb +236 -0
  601. data/produce/lib/produce/developer_center.rb +143 -0
  602. data/produce/lib/produce/group.rb +90 -0
  603. data/produce/lib/produce/itunes_connect.rb +139 -0
  604. data/produce/lib/produce/manager.rb +15 -0
  605. data/produce/lib/produce/merchant.rb +121 -0
  606. data/produce/lib/produce/module.rb +14 -0
  607. data/produce/lib/produce/options.rb +184 -0
  608. data/produce/lib/produce/service.rb +319 -0
  609. data/scan/README.md +17 -0
  610. data/scan/lib/assets/ScanfileTemplate +16 -0
  611. data/scan/lib/assets/ScanfileTemplate.swift +13 -0
  612. data/scan/lib/scan.rb +10 -0
  613. data/scan/lib/scan/commands_generator.rb +78 -0
  614. data/scan/lib/scan/detect_values.rb +224 -0
  615. data/scan/lib/scan/error_handler.rb +57 -0
  616. data/scan/lib/scan/manager.rb +38 -0
  617. data/scan/lib/scan/module.rb +32 -0
  618. data/scan/lib/scan/options.rb +445 -0
  619. data/scan/lib/scan/runner.rb +197 -0
  620. data/scan/lib/scan/slack_poster.rb +60 -0
  621. data/scan/lib/scan/test_command_generator.rb +174 -0
  622. data/scan/lib/scan/test_result_parser.rb +33 -0
  623. data/scan/lib/scan/xcpretty_reporter_options_generator.rb +85 -0
  624. data/screengrab/README.md +17 -0
  625. data/screengrab/lib/assets/ScreengrabfileTemplate +15 -0
  626. data/screengrab/lib/assets/ScreengrabfileTemplate.swift +15 -0
  627. data/screengrab/lib/screengrab.rb +7 -0
  628. data/screengrab/lib/screengrab/android_environment.rb +91 -0
  629. data/screengrab/lib/screengrab/commands_generator.rb +70 -0
  630. data/screengrab/lib/screengrab/dependency_checker.rb +58 -0
  631. data/screengrab/lib/screengrab/detect_values.rb +16 -0
  632. data/screengrab/lib/screengrab/module.rb +26 -0
  633. data/screengrab/lib/screengrab/options.rb +148 -0
  634. data/screengrab/lib/screengrab/page.html.erb +190 -0
  635. data/screengrab/lib/screengrab/reports_generator.rb +36 -0
  636. data/screengrab/lib/screengrab/runner.rb +449 -0
  637. data/screengrab/lib/screengrab/setup.rb +24 -0
  638. data/sigh/README.md +17 -0
  639. data/sigh/lib/assets/resign.sh +909 -0
  640. data/sigh/lib/sigh.rb +4 -0
  641. data/sigh/lib/sigh/commands_generator.rb +154 -0
  642. data/sigh/lib/sigh/download_all.rb +112 -0
  643. data/sigh/lib/sigh/local_manage.rb +145 -0
  644. data/sigh/lib/sigh/manager.rb +47 -0
  645. data/sigh/lib/sigh/module.rb +42 -0
  646. data/sigh/lib/sigh/options.rb +187 -0
  647. data/sigh/lib/sigh/repair.rb +34 -0
  648. data/sigh/lib/sigh/resign.rb +220 -0
  649. data/sigh/lib/sigh/runner.rb +402 -0
  650. data/snapshot/README.md +17 -0
  651. data/snapshot/lib/assets/SnapfileTemplate +37 -0
  652. data/snapshot/lib/assets/SnapfileTemplate.swift +41 -0
  653. data/snapshot/lib/assets/SnapshotHelper.swift +301 -0
  654. data/snapshot/lib/assets/SnapshotHelperXcode8.swift +172 -0
  655. data/snapshot/lib/snapshot.rb +19 -0
  656. data/snapshot/lib/snapshot/collector.rb +140 -0
  657. data/snapshot/lib/snapshot/commands_generator.rb +115 -0
  658. data/snapshot/lib/snapshot/dependency_checker.rb +69 -0
  659. data/snapshot/lib/snapshot/detect_values.rb +86 -0
  660. data/snapshot/lib/snapshot/error_handler.rb +24 -0
  661. data/snapshot/lib/snapshot/fixes/README.md +5 -0
  662. data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +27 -0
  663. data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
  664. data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +27 -0
  665. data/snapshot/lib/snapshot/latest_os_version.rb +34 -0
  666. data/snapshot/lib/snapshot/module.rb +44 -0
  667. data/snapshot/lib/snapshot/options.rb +290 -0
  668. data/snapshot/lib/snapshot/page.html.erb +285 -0
  669. data/snapshot/lib/snapshot/reports_generator.rb +139 -0
  670. data/snapshot/lib/snapshot/reset_simulators.rb +122 -0
  671. data/snapshot/lib/snapshot/runner.rb +146 -0
  672. data/snapshot/lib/snapshot/screenshot_flatten.rb +20 -0
  673. data/snapshot/lib/snapshot/screenshot_rotate.rb +36 -0
  674. data/snapshot/lib/snapshot/setup.rb +58 -0
  675. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +62 -0
  676. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +219 -0
  677. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +200 -0
  678. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +113 -0
  679. data/snapshot/lib/snapshot/test_command_generator.rb +108 -0
  680. data/snapshot/lib/snapshot/test_command_generator_base.rb +128 -0
  681. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +70 -0
  682. data/snapshot/lib/snapshot/update.rb +38 -0
  683. data/spaceship/README.md +183 -0
  684. data/spaceship/lib/assets/displayFamilies.json +181 -0
  685. data/spaceship/lib/assets/languageMapping.json +306 -0
  686. data/spaceship/lib/assets/languageMappingReadable.json +30 -0
  687. data/spaceship/lib/spaceship.rb +30 -0
  688. data/spaceship/lib/spaceship/base.rb +310 -0
  689. data/spaceship/lib/spaceship/client.rb +913 -0
  690. data/spaceship/lib/spaceship/commands_generator.rb +53 -0
  691. data/spaceship/lib/spaceship/connect_api.rb +116 -0
  692. data/spaceship/lib/spaceship/connect_api/api_client.rb +279 -0
  693. data/spaceship/lib/spaceship/connect_api/client.rb +216 -0
  694. data/spaceship/lib/spaceship/connect_api/file_uploader.rb +99 -0
  695. data/spaceship/lib/spaceship/connect_api/model.rb +172 -0
  696. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +114 -0
  697. data/spaceship/lib/spaceship/connect_api/models/app.rb +388 -0
  698. data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
  699. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +95 -0
  700. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +39 -0
  701. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +131 -0
  702. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +100 -0
  703. data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
  704. data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
  705. data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
  706. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +187 -0
  707. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +153 -0
  708. data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +71 -0
  709. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
  710. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +217 -0
  711. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +85 -0
  712. data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +57 -0
  713. data/spaceship/lib/spaceship/connect_api/models/app_store_version_release_request.rb +12 -0
  714. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
  715. data/spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb +28 -0
  716. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb +32 -0
  717. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +26 -0
  718. data/spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb +20 -0
  719. data/spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb +24 -0
  720. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +75 -0
  721. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +41 -0
  722. data/spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb +18 -0
  723. data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +57 -0
  724. data/spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb +44 -0
  725. data/spaceship/lib/spaceship/connect_api/models/build.rb +172 -0
  726. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +61 -0
  727. data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +36 -0
  728. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +58 -0
  729. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +71 -0
  730. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +102 -0
  731. data/spaceship/lib/spaceship/connect_api/models/custom_app_organization.rb +43 -0
  732. data/spaceship/lib/spaceship/connect_api/models/custom_app_user.rb +41 -0
  733. data/spaceship/lib/spaceship/connect_api/models/device.rb +58 -0
  734. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +41 -0
  735. data/spaceship/lib/spaceship/connect_api/models/pre_release_version.rb +20 -0
  736. data/spaceship/lib/spaceship/connect_api/models/profile.rb +97 -0
  737. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
  738. data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +64 -0
  739. data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
  740. data/spaceship/lib/spaceship/connect_api/models/user.rb +51 -0
  741. data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +59 -0
  742. data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +92 -0
  743. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +143 -0
  744. data/spaceship/lib/spaceship/connect_api/response.rb +67 -0
  745. data/spaceship/lib/spaceship/connect_api/spaceship.rb +102 -0
  746. data/spaceship/lib/spaceship/connect_api/testflight/client.rb +24 -0
  747. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +391 -0
  748. data/spaceship/lib/spaceship/connect_api/token.rb +102 -0
  749. data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
  750. data/spaceship/lib/spaceship/connect_api/tunes/client.rb +24 -0
  751. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +1045 -0
  752. data/spaceship/lib/spaceship/connect_api/users/client.rb +24 -0
  753. data/spaceship/lib/spaceship/connect_api/users/users.rb +80 -0
  754. data/spaceship/lib/spaceship/du/du_client.rb +138 -0
  755. data/spaceship/lib/spaceship/du/upload_file.rb +58 -0
  756. data/spaceship/lib/spaceship/du/utilities.rb +99 -0
  757. data/spaceship/lib/spaceship/errors.rb +82 -0
  758. data/spaceship/lib/spaceship/globals.rb +12 -0
  759. data/spaceship/lib/spaceship/helper/net_http_generic_request.rb +20 -0
  760. data/spaceship/lib/spaceship/helper/plist_middleware.rb +16 -0
  761. data/spaceship/lib/spaceship/helper/rels_middleware.rb +28 -0
  762. data/spaceship/lib/spaceship/launcher.rb +99 -0
  763. data/spaceship/lib/spaceship/module.rb +8 -0
  764. data/spaceship/lib/spaceship/playground.rb +75 -0
  765. data/spaceship/lib/spaceship/portal/app.rb +201 -0
  766. data/spaceship/lib/spaceship/portal/app_group.rb +73 -0
  767. data/spaceship/lib/spaceship/portal/app_service.rb +87 -0
  768. data/spaceship/lib/spaceship/portal/certificate.rb +365 -0
  769. data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
  770. data/spaceship/lib/spaceship/portal/device.rb +191 -0
  771. data/spaceship/lib/spaceship/portal/invite.rb +53 -0
  772. data/spaceship/lib/spaceship/portal/key.rb +101 -0
  773. data/spaceship/lib/spaceship/portal/legacy_wrapper.rb +21 -0
  774. data/spaceship/lib/spaceship/portal/merchant.rb +86 -0
  775. data/spaceship/lib/spaceship/portal/passbook.rb +78 -0
  776. data/spaceship/lib/spaceship/portal/person.rb +62 -0
  777. data/spaceship/lib/spaceship/portal/persons.rb +67 -0
  778. data/spaceship/lib/spaceship/portal/portal.rb +17 -0
  779. data/spaceship/lib/spaceship/portal/portal_base.rb +16 -0
  780. data/spaceship/lib/spaceship/portal/portal_client.rb +862 -0
  781. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +559 -0
  782. data/spaceship/lib/spaceship/portal/provisioning_profile_template.rb +52 -0
  783. data/spaceship/lib/spaceship/portal/spaceship.rb +154 -0
  784. data/spaceship/lib/spaceship/portal/ui/select_team.rb +116 -0
  785. data/spaceship/lib/spaceship/portal/website_push.rb +88 -0
  786. data/spaceship/lib/spaceship/provider.rb +13 -0
  787. data/spaceship/lib/spaceship/spaceauth_runner.rb +74 -0
  788. data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
  789. data/spaceship/lib/spaceship/test_flight.rb +10 -0
  790. data/spaceship/lib/spaceship/test_flight/app_test_info.rb +40 -0
  791. data/spaceship/lib/spaceship/test_flight/base.rb +39 -0
  792. data/spaceship/lib/spaceship/test_flight/beta_review_info.rb +19 -0
  793. data/spaceship/lib/spaceship/test_flight/build.rb +242 -0
  794. data/spaceship/lib/spaceship/test_flight/build_trains.rb +50 -0
  795. data/spaceship/lib/spaceship/test_flight/client.rb +361 -0
  796. data/spaceship/lib/spaceship/test_flight/export_compliance.rb +12 -0
  797. data/spaceship/lib/spaceship/test_flight/group.rb +131 -0
  798. data/spaceship/lib/spaceship/test_flight/test_info.rb +56 -0
  799. data/spaceship/lib/spaceship/test_flight/tester.rb +136 -0
  800. data/spaceship/lib/spaceship/tunes/app_analytics.rb +168 -0
  801. data/spaceship/lib/spaceship/tunes/app_details.rb +147 -0
  802. data/spaceship/lib/spaceship/tunes/app_image.rb +51 -0
  803. data/spaceship/lib/spaceship/tunes/app_ratings.rb +58 -0
  804. data/spaceship/lib/spaceship/tunes/app_review.rb +55 -0
  805. data/spaceship/lib/spaceship/tunes/app_review_attachment.rb +49 -0
  806. data/spaceship/lib/spaceship/tunes/app_screenshot.rb +12 -0
  807. data/spaceship/lib/spaceship/tunes/app_status.rb +63 -0
  808. data/spaceship/lib/spaceship/tunes/app_submission.rb +161 -0
  809. data/spaceship/lib/spaceship/tunes/app_trailer.rb +64 -0
  810. data/spaceship/lib/spaceship/tunes/app_version.rb +970 -0
  811. data/spaceship/lib/spaceship/tunes/app_version_common.rb +35 -0
  812. data/spaceship/lib/spaceship/tunes/app_version_generated_promocodes.rb +28 -0
  813. data/spaceship/lib/spaceship/tunes/app_version_history.rb +52 -0
  814. data/spaceship/lib/spaceship/tunes/app_version_promocodes.rb +27 -0
  815. data/spaceship/lib/spaceship/tunes/app_version_ref.rb +15 -0
  816. data/spaceship/lib/spaceship/tunes/app_version_states_history.rb +27 -0
  817. data/spaceship/lib/spaceship/tunes/application.rb +453 -0
  818. data/spaceship/lib/spaceship/tunes/availability.rb +164 -0
  819. data/spaceship/lib/spaceship/tunes/b2b_organization.rb +50 -0
  820. data/spaceship/lib/spaceship/tunes/b2b_user.rb +30 -0
  821. data/spaceship/lib/spaceship/tunes/build.rb +263 -0
  822. data/spaceship/lib/spaceship/tunes/build_details.rb +184 -0
  823. data/spaceship/lib/spaceship/tunes/build_train.rb +181 -0
  824. data/spaceship/lib/spaceship/tunes/developer_response.rb +23 -0
  825. data/spaceship/lib/spaceship/tunes/device_type.rb +17 -0
  826. data/spaceship/lib/spaceship/tunes/display_family.rb +84 -0
  827. data/spaceship/lib/spaceship/tunes/errors.rb +17 -0
  828. data/spaceship/lib/spaceship/tunes/iap.rb +168 -0
  829. data/spaceship/lib/spaceship/tunes/iap_detail.rb +264 -0
  830. data/spaceship/lib/spaceship/tunes/iap_families.rb +68 -0
  831. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +90 -0
  832. data/spaceship/lib/spaceship/tunes/iap_family_list.rb +28 -0
  833. data/spaceship/lib/spaceship/tunes/iap_list.rb +76 -0
  834. data/spaceship/lib/spaceship/tunes/iap_status.rb +56 -0
  835. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_info.rb +46 -0
  836. data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_tier.rb +25 -0
  837. data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
  838. data/spaceship/lib/spaceship/tunes/language_converter.rb +65 -0
  839. data/spaceship/lib/spaceship/tunes/language_item.rb +61 -0
  840. data/spaceship/lib/spaceship/tunes/legacy_wrapper.rb +13 -0
  841. data/spaceship/lib/spaceship/tunes/member.rb +84 -0
  842. data/spaceship/lib/spaceship/tunes/members.rb +35 -0
  843. data/spaceship/lib/spaceship/tunes/pricing_info.rb +42 -0
  844. data/spaceship/lib/spaceship/tunes/pricing_tier.rb +25 -0
  845. data/spaceship/lib/spaceship/tunes/sandbox_tester.rb +74 -0
  846. data/spaceship/lib/spaceship/tunes/spaceship.rb +39 -0
  847. data/spaceship/lib/spaceship/tunes/territory.rb +39 -0
  848. data/spaceship/lib/spaceship/tunes/transit_app_file.rb +23 -0
  849. data/spaceship/lib/spaceship/tunes/tunes.rb +35 -0
  850. data/spaceship/lib/spaceship/tunes/tunes_base.rb +17 -0
  851. data/spaceship/lib/spaceship/tunes/tunes_client.rb +1644 -0
  852. data/spaceship/lib/spaceship/tunes/user_detail.rb +15 -0
  853. data/spaceship/lib/spaceship/tunes/version_set.rb +26 -0
  854. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +346 -0
  855. data/spaceship/lib/spaceship/ui.rb +27 -0
  856. data/supply/README.md +17 -0
  857. data/supply/lib/supply.rb +53 -0
  858. data/supply/lib/supply/apk_listing.rb +14 -0
  859. data/supply/lib/supply/client.rb +551 -0
  860. data/supply/lib/supply/commands_generator.rb +67 -0
  861. data/supply/lib/supply/languages.rb +88 -0
  862. data/supply/lib/supply/listing.rb +32 -0
  863. data/supply/lib/supply/options.rb +324 -0
  864. data/supply/lib/supply/reader.rb +41 -0
  865. data/supply/lib/supply/release_listing.rb +18 -0
  866. data/supply/lib/supply/setup.rb +122 -0
  867. data/supply/lib/supply/uploader.rb +480 -0
  868. metadata +1832 -0
data/pem/README.md ADDED
@@ -0,0 +1,17 @@
1
+ <h3 align="center">
2
+ <a href="https://docs.fastlane.tools/actions/pem/">
3
+ <img src="https://raw.githubusercontent.com/fastlane/fastlane/master/fastlane/assets/fastlane.png" width="100" />
4
+ <br />
5
+ fastlane
6
+ </a>
7
+ </h3>
8
+
9
+ ------
10
+
11
+ <p align="center">
12
+ <a href="https://docs.fastlane.tools/actions/pem/">
13
+ <img src="https://raw.githubusercontent.com/fastlane/fastlane/master/pem/assets/pem.png" height="110">
14
+ </a>
15
+ </p>
16
+
17
+ <h3 align="center">The <i>pem</i> docs were moved to <a href='https://docs.fastlane.tools/actions/pem/'>docs.fastlane.tools</a></h3>
data/pem/lib/pem.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative 'pem/manager'
2
+ require_relative 'pem/options'
3
+
4
+ require_relative 'pem/module'
@@ -0,0 +1,47 @@
1
+ require 'commander'
2
+
3
+ require 'fastlane/version'
4
+ require 'fastlane_core/configuration/configuration'
5
+ require_relative 'options'
6
+ require_relative 'manager'
7
+
8
+ HighLine.track_eof = false
9
+
10
+ module PEM
11
+ class CommandsGenerator
12
+ include Commander::Methods
13
+
14
+ def self.start
15
+ self.new.run
16
+ end
17
+
18
+ def run
19
+ program :name, 'pem'
20
+ program :version, Fastlane::VERSION
21
+ program :description, 'CLI for \'PEM\' - Automatically generate and renew your push notification profiles'
22
+ program :help, 'Author', 'Felix Krause <pem@krausefx.com>'
23
+ program :help, 'Website', 'https://fastlane.tools'
24
+ program :help, 'Documentation', 'https://docs.fastlane.tools/actions/pem/'
25
+ program :help_formatter, :compact
26
+
27
+ global_option('--verbose') { FastlaneCore::Globals.verbose = true }
28
+ global_option('--env STRING[,STRING2]', String, 'Add environment(s) to use with `dotenv`')
29
+
30
+ command :renew do |c|
31
+ c.syntax = 'fastlane pem renew'
32
+ c.description = 'Renews the certificate (in case it expired) and shows the path to the generated pem file'
33
+
34
+ FastlaneCore::CommanderGenerator.new.generate(PEM::Options.available_options, command: c)
35
+
36
+ c.action do |args, options|
37
+ PEM.config = FastlaneCore::Configuration.create(PEM::Options.available_options, options.__hash__)
38
+ PEM::Manager.start
39
+ end
40
+ end
41
+
42
+ default_command(:renew)
43
+
44
+ run!
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,112 @@
1
+ require 'pathname'
2
+
3
+ require 'spaceship'
4
+ require 'fastlane_core/print_table'
5
+ require_relative 'module'
6
+
7
+ module PEM
8
+ # Creates the push profile and stores it in the correct location
9
+ class Manager
10
+ class << self
11
+ def start
12
+ FastlaneCore::PrintTable.print_values(config: PEM.config, hide_keys: [:new_profile], title: "Summary for PEM #{Fastlane::VERSION}")
13
+ login
14
+
15
+ existing_certificate = certificate_sorted.detect do |c|
16
+ c.owner_name == PEM.config[:app_identifier]
17
+ end
18
+
19
+ if existing_certificate
20
+ remaining_days = (existing_certificate.expires - Time.now) / 60 / 60 / 24
21
+ UI.message("Existing push notification profile for '#{existing_certificate.owner_name}' is valid for #{remaining_days.round} more days.")
22
+ if remaining_days > PEM.config[:active_days_limit]
23
+ if PEM.config[:force]
24
+ UI.success("You already have an existing push certificate, but a new one will be created since the --force option has been set.")
25
+ else
26
+ UI.success("You already have a push certificate, which is active for more than #{PEM.config[:active_days_limit]} more days. No need to create a new one")
27
+ UI.success("If you still want to create a new one, use the --force option when running PEM.")
28
+ return false
29
+ end
30
+ end
31
+ end
32
+
33
+ return create_certificate
34
+ end
35
+
36
+ def login
37
+ UI.message("Starting login with user '#{PEM.config[:username]}'")
38
+ Spaceship.login(PEM.config[:username], nil)
39
+ Spaceship.client.select_team
40
+ UI.message("Successfully logged in")
41
+ end
42
+
43
+ def create_certificate
44
+ UI.important("Creating a new push certificate for app '#{PEM.config[:app_identifier]}'.")
45
+
46
+ csr, pkey = Spaceship.certificate.create_certificate_signing_request
47
+
48
+ begin
49
+ cert = certificate.create!(csr: csr, bundle_id: PEM.config[:app_identifier])
50
+ rescue => ex
51
+ if ex.to_s.include?("You already have a current")
52
+ # That's the most common failure probably
53
+ UI.message(ex.to_s)
54
+ UI.user_error!("You already have 2 active push profiles for this application/environment. You'll need to revoke an old certificate to make room for a new one")
55
+ else
56
+ raise ex
57
+ end
58
+ end
59
+
60
+ x509_certificate = cert.download
61
+
62
+ filename_base = PEM.config[:pem_name] || "#{certificate_type}_#{PEM.config[:app_identifier]}"
63
+ filename_base = File.basename(filename_base, ".pem") # strip off the .pem if it was provided.
64
+
65
+ output_path = File.expand_path(PEM.config[:output_path])
66
+ FileUtils.mkdir_p(output_path)
67
+
68
+ if PEM.config[:save_private_key]
69
+ private_key_path = File.join(output_path, "#{filename_base}.pkey")
70
+ File.write(private_key_path, pkey.to_pem)
71
+ UI.message("Private key: ".green + Pathname.new(private_key_path).realpath.to_s)
72
+ end
73
+
74
+ if PEM.config[:generate_p12]
75
+ p12_cert_path = File.join(output_path, "#{filename_base}.p12")
76
+ p12 = OpenSSL::PKCS12.create(PEM.config[:p12_password], certificate_type, pkey, x509_certificate)
77
+ File.write(p12_cert_path, p12.to_der)
78
+ UI.message("p12 certificate: ".green + Pathname.new(p12_cert_path).realpath.to_s)
79
+ end
80
+
81
+ x509_cert_path = File.join(output_path, "#{filename_base}.pem")
82
+ File.write(x509_cert_path, x509_certificate.to_pem + pkey.to_pem)
83
+ UI.message("PEM: ".green + Pathname.new(x509_cert_path).realpath.to_s)
84
+ return x509_cert_path
85
+ end
86
+
87
+ def certificate
88
+ if PEM.config[:development]
89
+ Spaceship.certificate.development_push
90
+ elsif PEM.config[:website_push]
91
+ Spaceship.certificate.website_push
92
+ else
93
+ Spaceship.certificate.production_push
94
+ end
95
+ end
96
+
97
+ def certificate_type
98
+ if PEM.config[:development]
99
+ 'development'
100
+ elsif PEM.config[:website_push]
101
+ 'website'
102
+ else
103
+ 'production'
104
+ end
105
+ end
106
+
107
+ def certificate_sorted
108
+ certificate.all.sort { |x, y| y.expires <=> x.expires }
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,19 @@
1
+ require 'fastlane_core/helper'
2
+
3
+ module PEM
4
+ # Use this to just setup the configuration attribute and set it later somewhere else
5
+ class << self
6
+ attr_accessor :config
7
+ end
8
+
9
+ tmp_dir = Dir.tmpdir
10
+ TMP_FOLDER = "#{tmp_dir}/fastlane/PEM/"
11
+ FileUtils.mkdir_p(TMP_FOLDER)
12
+
13
+ ENV['FASTLANE_TEAM_ID'] ||= ENV["PEM_TEAM_ID"]
14
+ ENV['DELIVER_USER'] ||= ENV["PEM_USERNAME"]
15
+
16
+ Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
17
+ UI = FastlaneCore::UI
18
+ ROOT = Pathname.new(File.expand_path('../../..', __FILE__))
19
+ end
@@ -0,0 +1,103 @@
1
+ require 'fastlane_core/configuration/config_item'
2
+ require 'credentials_manager/appfile_config'
3
+
4
+ require_relative 'module'
5
+
6
+ module PEM
7
+ class Options
8
+ def self.available_options
9
+ user = CredentialsManager::AppfileConfig.try_fetch_value(:apple_dev_portal_id)
10
+ user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
11
+
12
+ [
13
+ FastlaneCore::ConfigItem.new(key: :development,
14
+ env_name: "PEM_DEVELOPMENT",
15
+ description: "Renew the development push certificate instead of the production one",
16
+ is_string: false,
17
+ default_value: false),
18
+ FastlaneCore::ConfigItem.new(key: :website_push,
19
+ env_name: "PEM_WEBSITE_PUSH",
20
+ description: "Create a Website Push certificate",
21
+ is_string: false,
22
+ conflicting_options: [:development],
23
+ default_value: false),
24
+ FastlaneCore::ConfigItem.new(key: :generate_p12,
25
+ env_name: "PEM_GENERATE_P12_FILE",
26
+ description: "Generate a p12 file additionally to a PEM file",
27
+ is_string: false,
28
+ default_value: true),
29
+ FastlaneCore::ConfigItem.new(key: :active_days_limit,
30
+ env_name: "PEM_ACTIVE_DAYS_LIMIT",
31
+ description: "If the current certificate is active for less than this number of days, generate a new one",
32
+ default_value: 30,
33
+ is_string: false,
34
+ type: Integer,
35
+ verify_block: proc do |value|
36
+ UI.user_error!("Value of active_days_limit must be a positive integer or left blank") unless value.kind_of?(Integer) && value > 0
37
+ end),
38
+ FastlaneCore::ConfigItem.new(key: :force,
39
+ env_name: "PEM_FORCE",
40
+ description: "Create a new push certificate, even if the current one is active for 30 (or PEM_ACTIVE_DAYS_LIMIT) more days",
41
+ is_string: false,
42
+ default_value: false),
43
+ FastlaneCore::ConfigItem.new(key: :save_private_key,
44
+ short_option: "-s",
45
+ env_name: "PEM_SAVE_PRIVATEKEY",
46
+ description: "Set to save the private RSA key",
47
+ is_string: false,
48
+ default_value: true),
49
+ FastlaneCore::ConfigItem.new(key: :app_identifier,
50
+ short_option: "-a",
51
+ env_name: "PEM_APP_IDENTIFIER",
52
+ description: "The bundle identifier of your app",
53
+ code_gen_sensitive: true,
54
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier),
55
+ default_value_dynamic: true),
56
+ FastlaneCore::ConfigItem.new(key: :username,
57
+ short_option: "-u",
58
+ env_name: "PEM_USERNAME",
59
+ description: "Your Apple ID Username",
60
+ default_value: user,
61
+ default_value_dynamic: true),
62
+ FastlaneCore::ConfigItem.new(key: :team_id,
63
+ short_option: "-b",
64
+ env_name: "PEM_TEAM_ID",
65
+ code_gen_sensitive: true,
66
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_id),
67
+ default_value_dynamic: true,
68
+ description: "The ID of your Developer Portal team if you're in multiple teams",
69
+ optional: true,
70
+ verify_block: proc do |value|
71
+ ENV["FASTLANE_TEAM_ID"] = value.to_s
72
+ end),
73
+ FastlaneCore::ConfigItem.new(key: :team_name,
74
+ short_option: "-l",
75
+ env_name: "PEM_TEAM_NAME",
76
+ description: "The name of your Developer Portal team if you're in multiple teams",
77
+ optional: true,
78
+ code_gen_sensitive: true,
79
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_name),
80
+ default_value_dynamic: true,
81
+ verify_block: proc do |value|
82
+ ENV["FASTLANE_TEAM_NAME"] = value.to_s
83
+ end),
84
+ FastlaneCore::ConfigItem.new(key: :p12_password,
85
+ short_option: "-p",
86
+ env_name: "PEM_P12_PASSWORD",
87
+ sensitive: true,
88
+ description: "The password that is used for your p12 file",
89
+ default_value: ""),
90
+ FastlaneCore::ConfigItem.new(key: :pem_name,
91
+ short_option: "-o",
92
+ env_name: "PEM_FILE_NAME",
93
+ description: "The file name of the generated .pem file",
94
+ optional: true),
95
+ FastlaneCore::ConfigItem.new(key: :output_path,
96
+ short_option: "-e",
97
+ env_name: "PEM_OUTPUT_PATH",
98
+ description: "The path to a directory in which all certificates and private keys should be stored",
99
+ default_value: ".")
100
+ ]
101
+ end
102
+ end
103
+ end
data/pilot/README.md ADDED
@@ -0,0 +1,17 @@
1
+ <h3 align="center">
2
+ <a href="https://docs.fastlane.tools/actions/pilot/">
3
+ <img src="https://raw.githubusercontent.com/fastlane/fastlane/master/fastlane/assets/fastlane.png" width="100" />
4
+ <br />
5
+ fastlane
6
+ </a>
7
+ </h3>
8
+
9
+ ------
10
+
11
+ <p align="center">
12
+ <a href="https://docs.fastlane.tools/actions/pilot/">
13
+ <img src="https://raw.githubusercontent.com/fastlane/fastlane/master/pilot/assets/PilotTextTransparent.png" height="110">
14
+ </a>
15
+ </p>
16
+
17
+ <h3 align="center">The <i>pilot</i> docs were moved to <a href='https://docs.fastlane.tools/actions/pilot/'>docs.fastlane.tools</a></h3>
@@ -0,0 +1,9 @@
1
+ require 'pilot/features'
2
+ require "pilot/options"
3
+ require "pilot/manager"
4
+ require "pilot/build_manager"
5
+ require "pilot/tester_manager"
6
+ require "pilot/tester_importer"
7
+ require "pilot/tester_exporter"
8
+
9
+ require_relative 'pilot/module'
@@ -0,0 +1,546 @@
1
+ require 'tmpdir'
2
+ require 'terminal-table'
3
+ require 'emoji_regex'
4
+
5
+ require 'fastlane_core/itunes_transporter'
6
+ require 'fastlane_core/build_watcher'
7
+ require 'fastlane_core/ipa_upload_package_builder'
8
+ require_relative 'manager'
9
+
10
+ module Pilot
11
+ # rubocop:disable Metrics/ClassLength
12
+ class BuildManager < Manager
13
+ def upload(options)
14
+ # Only need to login before upload if no apple_id was given
15
+ # 'login' will be deferred until before waiting for build processing
16
+ should_login_in_start = options[:apple_id].nil?
17
+ start(options, should_login: should_login_in_start)
18
+
19
+ UI.user_error!("No ipa file given") unless config[:ipa]
20
+
21
+ check_for_changelog_or_whats_new!(options)
22
+
23
+ UI.success("Ready to upload new build to TestFlight (App: #{fetch_app_id})...")
24
+
25
+ dir = Dir.mktmpdir
26
+
27
+ platform = fetch_app_platform
28
+ package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(app_id: fetch_app_id,
29
+ ipa_path: options[:ipa],
30
+ package_path: dir,
31
+ platform: platform)
32
+
33
+ transporter = transporter_for_selected_team(options)
34
+ result = transporter.upload(fetch_app_id, package_path)
35
+
36
+ unless result
37
+ UI.user_error!("Error uploading ipa file, for more information see above")
38
+ end
39
+
40
+ UI.success("Successfully uploaded the new binary to App Store Connect")
41
+
42
+ # We will fully skip waiting for build processing *only* if no changelog is supplied
43
+ # Otherwise we may partially wait until the build appears so the changelog can be set, and then bail.
44
+ return_when_build_appears = false
45
+ if config[:skip_waiting_for_build_processing]
46
+ if config[:changelog].nil?
47
+ UI.important("`skip_waiting_for_build_processing` used and no `changelog` supplied - skipping waiting for build processing")
48
+ return
49
+ else
50
+ return_when_build_appears = true
51
+ end
52
+ end
53
+
54
+ # Calling login again here is needed if login was not called during 'start'
55
+ login unless should_login_in_start
56
+
57
+ UI.message("If you want to skip waiting for the processing to be finished, use the `skip_waiting_for_build_processing` option")
58
+ UI.message("Note that if `skip_waiting_for_build_processing` is used but a `changelog` is supplied, this process will wait for the build to appear on AppStoreConnect, update the changelog and then skip the remaining of the processing steps.")
59
+
60
+ latest_build = wait_for_build_processing_to_be_complete(return_when_build_appears)
61
+ distribute(options, build: latest_build)
62
+ end
63
+
64
+ def has_changelog_or_whats_new?(options)
65
+ # Look for legacy :changelog option
66
+ has_changelog = !options[:changelog].nil?
67
+
68
+ # Look for :whats_new in :localized_build_info
69
+ unless has_changelog
70
+ infos_by_lang = options[:localized_build_info] || []
71
+ infos_by_lang.each do |k, v|
72
+ next if has_changelog
73
+ v ||= {}
74
+ has_changelog = v.key?(:whats_new) || v.key?('whats_new')
75
+ end
76
+ end
77
+
78
+ return has_changelog
79
+ end
80
+
81
+ def check_for_changelog_or_whats_new!(options)
82
+ if !has_changelog_or_whats_new?(options) && options[:distribute_external] == true
83
+ if UI.interactive?
84
+ 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:")
85
+ else
86
+ UI.user_error!("No changelog provided for new build. Please either disable `distribute_external` or provide a changelog using the `changelog` option")
87
+ end
88
+ end
89
+ end
90
+
91
+ def wait_for_build_processing_to_be_complete(return_when_build_appears = false)
92
+ platform = fetch_app_platform
93
+ app_version = FastlaneCore::IpaFileAnalyser.fetch_app_version(config[:ipa])
94
+ app_build = FastlaneCore::IpaFileAnalyser.fetch_app_build(config[:ipa])
95
+
96
+ latest_build = FastlaneCore::BuildWatcher.wait_for_build_processing_to_be_complete(
97
+ app_id: app.id,
98
+ platform: platform,
99
+ app_version: app_version,
100
+ build_version: app_build,
101
+ poll_interval: config[:wait_processing_interval],
102
+ return_when_build_appears: return_when_build_appears,
103
+ return_spaceship_testflight_build: false
104
+ )
105
+
106
+ unless latest_build.app_version == app_version && latest_build.version == app_build
107
+ UI.important("Uploaded app #{app_version} - #{app_build}, but received build #{latest_build.app_version} - #{latest_build.version}.")
108
+ end
109
+
110
+ return latest_build
111
+ end
112
+
113
+ def distribute(options, build: nil)
114
+ start(options)
115
+ if config[:apple_id].to_s.length == 0 && config[:app_identifier].to_s.length == 0
116
+ config[:app_identifier] = UI.input("App Identifier: ")
117
+ end
118
+
119
+ # Get latest uploaded build if no build specified
120
+ if build.nil?
121
+ app_version = config[:app_version]
122
+ build_number = config[:build_number]
123
+ if build_number.nil?
124
+ if app_version.nil?
125
+ UI.important("No build specified - fetching latest build")
126
+ else
127
+ UI.important("No build specified - fetching latest build for version #{app_version}")
128
+ end
129
+ end
130
+ platform = Spaceship::ConnectAPI::Platform.map(fetch_app_platform)
131
+ build ||= Spaceship::ConnectAPI::Build.all(app_id: app.id, version: app_version, build_number: build_number, sort: "-uploadedDate", platform: platform, limit: 1).first
132
+ end
133
+
134
+ # Verify the build has all the includes that we need
135
+ # and fetch a new build if not
136
+ if build && (!build.app || !build.build_beta_detail || !build.pre_release_version)
137
+ UI.important("Build did include information for app, build beta detail and pre release version")
138
+ UI.important("Fetching a new build with all the information needed")
139
+ build = Spaceship::ConnectAPI::Build.get(build_id: build.id)
140
+ end
141
+
142
+ # Error out if no build
143
+ if build.nil?
144
+ UI.user_error!("No build to distribute!")
145
+ end
146
+
147
+ # Update beta app meta info
148
+ # 1. Demo account required
149
+ # 2. App info
150
+ # 3. Localized app info
151
+ # 4. Localized build info
152
+ # 5. Auto notify enabled with config[:notify_external_testers]
153
+ update_beta_app_meta(options, build)
154
+
155
+ return if config[:skip_submission]
156
+ if options[:reject_build_waiting_for_review]
157
+ reject_build_waiting_for_review(build)
158
+ end
159
+
160
+ if options[:expire_previous_builds]
161
+ expire_previous_builds(build)
162
+ end
163
+
164
+ if !build.ready_for_internal_testing? && options[:skip_waiting_for_build_processing]
165
+ # Meta can be uploaded for a build still in processing
166
+ # Returning before distribute if skip_waiting_for_build_processing
167
+ # because can't distribute an app that is still processing
168
+ return
169
+ end
170
+
171
+ distribute_build(build, options)
172
+ type = options[:distribute_external] ? 'External' : 'Internal'
173
+ UI.success("Successfully distributed build to #{type} testers 🚀")
174
+ end
175
+
176
+ def list(options)
177
+ start(options)
178
+ if config[:apple_id].to_s.length == 0 && config[:app_identifier].to_s.length == 0
179
+ config[:app_identifier] = UI.input("App Identifier: ")
180
+ end
181
+
182
+ # Get processing builds
183
+ build_deliveries = app.get_build_deliveries.map do |build_delivery|
184
+ [
185
+ build_delivery.cf_build_short_version_string,
186
+ build_delivery.cf_build_version
187
+ ]
188
+ end
189
+
190
+ # Get processed builds
191
+ builds = app.get_builds(includes: "betaBuildMetrics,preReleaseVersion", sort: "-uploadedDate").map do |build|
192
+ [
193
+ build.app_version,
194
+ build.version,
195
+ (build.beta_build_metrics || []).map(&:install_count).reduce(:+)
196
+ ]
197
+ end
198
+
199
+ # Only show table if there are any build deliveries
200
+ unless build_deliveries.empty?
201
+ puts(Terminal::Table.new(
202
+ title: "#{app.name} Processing Builds".green,
203
+ headings: ["Version #", "Build #"],
204
+ rows: FastlaneCore::PrintTable.transform_output(build_deliveries)
205
+ ))
206
+ end
207
+
208
+ puts(Terminal::Table.new(
209
+ title: "#{app.name} Builds".green,
210
+ headings: ["Version #", "Build #", "Installs"],
211
+ rows: FastlaneCore::PrintTable.transform_output(builds)
212
+ ))
213
+ end
214
+
215
+ def update_beta_app_meta(options, build)
216
+ # If demo_account_required is a parameter, it should added into beta_app_review_info
217
+ unless options[:demo_account_required].nil?
218
+ options[:beta_app_review_info] = {} if options[:beta_app_review_info].nil?
219
+ options[:beta_app_review_info][:demo_account_required] = options[:demo_account_required]
220
+ end
221
+
222
+ if should_update_beta_app_review_info(options)
223
+ update_review_detail(build, options[:beta_app_review_info])
224
+ end
225
+
226
+ if should_update_localized_app_information?(options)
227
+ update_localized_app_review(build, options[:localized_app_info])
228
+ elsif should_update_app_test_information?(options)
229
+ default_info = {}
230
+ default_info[:feedback_email] = options[:beta_app_feedback_email] if options[:beta_app_feedback_email]
231
+ default_info[:description] = options[:beta_app_description] if options[:beta_app_description]
232
+ begin
233
+ update_localized_app_review(build, {}, default_info: default_info)
234
+ UI.success("Successfully set the beta_app_feedback_email and/or beta_app_description")
235
+ rescue => ex
236
+ UI.user_error!("Could not set beta_app_feedback_email and/or beta_app_description: #{ex}")
237
+ end
238
+ end
239
+
240
+ if should_update_localized_build_information?(options)
241
+ update_localized_build_review(build, options[:localized_build_info])
242
+ elsif should_update_build_information?(options)
243
+ begin
244
+ update_localized_build_review(build, {}, default_info: { whats_new: options[:changelog] })
245
+ UI.success("Successfully set the changelog for build")
246
+ rescue => ex
247
+ UI.user_error!("Could not set changelog: #{ex}")
248
+ end
249
+ end
250
+
251
+ update_build_beta_details(build, {
252
+ auto_notify_enabled: options[:notify_external_testers]
253
+ })
254
+ end
255
+
256
+ def self.truncate_changelog(changelog)
257
+ max_changelog_bytes = 4000
258
+ if changelog
259
+ changelog_bytes = changelog.unpack('C*').length
260
+ if changelog_bytes > max_changelog_bytes
261
+ UI.important("Changelog will be truncated since it exceeds Apple's #{max_changelog_bytes}-byte limit. It currently contains #{changelog_bytes} bytes.")
262
+ new_changelog = ''
263
+ new_changelog_bytes = 0
264
+ max_changelog_bytes -= 3 # Will append '...' later.
265
+ changelog.chars.each do |char|
266
+ new_changelog_bytes += char.unpack('C*').length
267
+ break if new_changelog_bytes >= max_changelog_bytes
268
+ new_changelog += char
269
+ end
270
+ changelog = new_changelog + '...'
271
+ end
272
+ end
273
+ changelog
274
+ end
275
+
276
+ def self.strip_emoji(changelog)
277
+ if changelog && changelog =~ EmojiRegex::Regex
278
+ changelog.gsub!(EmojiRegex::Regex, "")
279
+ UI.important("Emoji symbols have been removed from the changelog, since they're not allowed by Apple.")
280
+ end
281
+ changelog
282
+ end
283
+
284
+ def self.strip_less_than_sign(changelog)
285
+ if changelog && changelog.include?("<")
286
+ changelog.delete!("<")
287
+ UI.important("Less than signs (<) have been removed from the changelog, since they're not allowed by Apple.")
288
+ end
289
+ changelog
290
+ end
291
+
292
+ def self.sanitize_changelog(changelog)
293
+ changelog = strip_emoji(changelog)
294
+ changelog = strip_less_than_sign(changelog)
295
+ truncate_changelog(changelog)
296
+ end
297
+
298
+ private
299
+
300
+ def describe_build(build)
301
+ row = [build.train_version,
302
+ build.build_version,
303
+ build.install_count]
304
+
305
+ return row
306
+ end
307
+
308
+ def should_update_beta_app_review_info(options)
309
+ !options[:beta_app_review_info].nil?
310
+ end
311
+
312
+ def should_update_build_information?(options)
313
+ options[:changelog].to_s.length > 0
314
+ end
315
+
316
+ def should_update_app_test_information?(options)
317
+ options[:beta_app_description].to_s.length > 0 || options[:beta_app_feedback_email].to_s.length > 0
318
+ end
319
+
320
+ def should_update_localized_app_information?(options)
321
+ !options[:localized_app_info].nil?
322
+ end
323
+
324
+ def should_update_localized_build_information?(options)
325
+ !options[:localized_build_info].nil?
326
+ end
327
+
328
+ def reject_build_waiting_for_review(build)
329
+ waiting_for_review_build = build.app.get_builds(filter: { "betaAppReviewSubmission.betaReviewState" => "WAITING_FOR_REVIEW" }, includes: "betaAppReviewSubmission,preReleaseVersion").first
330
+ unless waiting_for_review_build.nil?
331
+ UI.important("Another build is already in review. Going to remove that build and submit the new one.")
332
+ UI.important("Deleting beta app review submission for build: #{waiting_for_review_build.app_version} - #{waiting_for_review_build.version}")
333
+ waiting_for_review_build.beta_app_review_submission.delete!
334
+ UI.success("Deleted beta app review submission for previous build: #{waiting_for_review_build.app_version} - #{waiting_for_review_build.version}")
335
+ end
336
+ end
337
+
338
+ def expire_previous_builds(build)
339
+ builds_to_expire = build.app.get_builds.reject do |asc_build|
340
+ asc_build.id == build.id
341
+ end
342
+
343
+ builds_to_expire.each(&:expire!)
344
+ end
345
+
346
+ # If App Store Connect API token, use token.
347
+ # If itc_provider was explicitly specified, use it.
348
+ # If there are multiple teams, infer the provider from the selected team name.
349
+ # If there are fewer than two teams, don't infer the provider.
350
+ def transporter_for_selected_team(options)
351
+ # Use JWT auth
352
+ unless api_token.nil?
353
+ api_token.refresh! if api_token.expired?
354
+ return FastlaneCore::ItunesTransporter.new(nil, nil, false, nil, api_token.text)
355
+ end
356
+
357
+ # Otherwise use username and password
358
+ tunes_client = Spaceship::ConnectAPI.client ? Spaceship::ConnectAPI.client.tunes_client : nil
359
+
360
+ generic_transporter = FastlaneCore::ItunesTransporter.new(options[:username], nil, false, options[:itc_provider])
361
+ return generic_transporter if options[:itc_provider] || tunes_client.nil?
362
+ return generic_transporter unless tunes_client.teams.count > 1
363
+
364
+ begin
365
+ team = tunes_client.teams.find { |t| t['contentProvider']['contentProviderId'].to_s == tunes_client.team_id }
366
+ name = team['contentProvider']['name']
367
+ provider_id = generic_transporter.provider_ids[name]
368
+ UI.verbose("Inferred provider id #{provider_id} for team #{name}.")
369
+ return FastlaneCore::ItunesTransporter.new(options[:username], nil, false, provider_id)
370
+ rescue => ex
371
+ STDERR.puts(ex.to_s)
372
+ UI.verbose("Couldn't infer a provider short name for team with id #{tunes_client.team_id} automatically: #{ex}. Proceeding without provider short name.")
373
+ return generic_transporter
374
+ end
375
+ end
376
+
377
+ def distribute_build(uploaded_build, options)
378
+ UI.message("Distributing new build to testers: #{uploaded_build.app_version} - #{uploaded_build.version}")
379
+
380
+ # This is where we could add a check to see if encryption is required and has been updated
381
+ uploaded_build = set_export_compliance_if_needed(uploaded_build, options)
382
+
383
+ if options[:groups] || options[:distribute_external]
384
+ if uploaded_build.ready_for_beta_submission?
385
+ uploaded_build.post_beta_app_review_submission
386
+ else
387
+ UI.message("Build #{uploaded_build.app_version} - #{uploaded_build.version} already submitted for review")
388
+ end
389
+ end
390
+
391
+ if options[:groups]
392
+ app = uploaded_build.app
393
+ beta_groups = app.get_beta_groups.select do |group|
394
+ options[:groups].include?(group.name)
395
+ end
396
+
397
+ unless beta_groups.empty?
398
+ uploaded_build.add_beta_groups(beta_groups: beta_groups)
399
+ end
400
+ end
401
+
402
+ if options[:distribute_external] && options[:groups].nil?
403
+ # Legacy Spaceship::TestFlight API used to have a `default_external_group` that would automatically
404
+ # get selected but this no longer exists with Spaceship::ConnectAPI
405
+ UI.user_error!("You must specify at least one group using the `:groups` option to distribute externally")
406
+ end
407
+
408
+ true
409
+ end
410
+
411
+ def set_export_compliance_if_needed(uploaded_build, options)
412
+ if uploaded_build.uses_non_exempt_encryption.nil?
413
+ uses_non_exempt_encryption = options[:uses_non_exempt_encryption]
414
+ attributes = { usesNonExemptEncryption: uses_non_exempt_encryption }
415
+
416
+ Spaceship::ConnectAPI.patch_builds(build_id: uploaded_build.id, attributes: attributes)
417
+
418
+ UI.important("Export compliance has been set to '#{uses_non_exempt_encryption}'. Need to wait for build to finishing processing again...")
419
+ UI.important("Set 'ITSAppUsesNonExemptEncryption' in the 'Info.plist' to skip this step and speed up the submission")
420
+ return wait_for_build_processing_to_be_complete
421
+ else
422
+ return uploaded_build
423
+ end
424
+ end
425
+
426
+ def update_review_detail(build, info)
427
+ info = info.collect { |k, v| [k.to_sym, v] }.to_h
428
+
429
+ attributes = {}
430
+ attributes[:contactEmail] = info[:contact_email] if info.key?(:contact_email)
431
+ attributes[:contactFirstName] = info[:contact_first_name] if info.key?(:contact_first_name)
432
+ attributes[:contactLastName] = info[:contact_last_name] if info.key?(:contact_last_name)
433
+ attributes[:contactPhone] = info[:contact_phone] if info.key?(:contact_phone)
434
+ attributes[:demoAccountName] = info[:demo_account_name] if info.key?(:demo_account_name)
435
+ attributes[:demoAccountPassword] = info[:demo_account_password] if info.key?(:demo_account_password)
436
+ attributes[:demoAccountRequired] = info[:demo_account_required] if info.key?(:demo_account_required)
437
+ attributes[:notes] = info[:notes] if info.key?(:notes)
438
+
439
+ Spaceship::ConnectAPI.patch_beta_app_review_detail(app_id: build.app.id, attributes: attributes)
440
+ end
441
+
442
+ def update_localized_app_review(build, info_by_lang, default_info: nil)
443
+ info_by_lang = info_by_lang.collect { |k, v| [k.to_sym, v] }.to_h
444
+
445
+ if default_info
446
+ info_by_lang.delete(:default)
447
+ else
448
+ default_info = info_by_lang.delete(:default)
449
+ end
450
+
451
+ # Initialize hash of lang codes with info_by_lang keys
452
+ localizations_by_lang = {}
453
+ info_by_lang.each_key do |key|
454
+ localizations_by_lang[key] = nil
455
+ end
456
+
457
+ # Validate locales exist
458
+ localizations = app.get_beta_app_localizations
459
+ localizations.each do |localization|
460
+ localizations_by_lang[localization.locale.to_sym] = localization
461
+ end
462
+
463
+ # Create or update localized app review info
464
+ localizations_by_lang.each do |lang_code, localization|
465
+ info = info_by_lang[lang_code]
466
+
467
+ info = default_info unless info
468
+ update_localized_app_review_for_lang(app, localization, lang_code, info) if info
469
+ end
470
+ end
471
+
472
+ def update_localized_app_review_for_lang(app, localization, locale, info)
473
+ attributes = {}
474
+ attributes[:feedbackEmail] = info[:feedback_email] if info.key?(:feedback_email)
475
+ attributes[:marketingUrl] = info[:marketing_url] if info.key?(:marketing_url)
476
+ attributes[:privacyPolicyUrl] = info[:privacy_policy_url] if info.key?(:privacy_policy_url)
477
+ attributes[:tvOsPrivacyPolicy] = info[:tv_os_privacy_policy_url] if info.key?(:tv_os_privacy_policy_url)
478
+ attributes[:description] = info[:description] if info.key?(:description)
479
+
480
+ if localization
481
+ Spaceship::ConnectAPI.patch_beta_app_localizations(localization_id: localization.id, attributes: attributes)
482
+ else
483
+ attributes[:locale] = locale if locale
484
+ Spaceship::ConnectAPI.post_beta_app_localizations(app_id: app.id, attributes: attributes)
485
+ end
486
+ end
487
+
488
+ def update_localized_build_review(build, info_by_lang, default_info: nil)
489
+ info_by_lang = info_by_lang.collect { |k, v| [k.to_sym, v] }.to_h
490
+
491
+ if default_info
492
+ info_by_lang.delete(:default)
493
+ else
494
+ default_info = info_by_lang.delete(:default)
495
+ end
496
+
497
+ # Initialize hash of lang codes with info_by_lang keys
498
+ localizations_by_lang = {}
499
+ info_by_lang.each_key do |key|
500
+ localizations_by_lang[key] = nil
501
+ end
502
+
503
+ # Validate locales exist
504
+ localizations = build.get_beta_build_localizations
505
+ localizations.each do |localization|
506
+ localizations_by_lang[localization.locale.to_sym] = localization
507
+ end
508
+
509
+ # Create or update localized app review info
510
+ localizations_by_lang.each do |lang_code, localization|
511
+ info = info_by_lang[lang_code]
512
+
513
+ info = default_info unless info
514
+ update_localized_build_review_for_lang(build, localization, lang_code, info) if info
515
+ end
516
+ end
517
+
518
+ def update_localized_build_review_for_lang(build, localization, locale, info)
519
+ attributes = {}
520
+ attributes[:whatsNew] = self.class.sanitize_changelog(info[:whats_new]) if info.key?(:whats_new)
521
+
522
+ if localization
523
+ Spaceship::ConnectAPI.patch_beta_build_localizations(localization_id: localization.id, attributes: attributes)
524
+ else
525
+ attributes[:locale] = locale if locale
526
+ Spaceship::ConnectAPI.post_beta_build_localizations(build_id: build.id, attributes: attributes)
527
+ end
528
+ end
529
+
530
+ def update_build_beta_details(build, info)
531
+ attributes = {}
532
+ attributes[:autoNotifyEnabled] = info[:auto_notify_enabled] if info.key?(:auto_notify_enabled)
533
+ build_beta_detail = build.build_beta_detail
534
+
535
+ # https://github.com/fastlane/fastlane/pull/16006
536
+ if build_beta_detail
537
+ Spaceship::ConnectAPI.patch_build_beta_details(build_beta_details_id: build_beta_detail.id, attributes: attributes)
538
+ else
539
+ if attributes[:autoNotifyEnabled]
540
+ UI.important("Unable to auto notify testers as the build did not include beta detail information - this is likely a temporary issue on TestFlight.")
541
+ end
542
+ end
543
+ end
544
+ end
545
+ # rubocop:enable Metrics/ClassLength
546
+ end