fastlane 2.173.0 → 2.194.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +105 -85
- data/cert/lib/cert/commands_generator.rb +2 -1
- data/cert/lib/cert/options.rb +4 -3
- data/cert/lib/cert/runner.rb +7 -7
- data/deliver/lib/assets/summary.html.erb +10 -10
- data/deliver/lib/deliver/app_screenshot.rb +8 -3
- data/deliver/lib/deliver/app_screenshot_iterator.rb +2 -2
- data/deliver/lib/deliver/commands_generator.rb +3 -2
- data/deliver/lib/deliver/detect_values.rb +5 -3
- data/deliver/lib/deliver/download_screenshots.rb +2 -3
- data/deliver/lib/deliver/html_generator.rb +2 -2
- data/deliver/lib/deliver/languages.rb +1 -1
- data/deliver/lib/deliver/loader.rb +1 -1
- data/deliver/lib/deliver/module.rb +6 -0
- data/deliver/lib/deliver/options.rb +48 -56
- data/deliver/lib/deliver/runner.rb +28 -15
- data/deliver/lib/deliver/screenshot_comparable.rb +62 -0
- data/deliver/lib/deliver/setup.rb +1 -2
- data/deliver/lib/deliver/submit_for_review.rb +4 -4
- data/deliver/lib/deliver/sync_screenshots.rb +200 -0
- data/deliver/lib/deliver/upload_metadata.rb +26 -11
- data/deliver/lib/deliver/upload_price_tier.rb +1 -1
- data/deliver/lib/deliver/upload_screenshots.rb +13 -12
- data/fastlane/lib/assets/completions/completion.bash +4 -1
- data/fastlane/lib/assets/completions/completion.zsh +6 -5
- data/{spaceship/lib/spaceship/connect_api/models/.app_store_version_submission.rb.swp → fastlane/lib/fastlane/actions/.notarize.rb.swp} +0 -0
- data/fastlane/lib/fastlane/actions/actions_helper.rb +2 -2
- data/fastlane/lib/fastlane/actions/adb.rb +2 -5
- data/fastlane/lib/fastlane/actions/adb_devices.rb +0 -1
- data/fastlane/lib/fastlane/actions/add_git_tag.rb +4 -4
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +18 -18
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +21 -7
- data/fastlane/lib/fastlane/actions/appaloosa.rb +7 -2
- data/fastlane/lib/fastlane/actions/appetize.rb +13 -8
- data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +0 -11
- data/fastlane/lib/fastlane/actions/appium.rb +40 -65
- data/fastlane/lib/fastlane/actions/appledoc.rb +45 -45
- data/fastlane/lib/fastlane/actions/apteligent.rb +3 -2
- data/fastlane/lib/fastlane/actions/artifactory.rb +5 -6
- data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +7 -13
- data/fastlane/lib/fastlane/actions/backup_file.rb +1 -1
- data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +3 -3
- data/fastlane/lib/fastlane/actions/badge.rb +9 -13
- data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +11 -5
- data/fastlane/lib/fastlane/actions/build_app.rb +4 -0
- data/fastlane/lib/fastlane/actions/bundle_install.rb +21 -11
- data/fastlane/lib/fastlane/actions/carthage.rb +22 -14
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +8 -17
- data/fastlane/lib/fastlane/actions/chatwork.rb +3 -2
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +9 -1
- data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +0 -1
- data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +25 -2
- data/fastlane/lib/fastlane/actions/clipboard.rb +3 -6
- data/fastlane/lib/fastlane/actions/cloc.rb +9 -13
- data/fastlane/lib/fastlane/actions/cocoapods.rb +23 -15
- data/fastlane/lib/fastlane/actions/commit_github_file.rb +12 -4
- data/fastlane/lib/fastlane/actions/commit_version_bump.rb +6 -7
- data/fastlane/lib/fastlane/actions/copy_artifacts.rb +3 -4
- data/fastlane/lib/fastlane/actions/crashlytics.rb +7 -11
- data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +70 -76
- data/fastlane/lib/fastlane/actions/create_keychain.rb +13 -11
- data/fastlane/lib/fastlane/actions/create_pull_request.rb +0 -9
- data/fastlane/lib/fastlane/actions/create_xcframework.rb +102 -17
- data/fastlane/lib/fastlane/actions/danger.rb +13 -12
- data/fastlane/lib/fastlane/actions/deploygate.rb +1 -2
- data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +29 -30
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +3 -3
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +171 -67
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +19 -2
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +8 -2
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +37 -18
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +10 -4
- data/fastlane/lib/fastlane/actions/download_app_privacy_details_from_app_store.rb +1 -1
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +8 -19
- data/fastlane/lib/fastlane/actions/dsym_zip.rb +1 -1
- data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +2 -6
- data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +0 -1
- data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +3 -4
- data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +3 -5
- data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -2
- data/fastlane/lib/fastlane/actions/environment_variable.rb +13 -21
- data/fastlane/lib/fastlane/actions/erb.rb +2 -5
- data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +1 -1
- data/fastlane/lib/fastlane/actions/get_certificates.rb +5 -1
- data/fastlane/lib/fastlane/actions/get_github_release.rb +11 -1
- data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +0 -1
- data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +32 -35
- data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +10 -2
- data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +17 -10
- data/fastlane/lib/fastlane/actions/git_add.rb +5 -10
- data/fastlane/lib/fastlane/actions/git_branch.rb +4 -10
- data/fastlane/lib/fastlane/actions/git_commit.rb +6 -8
- data/fastlane/lib/fastlane/actions/git_pull.rb +4 -10
- data/fastlane/lib/fastlane/actions/git_remote_branch.rb +57 -0
- data/fastlane/lib/fastlane/actions/git_submodule_update.rb +16 -8
- data/fastlane/lib/fastlane/actions/git_tag_exists.rb +4 -0
- data/fastlane/lib/fastlane/actions/github_api.rb +4 -6
- data/fastlane/lib/fastlane/actions/gradle.rb +13 -21
- data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +1 -1
- data/fastlane/lib/fastlane/actions/hg_push.rb +1 -1
- data/fastlane/lib/fastlane/actions/hipchat.rb +6 -6
- data/fastlane/lib/fastlane/actions/hockey.rb +5 -12
- data/fastlane/lib/fastlane/actions/ifttt.rb +3 -6
- data/fastlane/lib/fastlane/actions/import_from_git.rb +7 -9
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +8 -2
- data/fastlane/lib/fastlane/actions/install_on_device.rb +3 -6
- data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +4 -0
- data/fastlane/lib/fastlane/actions/installr.rb +22 -25
- data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
- data/fastlane/lib/fastlane/actions/jazzy.rb +11 -8
- data/fastlane/lib/fastlane/actions/jira.rb +61 -14
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +7 -7
- data/fastlane/lib/fastlane/actions/lcov.rb +0 -4
- data/fastlane/lib/fastlane/actions/mailgun.rb +21 -27
- data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +1 -1
- data/fastlane/lib/fastlane/actions/match_nuke.rb +59 -0
- data/fastlane/lib/fastlane/actions/modify_services.rb +59 -24
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +2 -2
- data/fastlane/lib/fastlane/actions/notarize.rb +181 -52
- data/fastlane/lib/fastlane/actions/notification.rb +1 -1
- data/fastlane/lib/fastlane/actions/number_of_commits.rb +1 -1
- data/fastlane/lib/fastlane/actions/oclint.rb +15 -14
- data/fastlane/lib/fastlane/actions/pod_push.rb +0 -2
- data/fastlane/lib/fastlane/actions/podio_item.rb +0 -7
- data/fastlane/lib/fastlane/actions/prompt.rb +3 -4
- data/fastlane/lib/fastlane/actions/push_git_tags.rb +2 -2
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +6 -3
- data/fastlane/lib/fastlane/actions/puts.rb +1 -2
- data/fastlane/lib/fastlane/actions/register_device.rb +10 -13
- data/fastlane/lib/fastlane/actions/register_devices.rb +10 -14
- data/fastlane/lib/fastlane/actions/reset_git_repo.rb +5 -8
- data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +0 -2
- data/fastlane/lib/fastlane/actions/resign.rb +2 -9
- data/fastlane/lib/fastlane/actions/restore_file.rb +1 -1
- data/fastlane/lib/fastlane/actions/rsync.rb +3 -6
- data/fastlane/lib/fastlane/actions/run_tests.rb +1 -1
- data/fastlane/lib/fastlane/actions/s3.rb +1 -1
- data/fastlane/lib/fastlane/actions/say.rb +2 -3
- data/fastlane/lib/fastlane/actions/scp.rb +4 -10
- data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +1 -1
- data/fastlane/lib/fastlane/actions/set_changelog.rb +11 -14
- data/fastlane/lib/fastlane/actions/set_github_release.rb +2 -8
- data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +1 -1
- data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -4
- data/fastlane/lib/fastlane/actions/setup_ci.rb +1 -2
- data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +1 -1
- data/fastlane/lib/fastlane/actions/setup_jenkins.rb +7 -12
- data/fastlane/lib/fastlane/actions/setup_travis.rb +1 -1
- data/fastlane/lib/fastlane/actions/sh.rb +2 -4
- data/fastlane/lib/fastlane/actions/slack.rb +161 -141
- data/fastlane/lib/fastlane/actions/slather.rb +9 -19
- data/fastlane/lib/fastlane/actions/sonar.rb +12 -19
- data/fastlane/lib/fastlane/actions/sourcedocs.rb +128 -0
- data/fastlane/lib/fastlane/actions/spaceship_logs.rb +1 -1
- data/fastlane/lib/fastlane/actions/splunkmint.rb +2 -2
- data/fastlane/lib/fastlane/actions/spm.rb +3 -3
- data/fastlane/lib/fastlane/actions/ssh.rb +5 -10
- data/fastlane/lib/fastlane/actions/swiftlint.rb +18 -16
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +7 -2
- data/fastlane/lib/fastlane/actions/testfairy.rb +0 -1
- data/fastlane/lib/fastlane/actions/tryouts.rb +2 -3
- data/fastlane/lib/fastlane/actions/twitter.rb +0 -5
- data/fastlane/lib/fastlane/actions/unlock_keychain.rb +3 -3
- data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +1 -4
- data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +8 -15
- data/fastlane/lib/fastlane/actions/update_fastlane.rb +2 -2
- data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +1 -4
- data/fastlane/lib/fastlane/actions/update_info_plist.rb +1 -1
- data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +1 -4
- data/fastlane/lib/fastlane/actions/update_plist.rb +1 -1
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +3 -4
- data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +0 -1
- data/fastlane/lib/fastlane/actions/update_url_schemes.rb +15 -26
- data/fastlane/lib/fastlane/actions/upload_app_privacy_details_to_app_store.rb +1 -2
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +8 -7
- data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +3 -10
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +5 -1
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +10 -3
- data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +40 -44
- data/fastlane/lib/fastlane/actions/version_get_podspec.rb +1 -2
- data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +3 -3
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +5 -5
- data/fastlane/lib/fastlane/actions/zip.rb +86 -21
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +1 -1
- data/fastlane/lib/fastlane/commands_generator.rb +2 -1
- data/fastlane/lib/fastlane/documentation/actions_list.rb +2 -2
- data/fastlane/lib/fastlane/documentation/docs_generator.rb +1 -1
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +12 -6
- data/fastlane/lib/fastlane/environment_printer.rb +1 -0
- data/fastlane/lib/fastlane/erb_template_helper.rb +7 -1
- data/fastlane/lib/fastlane/fast_file.rb +19 -7
- data/fastlane/lib/fastlane/fastlane_require.rb +7 -1
- data/fastlane/lib/fastlane/features.rb +3 -0
- data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
- data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +4 -4
- data/fastlane/lib/fastlane/helper/gem_helper.rb +2 -2
- data/fastlane/lib/fastlane/helper/git_helper.rb +34 -5
- data/fastlane/lib/fastlane/lane_manager.rb +3 -2
- data/fastlane/lib/fastlane/notification/slack.rb +56 -0
- data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -2
- data/fastlane/lib/fastlane/plugins/plugin_info.rb +2 -2
- data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -2
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +2 -3
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +7 -6
- data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +1 -1
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +1 -1
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +30 -35
- data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +1 -1
- data/fastlane/lib/fastlane/setup/setup.rb +23 -10
- data/fastlane/lib/fastlane/setup/setup_ios.rb +3 -3
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +43 -15
- data/fastlane/lib/fastlane/swift_runner_upgrader.rb +2 -0
- data/fastlane/lib/fastlane/version.rb +2 -2
- data/fastlane/swift/Actions.swift +1 -1
- data/fastlane/swift/Appfile.swift +1 -1
- data/fastlane/swift/ArgumentProcessor.swift +1 -1
- data/fastlane/swift/ControlCommand.swift +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +27 -23
- data/fastlane/swift/Fastlane.swift +7993 -4352
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -0
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/LaneFileProtocol.swift +10 -4
- data/fastlane/swift/MainProcess.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +3 -3
- data/fastlane/swift/OptionalConfigValue.swift +101 -0
- data/fastlane/swift/Plugins.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +4 -4
- data/fastlane/swift/RubyCommand.swift +2 -2
- data/fastlane/swift/RubyCommandable.swift +1 -1
- data/fastlane/swift/Runner.swift +2 -2
- data/fastlane/swift/RunnerArgument.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +17 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +4 -4
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
- data/fastlane/swift/SocketClient.swift +3 -2
- data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
- data/fastlane/swift/SocketResponse.swift +5 -3
- data/fastlane/swift/formatting/Brewfile.lock.json +37 -21
- data/fastlane/swift/main.swift +1 -1
- data/fastlane/swift/upgrade_manifest.json +1 -1
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +113 -17
- data/fastlane_core/lib/fastlane_core/clipboard.rb +20 -0
- data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -9
- data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +6 -1
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +41 -3
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +14 -8
- data/fastlane_core/lib/fastlane_core/device_manager.rb +1 -1
- data/fastlane_core/lib/fastlane_core/helper.rb +66 -10
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +3 -2
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +14 -8
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +12 -5
- data/fastlane_core/lib/fastlane_core/languages.rb +2 -2
- data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +5 -0
- data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +3 -2
- data/fastlane_core/lib/fastlane_core/print_table.rb +5 -3
- data/fastlane_core/lib/fastlane_core/project.rb +30 -23
- data/{deliver/lib/deliver → fastlane_core/lib/fastlane_core}/queue_worker.rb +4 -4
- data/fastlane_core/lib/fastlane_core/swag.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +1 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +41 -0
- data/fastlane_core/lib/fastlane_core/ui/help.erb +35 -0
- data/fastlane_core/lib/fastlane_core/ui/help_formatter.rb +16 -0
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +16 -2
- data/fastlane_core/lib/fastlane_core/ui/interface.rb +1 -1
- data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +2 -2
- data/fastlane_core/lib/fastlane_core.rb +22 -20
- data/frameit/lib/frameit/commands_generator.rb +2 -1
- data/frameit/lib/frameit/config_parser.rb +2 -2
- data/frameit/lib/frameit/frame_downloader.rb +2 -1
- data/gym/lib/gym/code_signing_mapping.rb +2 -2
- data/gym/lib/gym/commands_generator.rb +2 -1
- data/gym/lib/gym/generators/package_command_generator.rb +4 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +19 -13
- data/gym/lib/gym/runner.rb +15 -4
- data/match/lib/match/change_password.rb +3 -3
- data/match/lib/match/commands_generator.rb +2 -1
- data/match/lib/match/encryption/interface.rb +1 -1
- data/match/lib/match/encryption/openssl.rb +2 -2
- data/match/lib/match/importer.rb +9 -10
- data/match/lib/match/migrate.rb +2 -3
- data/match/lib/match/module.rb +1 -0
- data/match/lib/match/nuke.rb +10 -10
- data/match/lib/match/options.rb +5 -4
- data/match/lib/match/runner.rb +12 -12
- data/match/lib/match/spaceship_ensure.rb +3 -0
- data/match/lib/match/storage/google_cloud_storage.rb +2 -2
- data/match/lib/match/storage/s3_storage.rb +2 -2
- data/pem/lib/pem/commands_generator.rb +2 -1
- data/pilot/lib/pilot/build_manager.rb +45 -15
- data/pilot/lib/pilot/commands_generator.rb +2 -1
- data/pilot/lib/pilot/manager.rb +14 -9
- data/pilot/lib/pilot/options.rb +39 -11
- data/pilot/lib/pilot/tester_exporter.rb +0 -1
- data/pilot/lib/pilot/tester_manager.rb +0 -1
- data/pilot/lib/pilot.rb +0 -1
- data/precheck/lib/precheck/commands_generator.rb +2 -1
- data/precheck/lib/precheck/module.rb +2 -0
- data/precheck/lib/precheck/options.rb +7 -6
- data/precheck/lib/precheck/runner.rb +13 -8
- data/produce/lib/produce/commands_generator.rb +129 -28
- data/produce/lib/produce/developer_center.rb +42 -4
- data/produce/lib/produce/options.rb +1 -1
- data/produce/lib/produce/service.rb +285 -179
- data/scan/lib/scan/commands_generator.rb +2 -1
- data/scan/lib/scan/detect_values.rb +26 -14
- data/scan/lib/scan/module.rb +1 -0
- data/scan/lib/scan/options.rb +32 -6
- data/scan/lib/scan/runner.rb +81 -1
- data/scan/lib/scan/test_command_generator.rb +37 -12
- data/scan/lib/scan/xcpretty_reporter_options_generator.rb +1 -1
- data/screengrab/lib/screengrab/android_environment.rb +5 -53
- data/screengrab/lib/screengrab/commands_generator.rb +2 -1
- data/screengrab/lib/screengrab/dependency_checker.rb +0 -20
- data/screengrab/lib/screengrab/options.rb +5 -2
- data/screengrab/lib/screengrab/runner.rb +110 -109
- data/sigh/lib/assets/resign.sh +81 -61
- data/sigh/lib/sigh/commands_generator.rb +2 -1
- data/sigh/lib/sigh/download_all.rb +4 -8
- data/sigh/lib/sigh/options.rb +6 -4
- data/sigh/lib/sigh/runner.rb +8 -8
- data/snapshot/lib/assets/SnapfileTemplate +3 -2
- data/snapshot/lib/assets/SnapfileTemplate.swift +2 -1
- data/snapshot/lib/assets/SnapshotHelper.swift +14 -10
- data/snapshot/lib/snapshot/commands_generator.rb +3 -1
- data/snapshot/lib/snapshot/options.rb +5 -0
- data/snapshot/lib/snapshot/reports_generator.rb +7 -1
- data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +12 -6
- data/snapshot/lib/snapshot/test_command_generator.rb +17 -3
- data/spaceship/README.md +4 -14
- data/spaceship/lib/spaceship/base.rb +2 -2
- data/spaceship/lib/spaceship/client.rb +37 -20
- data/spaceship/lib/spaceship/commands_generator.rb +4 -2
- data/spaceship/lib/spaceship/connect_api/api_client.rb +80 -8
- data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +36 -4
- data/spaceship/lib/spaceship/connect_api/models/app.rb +10 -2
- data/spaceship/lib/spaceship/connect_api/models/app_info.rb +10 -0
- data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +5 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +5 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +2 -3
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +8 -1
- data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +3 -1
- data/spaceship/lib/spaceship/connect_api/models/build.rb +14 -1
- data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +8 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +32 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +84 -21
- data/spaceship/lib/spaceship/connect_api/models/capabilities.rb +27 -0
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/models/user.rb +17 -3
- data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +37 -3
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +104 -2
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +3 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +72 -5
- data/spaceship/lib/spaceship/connect_api/token.rb +19 -4
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +3 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +19 -2
- data/spaceship/lib/spaceship/connect_api/users/client.rb +3 -0
- data/spaceship/lib/spaceship/connect_api/users/users.rb +58 -3
- data/spaceship/lib/spaceship/connect_api.rb +1 -0
- data/spaceship/lib/spaceship/playground.rb +2 -2
- data/spaceship/lib/spaceship/spaceauth_runner.rb +38 -15
- data/spaceship/lib/spaceship/tunes/members.rb +1 -1
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +5 -2
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +42 -29
- data/spaceship/lib/spaceship/ui.rb +2 -2
- data/supply/lib/supply/client.rb +45 -4
- data/supply/lib/supply/commands_generator.rb +2 -1
- data/supply/lib/supply/options.rb +14 -2
- data/supply/lib/supply/uploader.rb +13 -9
- metadata +119 -98
- data/fastlane/lib/fastlane/.erb_template_helper.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.git_commit.rb.swp +0 -0
- data/pilot/lib/pilot/features.rb +0 -0
- data/pilot/lib/pilot/tester_util.rb +0 -0
- data/spaceship/lib/spaceship/.DS_Store +0 -0
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'fastlane_core'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'naturally'
|
4
|
+
|
5
|
+
require_relative 'app_screenshot'
|
6
|
+
require_relative 'app_screenshot_iterator'
|
7
|
+
require_relative 'loader'
|
8
|
+
require_relative 'screenshot_comparable'
|
9
|
+
|
10
|
+
module Deliver
|
11
|
+
class SyncScreenshots
|
12
|
+
DeleteScreenshotJob = Struct.new(:app_screenshot, :locale)
|
13
|
+
UploadScreenshotJob = Struct.new(:app_screenshot_set, :path)
|
14
|
+
|
15
|
+
class UploadResult
|
16
|
+
attr_reader :asset_delivery_state_counts, :failing_screenshots
|
17
|
+
|
18
|
+
def initialize(asset_delivery_state_counts:, failing_screenshots:)
|
19
|
+
@asset_delivery_state_counts = asset_delivery_state_counts
|
20
|
+
@failing_screenshots = failing_screenshots
|
21
|
+
end
|
22
|
+
|
23
|
+
def processing?
|
24
|
+
@asset_delivery_state_counts.fetch('UPLOAD_COMPLETE', 0) > 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def screenshot_count
|
28
|
+
@asset_delivery_state_counts.fetch('COMPLETE', 0)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(app:, platform:)
|
33
|
+
@app = app
|
34
|
+
@platform = platform
|
35
|
+
end
|
36
|
+
|
37
|
+
def sync_from_path(screenshots_path)
|
38
|
+
# load local screenshots
|
39
|
+
screenshots = Deliver::Loader.load_app_screenshots(screenshots_path, true)
|
40
|
+
sync(screenshots)
|
41
|
+
end
|
42
|
+
|
43
|
+
def sync(screenshots)
|
44
|
+
UI.important('This is currently a beta feature in fastlane. This may cause some errors on your environment.')
|
45
|
+
|
46
|
+
unless FastlaneCore::Feature.enabled?('FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS')
|
47
|
+
UI.user_error!('Please set a value to "FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS" environment variable ' \
|
48
|
+
'if you acknowleage the risk and try this out.')
|
49
|
+
end
|
50
|
+
|
51
|
+
UI.important("Will begin uploading snapshots for '#{version.version_string}' on App Store Connect")
|
52
|
+
|
53
|
+
# enable localizations that will be used
|
54
|
+
screenshots_per_language = screenshots.group_by(&:language)
|
55
|
+
enable_localizations(screenshots_per_language.keys)
|
56
|
+
|
57
|
+
# create iterator
|
58
|
+
localizations = fetch_localizations
|
59
|
+
iterator = Deliver::AppScreenshotIterator.new(localizations)
|
60
|
+
|
61
|
+
# sync local screenshots with remote settings by deleting and uploading
|
62
|
+
UI.message("Starting with the upload of screenshots...")
|
63
|
+
replace_screenshots(iterator, screenshots)
|
64
|
+
|
65
|
+
# ensure screenshots within screenshot sets are sorted in right order
|
66
|
+
sort_screenshots(iterator)
|
67
|
+
|
68
|
+
UI.important('Screenshots are synced successfully!')
|
69
|
+
end
|
70
|
+
|
71
|
+
def enable_localizations(locales)
|
72
|
+
localizations = fetch_localizations
|
73
|
+
locales_to_enable = locales - localizations.map(&:locale)
|
74
|
+
Helper.show_loading_indicator("Activating localizations for #{locales_to_enable.join(', ')}...")
|
75
|
+
locales_to_enable.each do |locale|
|
76
|
+
version.create_app_store_version_localization(attributes: { locale: locale })
|
77
|
+
end
|
78
|
+
Helper.hide_loading_indicator
|
79
|
+
end
|
80
|
+
|
81
|
+
def replace_screenshots(iterator, screenshots, retries = 3)
|
82
|
+
# delete and upload screenshots to get App Store Connect in sync
|
83
|
+
do_replace_screenshots(iterator, screenshots, create_delete_worker, create_upload_worker)
|
84
|
+
|
85
|
+
# wait for screenshots to be processed on App Store Connect end and
|
86
|
+
# ensure the number of uploaded screenshots matches the one in local
|
87
|
+
result = wait_for_complete(iterator)
|
88
|
+
return if !result.processing? && result.screenshot_count == screenshots.count
|
89
|
+
|
90
|
+
if retries.zero?
|
91
|
+
UI.crash!("Retried uploading screenshots #{retries} but there are still failures of processing screenshots." \
|
92
|
+
"Check App Store Connect console to work out which screenshots processed unsuccessfully.")
|
93
|
+
end
|
94
|
+
|
95
|
+
# retry with deleting failing screenshots
|
96
|
+
result.failing_screenshots.each(&:delete!)
|
97
|
+
replace_screenshots(iterator, screenshots, retries - 1)
|
98
|
+
end
|
99
|
+
|
100
|
+
# This is a testable method that focuses on figuring out what to update
|
101
|
+
def do_replace_screenshots(iterator, screenshots, delete_worker, upload_worker)
|
102
|
+
remote_screenshots = iterator.each_app_screenshot.map do |localization, app_screenshot_set, app_screenshot|
|
103
|
+
ScreenshotComparable.create_from_remote(app_screenshot: app_screenshot, locale: localization.locale)
|
104
|
+
end
|
105
|
+
|
106
|
+
local_screenshots = iterator.each_local_screenshot(screenshots.group_by(&:language)).map do |localization, app_screenshot_set, screenshot, index|
|
107
|
+
if index >= 10
|
108
|
+
UI.user_error!("Found #{localization.locale} has more than 10 screenshots for #{app_screenshot_set.screenshot_display_type}. "\
|
109
|
+
"Make sure containts only necessary screenshots.")
|
110
|
+
end
|
111
|
+
ScreenshotComparable.create_from_local(screenshot: screenshot, app_screenshot_set: app_screenshot_set)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Thanks to `Array#-` API and `ScreenshotComparable`, working out diffs between local screenshot directory and App Store Connect
|
115
|
+
# is as easy as you can see below. The former one finds what is missing in local and the latter one is visa versa.
|
116
|
+
screenshots_to_delete = remote_screenshots - local_screenshots
|
117
|
+
screenshots_to_upload = local_screenshots - remote_screenshots
|
118
|
+
|
119
|
+
delete_jobs = screenshots_to_delete.map { |x| DeleteScreenshotJob.new(x.context[:app_screenshot], x.context[:locale]) }
|
120
|
+
delete_worker.batch_enqueue(delete_jobs)
|
121
|
+
delete_worker.start
|
122
|
+
|
123
|
+
upload_jobs = screenshots_to_upload.map { |x| UploadScreenshotJob.new(x.context[:app_screenshot_set], x.context[:screenshot].path) }
|
124
|
+
upload_worker.batch_enqueue(upload_jobs)
|
125
|
+
upload_worker.start
|
126
|
+
end
|
127
|
+
|
128
|
+
def wait_for_complete(iterator)
|
129
|
+
retry_count = 0
|
130
|
+
Helper.show_loading_indicator("Waiting for all the screenshots processed...")
|
131
|
+
loop do
|
132
|
+
failing_screenshots = []
|
133
|
+
state_counts = iterator.each_app_screenshot.map { |_, _, app_screenshot| app_screenshot }.each_with_object({}) do |app_screenshot, hash|
|
134
|
+
state = app_screenshot.asset_delivery_state['state']
|
135
|
+
hash[state] ||= 0
|
136
|
+
hash[state] += 1
|
137
|
+
failing_screenshots << app_screenshot if app_screenshot.error?
|
138
|
+
end
|
139
|
+
|
140
|
+
result = UploadResult.new(asset_delivery_state_counts: state_counts, failing_screenshots: failing_screenshots)
|
141
|
+
return result unless result.processing?
|
142
|
+
|
143
|
+
# sleep with exponential backoff
|
144
|
+
interval = 5 + (2**retry_count)
|
145
|
+
UI.message("There are still incomplete screenshots. Will check the states again in #{interval} secs - #{state_counts}")
|
146
|
+
sleep(interval)
|
147
|
+
retry_count += 1
|
148
|
+
end
|
149
|
+
ensure
|
150
|
+
Helper.hide_loading_indicator
|
151
|
+
end
|
152
|
+
|
153
|
+
def sort_screenshots(iterator)
|
154
|
+
Helper.show_loading_indicator("Sorting screenshots uploaded...")
|
155
|
+
sort_worker = create_sort_worker
|
156
|
+
sort_worker.batch_enqueue(iterator.each_app_screenshot_set.to_a.map { |_, set| set })
|
157
|
+
sort_worker.start
|
158
|
+
Helper.hide_loading_indicator
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def version
|
164
|
+
@version ||= @app.get_edit_app_store_version(platform: @platform)
|
165
|
+
end
|
166
|
+
|
167
|
+
def fetch_localizations
|
168
|
+
version.get_app_store_version_localizations
|
169
|
+
end
|
170
|
+
|
171
|
+
def create_upload_worker
|
172
|
+
FastlaneCore::QueueWorker.new do |job|
|
173
|
+
UI.verbose("Uploading '#{job.path}'...")
|
174
|
+
start_time = Time.now
|
175
|
+
job.app_screenshot_set.upload_screenshot(path: job.path, wait_for_processing: false)
|
176
|
+
UI.message("Uploaded '#{job.path}'... (#{Time.now - start_time} secs)")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def create_delete_worker
|
181
|
+
FastlaneCore::QueueWorker.new do |job|
|
182
|
+
target = "id=#{job.app_screenshot.id} #{job.locale} #{job.app_screenshot.file_name}"
|
183
|
+
UI.verbose("Deleting '#{target}'")
|
184
|
+
start_time = Time.now
|
185
|
+
job.app_screenshot.delete!
|
186
|
+
UI.message("Deleted '#{target}' - (#{Time.now - start_time} secs)")
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def create_sort_worker
|
191
|
+
FastlaneCore::QueueWorker.new do |app_screenshot_set|
|
192
|
+
original_ids = app_screenshot_set.app_screenshots.map(&:id)
|
193
|
+
sorted_ids = Naturally.sort(app_screenshot_set.app_screenshots, by: :file_name).map(&:id)
|
194
|
+
if original_ids != sorted_ids
|
195
|
+
app_screenshot_set.reorder_screenshots(app_screenshot_ids: sorted_ids)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
+
require 'fastlane_core'
|
1
2
|
require 'spaceship'
|
2
3
|
|
3
4
|
require_relative 'module'
|
4
|
-
require_relative 'queue_worker'
|
5
5
|
|
6
6
|
module Deliver
|
7
7
|
# upload description, rating, etc.
|
@@ -82,7 +82,7 @@ module Deliver
|
|
82
82
|
def upload(options)
|
83
83
|
return if options[:skip_metadata]
|
84
84
|
|
85
|
-
app =
|
85
|
+
app = Deliver.cache[:app]
|
86
86
|
|
87
87
|
platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
|
88
88
|
|
@@ -97,7 +97,7 @@ module Deliver
|
|
97
97
|
localised_options = LOCALISED_LIVE_VALUES
|
98
98
|
non_localised_options = NON_LOCALISED_LIVE_VALUES
|
99
99
|
|
100
|
-
if
|
100
|
+
if version.nil?
|
101
101
|
UI.message("Couldn't find live version, editing the current version on App Store Connect instead")
|
102
102
|
version = fetch_edit_app_store_version(app, platform)
|
103
103
|
# we don't want to update the localised_options and non_localised_options
|
@@ -200,7 +200,7 @@ module Deliver
|
|
200
200
|
sleep(1)
|
201
201
|
|
202
202
|
# Update app store version localizations
|
203
|
-
store_version_worker =
|
203
|
+
store_version_worker = FastlaneCore::QueueWorker.new do |app_store_version_localization|
|
204
204
|
attributes = localized_version_attributes_by_locale[app_store_version_localization.locale]
|
205
205
|
if attributes
|
206
206
|
UI.message("Uploading metadata to App Store Connect for localized version '#{app_store_version_localization.locale}'")
|
@@ -211,7 +211,7 @@ module Deliver
|
|
211
211
|
store_version_worker.start
|
212
212
|
|
213
213
|
# Update app info localizations
|
214
|
-
app_info_worker =
|
214
|
+
app_info_worker = FastlaneCore::QueueWorker.new do |app_info_localization|
|
215
215
|
attributes = localized_info_attributes_by_locale[app_info_localization.locale]
|
216
216
|
if attributes
|
217
217
|
UI.message("Uploading metadata to App Store Connect for localized info '#{app_info_localization.locale}'")
|
@@ -342,7 +342,7 @@ module Deliver
|
|
342
342
|
|
343
343
|
set_review_information(version, options)
|
344
344
|
set_review_attachment_file(version, options)
|
345
|
-
set_app_rating(
|
345
|
+
set_app_rating(app_info, options)
|
346
346
|
end
|
347
347
|
|
348
348
|
# rubocop:enable Metrics/PerceivedComplexity
|
@@ -592,9 +592,10 @@ module Deliver
|
|
592
592
|
end
|
593
593
|
|
594
594
|
def set_review_information(version, options)
|
595
|
-
return unless options[:app_review_information]
|
596
595
|
info = options[:app_review_information]
|
597
|
-
|
596
|
+
return if info.nil? || info.empty?
|
597
|
+
|
598
|
+
info = info.transform_keys(&:to_sym)
|
598
599
|
UI.user_error!("`app_review_information` must be a hash", show_github_issues: true) unless info.kind_of?(Hash)
|
599
600
|
|
600
601
|
attributes = {}
|
@@ -641,7 +642,7 @@ module Deliver
|
|
641
642
|
end
|
642
643
|
end
|
643
644
|
|
644
|
-
def set_app_rating(
|
645
|
+
def set_app_rating(app_info, options)
|
645
646
|
return unless options[:app_rating_config_path]
|
646
647
|
|
647
648
|
require 'json'
|
@@ -674,9 +675,23 @@ module Deliver
|
|
674
675
|
has_mapped_values = true
|
675
676
|
UI.deprecated("Age rating '#{k}' from iTunesConnect has been deprecated. Please replace with '#{v}'")
|
676
677
|
end
|
677
|
-
UI.deprecated("You can find more info at https://docs.fastlane.tools/actions/deliver/#reference") if has_mapped_values
|
678
678
|
|
679
|
-
|
679
|
+
# Handle App Store Connect deprecation/migrations of keys/values if possible
|
680
|
+
attributes, deprecation_messages, errors = Spaceship::ConnectAPI::AgeRatingDeclaration.map_deprecation_if_possible(attributes)
|
681
|
+
deprecation_messages.each do |message|
|
682
|
+
UI.deprecated(message)
|
683
|
+
end
|
684
|
+
|
685
|
+
unless errors.empty?
|
686
|
+
errors.each do |error|
|
687
|
+
UI.error(error)
|
688
|
+
end
|
689
|
+
UI.user_error!("There are Age Rating deprecation errors that cannot be solved automatically... Please apply any fixes and try again")
|
690
|
+
end
|
691
|
+
|
692
|
+
UI.deprecated("You can find more info at https://docs.fastlane.tools/actions/deliver/#reference") if has_mapped_values || !deprecation_messages.empty?
|
693
|
+
|
694
|
+
age_rating_declaration = app_info.fetch_age_rating_declaration
|
680
695
|
age_rating_declaration.update(attributes: attributes)
|
681
696
|
end
|
682
697
|
end
|
@@ -1,23 +1,23 @@
|
|
1
|
+
require 'fastlane_core'
|
1
2
|
require 'spaceship/tunes/tunes'
|
2
3
|
require 'digest/md5'
|
3
4
|
|
4
5
|
require_relative 'app_screenshot'
|
5
6
|
require_relative 'module'
|
6
7
|
require_relative 'loader'
|
7
|
-
require_relative 'queue_worker'
|
8
8
|
require_relative 'app_screenshot_iterator'
|
9
9
|
|
10
10
|
module Deliver
|
11
11
|
# upload screenshots to App Store Connect
|
12
12
|
class UploadScreenshots
|
13
|
-
|
13
|
+
DeleteScreenshotSetJob = Struct.new(:app_screenshot_set, :localization)
|
14
14
|
UploadScreenshotJob = Struct.new(:app_screenshot_set, :path)
|
15
15
|
|
16
16
|
def upload(options, screenshots)
|
17
17
|
return if options[:skip_screenshots]
|
18
18
|
return if options[:edit_live]
|
19
19
|
|
20
|
-
app =
|
20
|
+
app = Deliver.cache[:app]
|
21
21
|
|
22
22
|
platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
|
23
23
|
version = app.get_edit_app_store_version(platform: platform)
|
@@ -67,12 +67,12 @@ module Deliver
|
|
67
67
|
def delete_screenshots(localizations, screenshots_per_language, tries: 5)
|
68
68
|
tries -= 1
|
69
69
|
|
70
|
-
worker = QueueWorker.new do |job|
|
70
|
+
worker = FastlaneCore::QueueWorker.new do |job|
|
71
71
|
start_time = Time.now
|
72
|
-
target = "#{job.localization.locale} #{job.app_screenshot_set.screenshot_display_type}
|
72
|
+
target = "#{job.localization.locale} #{job.app_screenshot_set.screenshot_display_type}"
|
73
73
|
begin
|
74
74
|
UI.verbose("Deleting '#{target}'")
|
75
|
-
job.
|
75
|
+
job.app_screenshot_set.delete!
|
76
76
|
UI.message("Deleted '#{target}' - (#{Time.now - start_time} secs)")
|
77
77
|
rescue => error
|
78
78
|
UI.error("Failed to delete screenshot #{target} - (#{Time.now - start_time} secs)")
|
@@ -81,12 +81,12 @@ module Deliver
|
|
81
81
|
end
|
82
82
|
|
83
83
|
iterator = AppScreenshotIterator.new(localizations)
|
84
|
-
iterator.
|
84
|
+
iterator.each_app_screenshot_set do |localization, app_screenshot_set|
|
85
85
|
# Only delete screenshots if trying to upload
|
86
86
|
next unless screenshots_per_language.keys.include?(localization.locale)
|
87
87
|
|
88
|
-
UI.verbose("Queued delete sceeenshot job for #{localization.locale} #{app_screenshot_set.screenshot_display_type}
|
89
|
-
worker.enqueue(
|
88
|
+
UI.verbose("Queued delete sceeenshot set job for #{localization.locale} #{app_screenshot_set.screenshot_display_type}")
|
89
|
+
worker.enqueue(DeleteScreenshotSetJob.new(app_screenshot_set, localization))
|
90
90
|
end
|
91
91
|
|
92
92
|
worker.start
|
@@ -113,7 +113,7 @@ module Deliver
|
|
113
113
|
tries -= 1
|
114
114
|
|
115
115
|
# Upload screenshots
|
116
|
-
worker = QueueWorker.new do |job|
|
116
|
+
worker = FastlaneCore::QueueWorker.new do |job|
|
117
117
|
begin
|
118
118
|
UI.verbose("Uploading '#{job.path}'...")
|
119
119
|
start_time = Time.now
|
@@ -231,12 +231,13 @@ module Deliver
|
|
231
231
|
end
|
232
232
|
|
233
233
|
def sort_screenshots(localizations)
|
234
|
+
require 'naturally'
|
234
235
|
iterator = AppScreenshotIterator.new(localizations)
|
235
236
|
|
236
237
|
# Re-order screenshots within app_screenshot_set
|
237
|
-
worker = QueueWorker.new do |app_screenshot_set|
|
238
|
+
worker = FastlaneCore::QueueWorker.new do |app_screenshot_set|
|
238
239
|
original_ids = app_screenshot_set.app_screenshots.map(&:id)
|
239
|
-
sorted_ids = app_screenshot_set.app_screenshots
|
240
|
+
sorted_ids = Naturally.sort(app_screenshot_set.app_screenshots, by: :file_name).map(&:id)
|
240
241
|
if original_ids != sorted_ids
|
241
242
|
app_screenshot_set.reorder_screenshots(app_screenshot_ids: sorted_ids)
|
242
243
|
end
|
@@ -4,6 +4,7 @@ _fastlane_complete() {
|
|
4
4
|
COMPREPLY=()
|
5
5
|
local word="${COMP_WORDS[COMP_CWORD]}"
|
6
6
|
local completions=""
|
7
|
+
local file
|
7
8
|
|
8
9
|
# look for Fastfile either in this directory or fastlane/ then grab the lane names
|
9
10
|
if [[ -e "Fastfile" ]]; then
|
@@ -12,10 +13,12 @@ _fastlane_complete() {
|
|
12
13
|
file="fastlane/Fastfile"
|
13
14
|
elif [[ -e ".fastlane/Fastfile" ]]; then
|
14
15
|
file=".fastlane/Fastfile"
|
16
|
+
else
|
17
|
+
return 1
|
15
18
|
fi
|
16
19
|
|
17
20
|
# parse 'beta' out of 'lane :beta do', etc
|
18
|
-
completions
|
21
|
+
completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
|
19
22
|
completions="$completions update_fastlane"
|
20
23
|
|
21
24
|
COMPREPLY=( $(compgen -W "$completions" -- "$word") )
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/bin/zsh
|
2
2
|
|
3
3
|
_fastlane_complete() {
|
4
|
-
local word completions
|
4
|
+
local word completions file
|
5
5
|
word="$1"
|
6
6
|
|
7
7
|
# look for Fastfile either in this directory or fastlane/ then grab the lane names
|
@@ -11,13 +11,14 @@ _fastlane_complete() {
|
|
11
11
|
file="fastlane/Fastfile"
|
12
12
|
elif [[ -e ".fastlane/Fastfile" ]] then
|
13
13
|
file=".fastlane/Fastfile"
|
14
|
+
else
|
15
|
+
return 1
|
14
16
|
fi
|
15
17
|
|
16
18
|
# parse 'beta' out of 'lane :beta do', etc
|
17
|
-
completions
|
18
|
-
completions="$completions
|
19
|
-
update_fastlane"
|
19
|
+
completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
|
20
|
+
completions="$completions update_fastlane"
|
20
21
|
|
21
|
-
reply=( "${
|
22
|
+
reply=( "${=completions}" )
|
22
23
|
}
|
23
24
|
|
Binary file
|
@@ -87,13 +87,13 @@ module Fastlane
|
|
87
87
|
end
|
88
88
|
|
89
89
|
# returns a list of official integrations
|
90
|
-
# rubocop:disable
|
90
|
+
# rubocop:disable Naming/AccessorMethodName
|
91
91
|
def self.get_all_official_actions
|
92
92
|
Dir[File.expand_path('*.rb', File.dirname(__FILE__))].collect do |file|
|
93
93
|
File.basename(file).gsub('.rb', '').to_sym
|
94
94
|
end
|
95
95
|
end
|
96
|
-
# rubocop:enable
|
96
|
+
# rubocop:enable Naming/AccessorMethodName
|
97
97
|
|
98
98
|
# Returns the class ref to the action based on the action name
|
99
99
|
# Returns nil if the action is not available
|
@@ -27,18 +27,15 @@ module Fastlane
|
|
27
27
|
FastlaneCore::ConfigItem.new(key: :serial,
|
28
28
|
env_name: "FL_ANDROID_SERIAL",
|
29
29
|
description: "Android serial of the device to use for this command",
|
30
|
-
is_string: true,
|
31
30
|
default_value: ""),
|
32
31
|
FastlaneCore::ConfigItem.new(key: :command,
|
33
32
|
env_name: "FL_ADB_COMMAND",
|
34
33
|
description: "All commands you want to pass to the adb command, e.g. `kill-server`",
|
35
|
-
optional: true,
|
36
|
-
is_string: true),
|
34
|
+
optional: true),
|
37
35
|
FastlaneCore::ConfigItem.new(key: :adb_path,
|
38
36
|
env_name: "FL_ADB_PATH",
|
39
37
|
optional: true,
|
40
|
-
description: "The path to your `adb` binary (can be left blank if the ANDROID_SDK_ROOT environment variable is set)",
|
41
|
-
is_string: true,
|
38
|
+
description: "The path to your `adb` binary (can be left blank if the ANDROID_SDK_ROOT, ANDROID_HOME or ANDROID_SDK environment variable is set)",
|
42
39
|
default_value: "adb")
|
43
40
|
]
|
44
41
|
end
|
@@ -27,7 +27,6 @@ module Fastlane
|
|
27
27
|
FastlaneCore::ConfigItem.new(key: :adb_path,
|
28
28
|
env_name: "FL_ADB_PATH",
|
29
29
|
description: "The path to your `adb` binary (can be left blank if the ANDROID_SDK_ROOT environment variable is set)",
|
30
|
-
is_string: true,
|
31
30
|
optional: true,
|
32
31
|
default_value: "adb")
|
33
32
|
]
|
@@ -63,7 +63,7 @@ module Fastlane
|
|
63
63
|
FastlaneCore::ConfigItem.new(key: :includes_lane,
|
64
64
|
env_name: "FL_GIT_TAG_INCLUDES_LANE",
|
65
65
|
description: "Whether the current lane should be included in the tag and message composition, e.g. '<grouping>/<lane>/<prefix><build_number><postfix>'",
|
66
|
-
|
66
|
+
type: Boolean,
|
67
67
|
default_value: true),
|
68
68
|
FastlaneCore::ConfigItem.new(key: :prefix,
|
69
69
|
env_name: "FL_GIT_TAG_PREFIX",
|
@@ -78,7 +78,7 @@ module Fastlane
|
|
78
78
|
description: "The build number. Defaults to the result of increment_build_number if you\'re using it",
|
79
79
|
default_value: Actions.lane_context[Actions::SharedValues::BUILD_NUMBER],
|
80
80
|
default_value_dynamic: true,
|
81
|
-
|
81
|
+
skip_type_validation: true, # skipping validation because we both allow integer and string
|
82
82
|
optional: true),
|
83
83
|
FastlaneCore::ConfigItem.new(key: :message,
|
84
84
|
env_name: "FL_GIT_TAG_MESSAGE",
|
@@ -94,13 +94,13 @@ module Fastlane
|
|
94
94
|
env_name: "FL_GIT_TAG_FORCE",
|
95
95
|
description: "Force adding the tag",
|
96
96
|
optional: true,
|
97
|
-
|
97
|
+
type: Boolean,
|
98
98
|
default_value: false),
|
99
99
|
FastlaneCore::ConfigItem.new(key: :sign,
|
100
100
|
env_name: "FL_GIT_TAG_SIGN",
|
101
101
|
description: "Make a GPG-signed tag, using the default e-mail address's key",
|
102
102
|
optional: true,
|
103
|
-
|
103
|
+
type: Boolean,
|
104
104
|
default_value: false)
|
105
105
|
]
|
106
106
|
end
|
@@ -27,11 +27,16 @@ module Fastlane
|
|
27
27
|
|
28
28
|
def self.get_build_number(params)
|
29
29
|
# Prompts select team if multiple teams and none specified
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
if (api_token = Spaceship::ConnectAPI::Token.from(hash: params[:api_key], filepath: params[:api_key_path]))
|
31
|
+
UI.message("Creating authorization token for App Store Connect API")
|
32
|
+
Spaceship::ConnectAPI.token = api_token
|
33
|
+
elsif !Spaceship::ConnectAPI.token.nil?
|
34
|
+
UI.message("Using existing authorization token for App Store Connect API")
|
34
35
|
else
|
36
|
+
# Username is now optional since addition of App Store Connect API Key
|
37
|
+
# Force asking for username to prompt user if not already set
|
38
|
+
params.fetch(:username, force_ask: true)
|
39
|
+
|
35
40
|
UI.message("Login to App Store Connect (#{params[:username]})")
|
36
41
|
Spaceship::ConnectAPI.login(params[:username], use_portal: false, use_tunes: true, tunes_team_id: params[:team_id], team_name: params[:team_name])
|
37
42
|
UI.message("Login successful")
|
@@ -98,13 +103,6 @@ module Fastlane
|
|
98
103
|
versions.map(&:to_s).sort_by { |v| Gem::Version.new(v) }
|
99
104
|
end
|
100
105
|
|
101
|
-
def self.api_token(params)
|
102
|
-
params[:api_key] ||= Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY]
|
103
|
-
api_token ||= Spaceship::ConnectAPI::Token.create(params[:api_key]) if params[:api_key]
|
104
|
-
api_token ||= Spaceship::ConnectAPI::Token.from_json_file(params[:api_key_path]) if params[:api_key_path]
|
105
|
-
return api_token
|
106
|
-
end
|
107
|
-
|
108
106
|
#####################################################
|
109
107
|
# @!group Documentation
|
110
108
|
#####################################################
|
@@ -118,7 +116,7 @@ module Fastlane
|
|
118
116
|
user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
|
119
117
|
[
|
120
118
|
FastlaneCore::ConfigItem.new(key: :api_key_path,
|
121
|
-
|
119
|
+
env_names: ["APPSTORE_BUILD_NUMBER_API_KEY_PATH", "APP_STORE_CONNECT_API_KEY_PATH"],
|
122
120
|
description: "Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)",
|
123
121
|
optional: true,
|
124
122
|
conflicting_options: [:api_key],
|
@@ -126,16 +124,18 @@ module Fastlane
|
|
126
124
|
UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
|
127
125
|
end),
|
128
126
|
FastlaneCore::ConfigItem.new(key: :api_key,
|
129
|
-
|
130
|
-
description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#
|
127
|
+
env_names: ["APPSTORE_BUILD_NUMBER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
|
128
|
+
description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
|
131
129
|
type: Hash,
|
130
|
+
default_value: Fastlane::Actions.lane_context[Fastlane::Actions::SharedValues::APP_STORE_CONNECT_API_KEY],
|
131
|
+
default_value_dynamic: true,
|
132
132
|
optional: true,
|
133
133
|
sensitive: true,
|
134
134
|
conflicting_options: [:api_key_path]),
|
135
135
|
FastlaneCore::ConfigItem.new(key: :initial_build_number,
|
136
136
|
env_name: "INITIAL_BUILD_NUMBER",
|
137
137
|
description: "sets the build number to given value if no build is in current train",
|
138
|
-
|
138
|
+
skip_type_validation: true), # as we also allow integers, which we convert to strings anyway
|
139
139
|
FastlaneCore::ConfigItem.new(key: :app_identifier,
|
140
140
|
short_option: "-a",
|
141
141
|
env_name: "FASTLANE_APP_IDENTIFIER",
|
@@ -147,6 +147,7 @@ module Fastlane
|
|
147
147
|
short_option: "-u",
|
148
148
|
env_name: "ITUNESCONNECT_USER",
|
149
149
|
description: "Your Apple ID Username",
|
150
|
+
optional: true,
|
150
151
|
default_value: user,
|
151
152
|
default_value_dynamic: true),
|
152
153
|
FastlaneCore::ConfigItem.new(key: :team_id,
|
@@ -154,7 +155,7 @@ module Fastlane
|
|
154
155
|
env_name: "APPSTORE_BUILD_NUMBER_LIVE_TEAM_ID",
|
155
156
|
description: "The ID of your App Store Connect team if you're in multiple teams",
|
156
157
|
optional: true,
|
157
|
-
|
158
|
+
skip_type_validation: true, # as we also allow integers, which we convert to strings anyway
|
158
159
|
code_gen_sensitive: true,
|
159
160
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:itc_team_id),
|
160
161
|
default_value_dynamic: true,
|
@@ -166,7 +167,7 @@ module Fastlane
|
|
166
167
|
env_name: "APPSTORE_BUILD_NUMBER_LIVE",
|
167
168
|
description: "Query the live version (ready-for-sale)",
|
168
169
|
optional: true,
|
169
|
-
|
170
|
+
type: Boolean,
|
170
171
|
default_value: true),
|
171
172
|
FastlaneCore::ConfigItem.new(key: :version,
|
172
173
|
env_name: "LATEST_VERSION",
|
@@ -177,7 +178,6 @@ module Fastlane
|
|
177
178
|
env_name: "APPSTORE_PLATFORM",
|
178
179
|
description: "The platform to use (optional)",
|
179
180
|
optional: true,
|
180
|
-
is_string: true,
|
181
181
|
default_value: "ios",
|
182
182
|
verify_block: proc do |value|
|
183
183
|
UI.user_error!("The platform can only be ios, appletvos, or osx") unless %('ios', 'appletvos', 'osx').include?(value)
|