android/fastlane/patches/supply_custom_promote.rb
2025-08-21 17:36:54 -04:00

104 lines
3.7 KiB
Ruby

# 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_method :original_promote_track, :promote_track
def promote_track
if Supply.config[:skip_release_verification]
custom_promote_track
else
original_promote_track
end
end
def custom_promote_track
UI.message("Using custom promotion logic")
track_from = client.tracks(Supply.config[:track], max_results: 500).first
unless track_from
UI.user_error!("Cannot promote from track '#{Supply.config[:track]}' - track doesn't exist")
end
releases = track_from.releases
version_code = Supply.config[:version_code].to_s
if !Supply.config[:skip_release_verification]
if version_code != ""
releases = releases.select do |release|
release.version_codes.include?(version_code)
end
else
releases = releases.select do |release|
release.status == Supply.config[:release_status]
end
end
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]}'")
else
UI.user_error!("Track '#{Supply.config[:track]}' doesn't have any releases")
end
elsif releases.size > 1
UI.user_error!("Track '#{Supply.config[:track]}' has more than one release - use :version_code to filter the release to promote")
end
else
UI.message("Skipping release verification as per configuration.")
if version_code == ""
UI.user_error!("Must provide a version code when release verification is skipped.")
end
if Supply.config[:version_name].nil?
UI.user_error!("To force promote a :version_code, it is mandatory to enter the :version_name")
end
release = AndroidPublisher::TrackRelease.new(
name: Supply.config[:version_name],
version_codes: [version_code],
status: Supply.config[:track_promote_release_status] || Supply::ReleaseStatus::COMPLETED
)
end
release = releases.first unless Supply.config[:skip_release_verification]
track_to = client.tracks(Supply.config[:track_promote_to]).first || AndroidPublisher::Track.new(
track: Supply.config[:track_promote_to],
releases: []
)
rollout = (Supply.config[:rollout] || 0).to_f
if rollout > 0 && rollout < 1
release.status = Supply::ReleaseStatus::IN_PROGRESS
release.user_fraction = rollout
else
release.status = Supply.config[:track_promote_release_status]
release.user_fraction = nil
end
UI.message("Promoting release with version: #{release.name} (#{release.version_codes.first})")
if track_to
UI.message("Using existing 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
UI.message("Creating new track_to")
track_to = AndroidPublisher::Track.new(
track: Supply.config[:track_promote_to],
releases: [release]
)
end
UI.message("track_to details: #{track_to.inspect}")
UI.message("About to promote with release: #{release.inspect}")
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
end
end