From 668527230c89a21b67a58c6aa12c0e7b94596902 Mon Sep 17 00:00:00 2001 From: "M. Reza Nasirloo" Date: Fri, 15 Dec 2023 09:41:54 +0100 Subject: [PATCH] feat: add versionCode parameter to promoteRelease method (#1115) --- .../gradle/androidpublisher/EditManager.kt | 1 + .../internal/DefaultEditManager.kt | 2 + .../androidpublisher/internal/TrackManager.kt | 3 +- .../internal/DefaultEditManagerTest.kt | 6 ++- .../internal/DefaultTrackManagerTest.kt | 52 +++++++++++++++++++ .../androidpublisher/FakeEditManager.kt | 1 + .../gradle/play/PlayPublisherExtension.kt | 8 +++ .../gradle/play/internal/Extensions.kt | 2 + .../gradle/play/tasks/PromoteRelease.kt | 3 +- .../gradle/play/tasks/internal/CliOptions.kt | 13 +++++ .../gradle/play/PlayPublisherExtensionTest.kt | 1 + .../tasks/PromoteReleaseIntegrationTest.kt | 1 + 12 files changed, 89 insertions(+), 4 deletions(-) diff --git a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/EditManager.kt b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/EditManager.kt index dd2a9ca7d..4384fa1c3 100644 --- a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/EditManager.kt +++ b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/EditManager.kt @@ -65,6 +65,7 @@ interface EditManager { userFraction: Double?, updatePriority: Int?, retainableArtifacts: List?, + versionCode: Long? ) /** Uploads the given [bundleFile]. */ diff --git a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManager.kt b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManager.kt index e5140ae7d..b797809bc 100644 --- a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManager.kt +++ b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManager.kt @@ -110,10 +110,12 @@ internal class DefaultEditManager( userFraction: Double?, updatePriority: Int?, retainableArtifacts: List?, + versionCode: Long?, ) { tracks.promote(TrackManager.PromoteConfig( promoteTrackName, fromTrackName, + versionCode, TrackManager.BaseConfig( releaseStatus, userFraction, diff --git a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/TrackManager.kt b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/TrackManager.kt index 2e1475425..34a890de6 100644 --- a/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/TrackManager.kt +++ b/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/TrackManager.kt @@ -33,6 +33,7 @@ internal interface TrackManager { data class PromoteConfig( val promoteTrackName: String, val fromTrackName: String, + val versionCode: Long?, val base: BaseConfig, ) } @@ -82,7 +83,7 @@ internal class DefaultTrackManager( // Update the track for (release in track.releases) { - release.mergeChanges(null, config.base) + release.mergeChanges(config.versionCode?.let { listOf(it) }, config.base) } // Only keep the unique statuses from the highest version code since duplicate statuses are // not allowed. This is how we deal with an update from inProgress -> completed. We update diff --git a/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManagerTest.kt b/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManagerTest.kt index 5b67b2848..e24a15319 100644 --- a/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManagerTest.kt +++ b/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultEditManagerTest.kt @@ -302,19 +302,21 @@ class DefaultEditManagerTest { releaseNotes = mapOf("locale" to "notes"), userFraction = .88, updatePriority = 3, - retainableArtifacts = listOf(777) + retainableArtifacts = listOf(777), + versionCode = 123, ) verify(mockTracks).promote(TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = 123, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, releaseName = "relname", releaseNotes = mapOf("locale" to "notes"), userFraction = .88, updatePriority = 3, - retainableArtifacts = listOf(777) + retainableArtifacts = listOf(777), ) )) } diff --git a/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultTrackManagerTest.kt b/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultTrackManagerTest.kt index 81cae4c0d..7e7cda72e 100644 --- a/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultTrackManagerTest.kt +++ b/play/android-publisher/src/test/kotlin/com/github/triplet/gradle/androidpublisher/internal/DefaultTrackManagerTest.kt @@ -657,6 +657,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = .88, @@ -682,6 +683,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.IN_PROGRESS, userFraction = .88, @@ -722,6 +724,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = null, @@ -763,6 +766,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = null, userFraction = null, @@ -811,6 +815,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = null, @@ -839,6 +844,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = null, @@ -896,6 +902,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "alpha", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = null, @@ -931,6 +938,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "alpha", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = ReleaseStatus.COMPLETED, userFraction = .8, @@ -966,6 +974,7 @@ class DefaultTrackManagerTest { val config = TrackManager.PromoteConfig( promoteTrackName = "alpha", fromTrackName = "internal", + versionCode = null, base = TrackManager.BaseConfig( releaseStatus = null, userFraction = .5, @@ -991,4 +1000,47 @@ class DefaultTrackManagerTest { assertThat(trackCaptor.value.releases.single().status).isEqualTo("inProgress") assertThat(trackCaptor.value.releases.single().userFraction).isEqualTo(0.5) } + + @Test + fun `Promotion with version code specified promotes that specific version code`() { + val config = TrackManager.PromoteConfig( + promoteTrackName = "alpha", + fromTrackName = "internal", + versionCode = 2, + base = TrackManager.BaseConfig( + releaseStatus = null, + userFraction = .5, + updatePriority = null, + releaseNotes = null, + retainableArtifacts = null, + releaseName = null + ) + ) + `when`(mockPublisher.getTrack(any(), any())).thenReturn(Track().apply { + track = "internal" + releases = listOf( + TrackRelease().apply { + status = "completed" + versionCodes = listOf(1) + }, + TrackRelease().apply { + status = "draft" + versionCodes = listOf(2) + }, + TrackRelease().apply { + status = "draft" + versionCodes = listOf(3) + } + ) + }) + + tracks.promote(config) + + val trackCaptor = ArgumentCaptor.forClass(Track::class.java) + verify(mockPublisher).updateTrack(eq("edit-id"), trackCaptor.capture()) + assertThat(trackCaptor.value.releases).hasSize(1) + assertThat(trackCaptor.value.releases.single().status).isEqualTo("inProgress") + assertThat(trackCaptor.value.releases.single().userFraction).isEqualTo(.5) + assertThat(trackCaptor.value.releases.single().versionCodes).containsExactly(2L) + } } diff --git a/play/android-publisher/src/testFixtures/kotlin/com/github/triplet/gradle/androidpublisher/FakeEditManager.kt b/play/android-publisher/src/testFixtures/kotlin/com/github/triplet/gradle/androidpublisher/FakeEditManager.kt index 361d1f0b8..f870a3a0c 100644 --- a/play/android-publisher/src/testFixtures/kotlin/com/github/triplet/gradle/androidpublisher/FakeEditManager.kt +++ b/play/android-publisher/src/testFixtures/kotlin/com/github/triplet/gradle/androidpublisher/FakeEditManager.kt @@ -52,6 +52,7 @@ abstract class FakeEditManager : EditManager { userFraction: Double?, updatePriority: Int?, retainableArtifacts: List?, + versionCode: Long?, ): Unit = throw IllegalStateException("Test wasn't expecting this method to be called.") override fun uploadBundle( diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherExtension.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherExtension.kt index 68685d04c..fb9e978c7 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherExtension.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherExtension.kt @@ -86,6 +86,14 @@ abstract class PlayPublisherExtension @Inject constructor( @get:Input abstract val promoteTrack: Property + /** + * Specify the version code to promote from [fromTrack] to [track]. + * Default is the highest version code in [fromTrack]. + */ + @get:Optional + @get:Input + abstract val versionCode: Property + /** * Specify the initial user fraction intended to receive an `inProgress` release. Defaults to * 0.1 (10%). diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Extensions.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Extensions.kt index 1a51bc0e8..36142e5eb 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Extensions.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Extensions.kt @@ -22,6 +22,7 @@ internal fun PlayPublisherExtension.toConfig() = PlayExtensionConfig( updatePriority.orNull, releaseStatus.orNull, releaseName.orNull, + versionCode.orNull, resolutionStrategy.get(), retain.artifacts.orNull, retain.mainObb.orNull, @@ -120,6 +121,7 @@ internal data class PlayExtensionConfig( val updatePriority: Int?, val releaseStatus: ReleaseStatus?, val releaseName: String?, + val versionCode: Long?, val resolutionStrategy: ResolutionStrategy, val retainArtifacts: List?, val retainMainObb: Int?, diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PromoteRelease.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PromoteRelease.kt index b89356708..7b5a6aa96 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PromoteRelease.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PromoteRelease.kt @@ -46,7 +46,8 @@ internal abstract class PromoteRelease @Inject constructor( findReleaseNotes(fromTrack), config.userFraction, config.updatePriority, - config.retainArtifacts + config.retainArtifacts, + config.versionCode, ) } } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/CliOptions.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/CliOptions.kt index 96dc84552..056a4ee31 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/CliOptions.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/CliOptions.kt @@ -37,6 +37,13 @@ internal interface TrackExtensionOptions : WriteTrackExtensionOptions { ) var userFractionOption: String + @get:Internal + @set:Option( + option = "version-code", + description = "Set the version code to promote from [fromTrack] to [track]" + ) + var versionCodeOption: String + @get:Internal @set:Option( option = "update-priority", @@ -143,6 +150,12 @@ internal class CliOptionsImpl( extension.userFraction.set(value.toDouble()) } + override var versionCodeOption: String + get() = throw UnsupportedOperationException() + set(value) { + extension.versionCode.set(value.toLong()) + } + override var updatePriorityOption: String get() = throw UnsupportedOperationException() set(value) { diff --git a/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/PlayPublisherExtensionTest.kt b/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/PlayPublisherExtensionTest.kt index 2c1d7ee88..7d8eec4d3 100644 --- a/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/PlayPublisherExtensionTest.kt +++ b/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/PlayPublisherExtensionTest.kt @@ -155,6 +155,7 @@ class PlayPublisherExtensionTest { map { ExtensionMergeHolder(it, Extension()) } private inner class Extension : PlayPublisherExtension("test") { + override val versionCode: Property get() = project.objects.property() override val enabled: Property = project.objects.property() override val serviceAccountCredentials: RegularFileProperty = project.objects.fileProperty() override val defaultToAppBundles: Property = project.objects.property() diff --git a/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/PromoteReleaseIntegrationTest.kt b/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/PromoteReleaseIntegrationTest.kt index f2d06a358..f0b8c6867 100644 --- a/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/PromoteReleaseIntegrationTest.kt +++ b/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/PromoteReleaseIntegrationTest.kt @@ -286,6 +286,7 @@ class PromoteReleaseIntegrationTest : IntegrationTestBase(), SharedIntegrationTe userFraction: Double?, updatePriority: Int?, retainableArtifacts: List?, + versionCode: Long?, ) { println("promoteRelease(" + "promoteTrackName=$promoteTrackName, " +