deliver/lib/deliver/upload_screenshots.rb in fastlane-2.149.1 vs deliver/lib/deliver/upload_screenshots.rb in fastlane-2.150.0.rc1

- old
+ new

@@ -9,72 +9,121 @@ class UploadScreenshots def upload(options, screenshots) return if options[:skip_screenshots] return if options[:edit_live] - app = options[:app] + legacy_app = options[:app] + app_id = legacy_app.apple_id + app = Spaceship::ConnectAPI::App.get(app_id: app_id) - v = app.edit_version(platform: options[:platform]) - UI.user_error!("Could not find a version to edit for app '#{app.name}'") unless v + platform = Spaceship::ConnectAPI::Platform.map(options[:platform]) + version = app.get_edit_app_store_version(platform: platform) + UI.user_error!("Could not find a version to edit for app '#{app.name}' for '#{platform}'") unless version + UI.important("Will begin uploading snapshots for '#{version.version_string}' on App Store Connect") + UI.message("Starting with the upload of screenshots...") screenshots_per_language = screenshots.group_by(&:language) + localizations = version.get_app_store_version_localizations + if options[:overwrite_screenshots] - UI.message("Removing all previously uploaded screenshots...") - # First, clear all previously uploaded screenshots - screenshots_per_language.keys.each do |language| - # We have to nil check for languages not activated - next if v.screenshots[language].nil? - v.screenshots[language].each_with_index do |t, index| - v.upload_screenshot!(nil, t.sort_order, t.language, t.device_type, t.is_imessage) + # Get localizations on version + localizations.each do |localization| + # Only delete screenshots if trying to upload + next unless screenshots_per_language.keys.include?(localization.locale) + + # Iterate over all screenshots for each set and delete + screenshot_sets = localization.get_app_screenshot_sets + screenshot_sets.each do |screenshot_set| + UI.message("Removing all previously uploaded screenshots for '#{localization.locale}' '#{screenshot_set.screenshot_display_type}'...") + screenshot_set.app_screenshots.each do |screenshot| + UI.verbose("Deleting screenshot - #{localization.locale} #{screenshot_set.screenshot_display_type} #{screenshot.id}") + screenshot.delete! + end end end end - # Now, fill in the new ones - indized = {} # per language and device type + # Finding languages to enable + languages = screenshots_per_language.keys + locales_to_enable = languages - localizations.map(&:locale) - enabled_languages = screenshots_per_language.keys - if enabled_languages.count > 0 - v.create_languages(enabled_languages) + if locales_to_enable.count > 0 lng_text = "language" - lng_text += "s" if enabled_languages.count != 1 - Helper.show_loading_indicator("Activating #{lng_text} #{enabled_languages.join(', ')}...") - v.save! - # This refreshes the app version from iTC after enabling a localization - v = app.edit_version(platform: options[:platform]) + lng_text += "s" if locales_to_enable.count != 1 + Helper.show_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...") + + locales_to_enable.each do |locale| + version.create_app_store_version_localization(attributes: { + locale: locale + }) + end + Helper.hide_loading_indicator + + # Refresh version localizations + localizations = version.get_app_store_version_localizations end + # Upload screenshots + indized = {} # per language and device type + screenshots_per_language.each do |language, screenshots_for_language| + # Find localization to upload screenshots to + localization = localizations.find do |l| + l.locale == language + end + + unless localization + UI.error("Couldn't find localization on version for #{language}") + next + end + + indized[localization.locale] ||= {} + + # Create map to find screenshot set to add screenshot to + app_screenshot_sets_map = {} + app_screenshot_sets = localization.get_app_screenshot_sets + app_screenshot_sets.each do |app_screenshot_set| + app_screenshot_sets_map[app_screenshot_set.screenshot_display_type] = app_screenshot_set + + # Set initial screnshot count + indized[localization.locale][app_screenshot_set.screenshot_display_type] ||= app_screenshot_set.app_screenshots.size + end + UI.message("Uploading #{screenshots_for_language.length} screenshots for language #{language}") screenshots_for_language.each do |screenshot| - indized[screenshot.language] ||= {} - indized[screenshot.language][screenshot.formatted_name] ||= 0 - indized[screenshot.language][screenshot.formatted_name] += 1 # we actually start with 1... wtf iTC + display_type = screenshot.device_type + set = app_screenshot_sets_map[display_type] - index = indized[screenshot.language][screenshot.formatted_name] + if display_type.nil? + UI.error("Error... Screenshot size #{screenshot.screen_size} not valid for App Store Connect") + next + end - if index > 10 + unless set + set = localization.create_app_screenshot_set(attributes: { + screenshotDisplayType: display_type + }) + app_screenshot_sets_map[display_type] = set + + indized[localization.locale][set.screenshot_display_type] = 0 + end + + index = indized[localization.locale][set.screenshot_display_type] + + if index >= 10 UI.error("Too many screenshots found for device '#{screenshot.formatted_name}' in '#{screenshot.language}', skipping this one (#{screenshot.path})") next end + indized[localization.locale][set.screenshot_display_type] += 1 + + # Also.. what is the messages type even for? UI.message("Uploading '#{screenshot.path}'...") - v.upload_screenshot!(screenshot.path, - index, - screenshot.language, - screenshot.device_type, - screenshot.is_messages?) + set.upload_screenshot(path: screenshot.path) end - # ideally we should only save once, but itunes server can't cope it seems - # so we save per language. See issue #349 - Helper.show_loading_indicator("Saving changes") - v.save! - # Refresh app version to start clean again. See issue #9859 - v = app.edit_version - Helper.hide_loading_indicator end UI.success("Successfully uploaded screenshots to App Store Connect") end def collect_screenshots(options)