diff --git a/fastlane/patches/supply_custom_promote.rb b/fastlane/patches/supply_custom_promote.rb index 84fb6a4cc2..ec34d00e97 100644 --- a/fastlane/patches/supply_custom_promote.rb +++ b/fastlane/patches/supply_custom_promote.rb @@ -1,15 +1,9 @@ -# Patch Description: -# Fixes issue where Fastlane 'Supply' doesn't recognize previous builds -# when promoting to another track. -# -# Source: https://github.com/artsy/eigen/pull/10262 -# Author: Brian Beckerle (@brainbicycle) -# - module Supply class Uploader + # Alias the original promote_track method so we can override it alias_method :original_promote_track, :promote_track + # Override promote_track to use custom logic if skip_release_verification is set def promote_track if Supply.config[:skip_release_verification] custom_promote_track @@ -18,20 +12,44 @@ module Supply end end + # Utility method: Print all version codes for the given version name + def print_version_codes_for_name + version_name = Supply.config[:version_name] + return if version_name.nil? || version_name.empty? + + all_tracks = client.tracks(nil) # nil fetches all tracks + all_tracks.each do |track| + track.releases.each do |release| + if release.name == version_name + UI.message("Track '#{track.track}' has release '#{version_name}' with version codes: #{release.version_codes.join(', ')}") + end + end + end + end + + # Custom promotion logic for handling track promotion def custom_promote_track UI.message("Using custom promotion logic") + + # Always print version codes for the supplied version name (if provided) + print_version_codes_for_name + + # Fetch the source track to promote from track_from = client.tracks(Supply.config[:track]).first unless track_from UI.user_error!("Cannot promote from track '#{Supply.config[:track]}' - track doesn't exist") end + # Gather all releases from the source track and log their version codes releases = track_from.releases releases = releases.select do |release| - UI.message("Available version codes in track '#{Supply.config[:track]}': #{release.version_codes.join(', ')} for release '#{release.name}'") + UI.message("Available version codes in track '#{Supply.config[:track]}': #{release.version_codes.join(', ')} for release '#{release.name}'") end - + # Get the version code to promote version_code = Supply.config[:version_code].to_s + + # If release verification is not skipped, filter releases by version code or status if !Supply.config[:skip_release_verification] if version_code != "" releases = releases.select do |release| @@ -43,6 +61,7 @@ module Supply end end + # Error handling for missing or ambiguous releases if releases.size == 0 if version_code != "" UI.user_error!("Cannot find release with version code '#{version_code}' to promote in track '#{Supply.config[:track]}'") @@ -53,6 +72,7 @@ module Supply UI.user_error!("Track '#{Supply.config[:track]}' has more than one release - use :version_code to filter the release to promote") end else + # If skipping verification, require version code and version name UI.message("Skipping release verification as per configuration.") if version_code == "" UI.user_error!("Must provide a version code when release verification is skipped.") @@ -60,6 +80,7 @@ module Supply if Supply.config[:version_name].nil? UI.user_error!("To force promote a :version_code, it is mandatory to enter the :version_name") end + # Create a new release object for forced promotion release = AndroidPublisher::TrackRelease.new( name: Supply.config[:version_name], version_codes: [version_code], @@ -67,12 +88,16 @@ module Supply ) end + # Select the release to promote if verification is not skipped release = releases.first unless Supply.config[:skip_release_verification] + + # Fetch or create the destination track to promote to track_to = client.tracks(Supply.config[:track_promote_to]).first || AndroidPublisher::Track.new( track: Supply.config[:track_promote_to], releases: [] ) + # Set rollout fraction and release status for partial rollouts rollout = (Supply.config[:rollout] || 0).to_f if rollout > 0 && rollout < 1 release.status = Supply::ReleaseStatus::IN_PROGRESS @@ -82,11 +107,11 @@ module Supply release.user_fraction = nil end + # Log the promotion action UI.message("Promoting release with version: #{release.name} (#{release.version_codes.first})") + # Assign the release to the destination track if track_to - # Its okay to set releases to an array containing the newest release - # Google Play will keep previous releases there this release is a partial rollout track_to.releases = [release] else track_to = AndroidPublisher::Track.new( @@ -95,6 +120,7 @@ module Supply ) end + # Update the destination track with the new release client.update_track(Supply.config[:track_promote_to], track_to) UI.message("confirmed that update_track was reached: #{Supply.config[:track_promote_to]} #{release}") end