From d3ad1f804710f1c8f6b4db84688e609f5711a4c4 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Wed, 20 Nov 2019 10:05:43 -0800 Subject: [PATCH] Don't require mapping file when promoting artifact (#740) Signed-off-by: Alex Saveau --- .../gradle/play/tasks/PromoteRelease.kt | 4 +-- .../triplet/gradle/play/tasks/PublishApk.kt | 14 ++++---- .../gradle/play/tasks/PublishBundle.kt | 10 +++--- .../tasks/internal/PublishArtifactTaskBase.kt | 21 ------------ .../tasks/internal/UploadArtifactTaskBase.kt | 34 +++++++++++++++++++ .../play/tasks/internal/workers/Params.kt | 27 +++++++++++---- ...erBase.kt => PublishArtifactWorkerBase.kt} | 20 +---------- .../workers/UploadArtifactWorkerBase.kt | 27 +++++++++++++++ .../tasks/PromoteReleaseIntegrationTest.kt | 21 ++++++++++++ 9 files changed, 117 insertions(+), 61 deletions(-) create mode 100644 play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/UploadArtifactTaskBase.kt rename play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/{ArtifactWorkerBase.kt => PublishArtifactWorkerBase.kt} (65%) create mode 100644 play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/UploadArtifactWorkerBase.kt 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 06fbc09b7..c05c5ac5f 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 @@ -5,7 +5,7 @@ import com.github.triplet.gradle.play.PlayPublisherExtension import com.github.triplet.gradle.play.internal.promoteTrackOrDefault import com.github.triplet.gradle.play.tasks.internal.PublishArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.UpdatableTrackExtensionOptions -import com.github.triplet.gradle.play.tasks.internal.workers.ArtifactWorkerBase +import com.github.triplet.gradle.play.tasks.internal.workers.PublishArtifactWorkerBase import com.github.triplet.gradle.play.tasks.internal.workers.paramsForBase import org.gradle.api.tasks.TaskAction import org.gradle.kotlin.dsl.submit @@ -29,7 +29,7 @@ internal abstract class PromoteRelease @Inject constructor( } } - abstract class Promoter : ArtifactWorkerBase() { + abstract class Promoter : PublishArtifactWorkerBase() { override fun upload() { edits2.promoteRelease( config.promoteTrackOrDefault, diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishApk.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishApk.kt index 6f59202a2..aadf34f6a 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishApk.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishApk.kt @@ -8,10 +8,10 @@ import com.github.triplet.gradle.play.internal.releaseStatusOrDefault import com.github.triplet.gradle.play.internal.resolutionStrategyOrDefault import com.github.triplet.gradle.play.internal.trackOrDefault import com.github.triplet.gradle.play.internal.userFractionOrDefault -import com.github.triplet.gradle.play.tasks.internal.PublishArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.PublishableTrackExtensionOptions +import com.github.triplet.gradle.play.tasks.internal.UploadArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.findApkFiles -import com.github.triplet.gradle.play.tasks.internal.workers.ArtifactWorkerBase +import com.github.triplet.gradle.play.tasks.internal.workers.UploadArtifactWorkerBase import com.github.triplet.gradle.play.tasks.internal.workers.copy import com.github.triplet.gradle.play.tasks.internal.workers.paramsForBase import org.gradle.api.file.DirectoryProperty @@ -32,7 +32,7 @@ import javax.inject.Inject internal abstract class PublishApk @Inject constructor( extension: PlayPublisherExtension, variant: ApplicationVariant -) : PublishArtifactTaskBase(extension, variant), PublishableTrackExtensionOptions { +) : UploadArtifactTaskBase(extension, variant), PublishableTrackExtensionOptions { @get:PathSensitive(PathSensitivity.RELATIVE) @get:InputFiles protected val apks @@ -59,7 +59,7 @@ internal abstract class PublishApk @Inject constructor( abstract class Processor @Inject constructor( private val executor: WorkerExecutor - ) : ArtifactWorkerBase() { + ) : UploadArtifactWorkerBase() { override fun upload() { for (apk in parameters.apkFiles.get()) { executor.noIsolation().submit(ApkUploader::class) { @@ -86,13 +86,13 @@ internal abstract class PublishApk @Inject constructor( ) } - interface Params : ArtifactPublishingParams { + interface Params : ArtifactUploadingParams { val apkFiles: ListProperty val uploadResults: DirectoryProperty } } - abstract class ApkUploader : ArtifactWorkerBase() { + abstract class ApkUploader : UploadArtifactWorkerBase() { init { commit = false } @@ -112,7 +112,7 @@ internal abstract class PublishApk @Inject constructor( parameters.uploadResults.get().file(versionCode.toString()).asFile.safeCreateNewFile() } - interface Params : ArtifactPublishingParams { + interface Params : ArtifactUploadingParams { val apkFile: RegularFileProperty val uploadResults: DirectoryProperty } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishBundle.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishBundle.kt index c123bd10b..c925d918f 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishBundle.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/PublishBundle.kt @@ -7,10 +7,10 @@ import com.github.triplet.gradle.play.internal.releaseStatusOrDefault import com.github.triplet.gradle.play.internal.resolutionStrategyOrDefault import com.github.triplet.gradle.play.internal.trackOrDefault import com.github.triplet.gradle.play.internal.userFractionOrDefault -import com.github.triplet.gradle.play.tasks.internal.PublishArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.PublishableTrackExtensionOptions +import com.github.triplet.gradle.play.tasks.internal.UploadArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.findBundleFile -import com.github.triplet.gradle.play.tasks.internal.workers.ArtifactWorkerBase +import com.github.triplet.gradle.play.tasks.internal.workers.UploadArtifactWorkerBase import com.github.triplet.gradle.play.tasks.internal.workers.paramsForBase import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.InputFile @@ -27,7 +27,7 @@ import javax.inject.Inject internal abstract class PublishBundle @Inject constructor( extension: PlayPublisherExtension, variant: ApplicationVariant -) : PublishArtifactTaskBase(extension, variant), PublishableTrackExtensionOptions { +) : UploadArtifactTaskBase(extension, variant), PublishableTrackExtensionOptions { @get:PathSensitive(PathSensitivity.RELATIVE) @get:InputFile protected val bundle @@ -48,7 +48,7 @@ internal abstract class PublishBundle @Inject constructor( } } - abstract class BundleUploader : ArtifactWorkerBase() { + abstract class BundleUploader : UploadArtifactWorkerBase() { override fun upload() { val bundleFile = parameters.bundleFile.get().asFile edits2.uploadBundle( @@ -67,7 +67,7 @@ internal abstract class PublishBundle @Inject constructor( ) } - interface Params : ArtifactPublishingParams { + interface Params : ArtifactUploadingParams { val bundleFile: RegularFileProperty } } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishArtifactTaskBase.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishArtifactTaskBase.kt index c1e89a3d1..00384661a 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishArtifactTaskBase.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishArtifactTaskBase.kt @@ -9,12 +9,10 @@ import org.gradle.api.file.Directory import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Provider import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity -import java.io.File internal abstract class PublishArtifactTaskBase( extension: PlayPublisherExtension, @@ -35,25 +33,6 @@ internal abstract class PublishArtifactTaskBase( internal val consoleNamesDir get() = resDir.dir(RELEASE_NAMES_PATH).optional() - @get:PathSensitive(PathSensitivity.RELATIVE) - @get:Optional - @get:InputFile - internal val mappingFile: File? - get() { - val customDir = extension.config.artifactDir - - return if (customDir == null) { - try { - variant.mappingFileProvider.get().singleOrNull() - } catch (e: NoSuchMethodError) { - @Suppress("DEPRECATION") // TODO(#708): remove when 3.6 is the minimum - variant.mappingFile?.orNull() - } - } else { - customDir.listFiles().orEmpty().singleOrNull { it.name == "mapping.txt" } - } - } - private fun Provider.optional() = flatMap { project.objects.directoryProperty().apply { set(it.asFile.orNull()) } } } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/UploadArtifactTaskBase.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/UploadArtifactTaskBase.kt new file mode 100644 index 000000000..7f19f56b4 --- /dev/null +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/UploadArtifactTaskBase.kt @@ -0,0 +1,34 @@ +package com.github.triplet.gradle.play.tasks.internal + +import com.android.build.gradle.api.ApplicationVariant +import com.github.triplet.gradle.common.utils.orNull +import com.github.triplet.gradle.play.PlayPublisherExtension +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import java.io.File + +internal abstract class UploadArtifactTaskBase( + extension: PlayPublisherExtension, + variant: ApplicationVariant +) : PublishArtifactTaskBase(extension, variant) { + @get:PathSensitive(PathSensitivity.RELATIVE) + @get:Optional + @get:InputFile + internal val mappingFile: File? + get() { + val customDir = extension.config.artifactDir + + return if (customDir == null) { + try { + variant.mappingFileProvider.get().singleOrNull() + } catch (e: NoSuchMethodError) { + @Suppress("DEPRECATION") // TODO(#708): remove when 3.6 is the minimum + variant.mappingFile?.orNull() + } + } else { + customDir.listFiles().orEmpty().singleOrNull { it.name == "mapping.txt" } + } + } +} diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/Params.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/Params.kt index ea67881c9..ff9100bc3 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/Params.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/Params.kt @@ -4,6 +4,7 @@ import com.github.triplet.gradle.common.utils.marked import com.github.triplet.gradle.play.tasks.internal.PublishArtifactTaskBase import com.github.triplet.gradle.play.tasks.internal.PublishEditTaskBase import com.github.triplet.gradle.play.tasks.internal.PublishTaskBase +import com.github.triplet.gradle.play.tasks.internal.UploadArtifactTaskBase internal fun PublishTaskBase.paramsForBase(params: PlayWorkerBase.PlayPublishingParams) { params.config.set(extension.serializableConfig) @@ -17,14 +18,19 @@ internal fun PublishTaskBase.paramsForBase(params: PlayWorkerBase.PlayPublishing params.skippedMarker.set(editIdFile.get().asFile.marked("skipped")) } - if (params is ArtifactWorkerBase.ArtifactPublishingParams) { + if (params is PublishArtifactWorkerBase.ArtifactPublishingParams) { this as PublishArtifactTaskBase + params.releaseNotesDir.set(releaseNotesDir) + params.consoleNamesDir.set(consoleNamesDir) + } + + if (params is UploadArtifactWorkerBase.ArtifactUploadingParams) { + this as UploadArtifactTaskBase + params.variantName.set(variant.name) params.versionCodes.set(variant.outputs.associate { it.outputFile to it.versionCode }) - params.releaseNotesDir.set(releaseNotesDir) - params.consoleNamesDir.set(consoleNamesDir) params.mappingFile.set(mappingFile) } } @@ -42,15 +48,22 @@ internal fun EditWorkerBase.EditPublishingParams.copy(into: EditWorkerBase.EditP into.skippedMarker.set(skippedMarker) } -internal fun ArtifactWorkerBase.ArtifactPublishingParams.copy( - into: ArtifactWorkerBase.ArtifactPublishingParams +internal fun PublishArtifactWorkerBase.ArtifactPublishingParams.copy( + into: PublishArtifactWorkerBase.ArtifactPublishingParams ) { (this as EditWorkerBase.EditPublishingParams).copy(into) + into.releaseNotesDir.set(releaseNotesDir) + into.consoleNamesDir.set(consoleNamesDir) +} + +internal fun UploadArtifactWorkerBase.ArtifactUploadingParams.copy( + into: UploadArtifactWorkerBase.ArtifactUploadingParams +) { + (this as PublishArtifactWorkerBase.ArtifactPublishingParams).copy(into) + into.variantName.set(variantName) into.versionCodes.set(versionCodes.get()) - into.releaseNotesDir.set(releaseNotesDir) - into.consoleNamesDir.set(consoleNamesDir) into.mappingFile.set(mappingFile) } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/ArtifactWorkerBase.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/PublishArtifactWorkerBase.kt similarity index 65% rename from play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/ArtifactWorkerBase.kt rename to play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/PublishArtifactWorkerBase.kt index b9e184aa3..8646365d1 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/ArtifactWorkerBase.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/PublishArtifactWorkerBase.kt @@ -5,12 +5,9 @@ import com.github.triplet.gradle.common.utils.readProcessed import com.github.triplet.gradle.play.internal.RELEASE_NAMES_DEFAULT_NAME import com.github.triplet.gradle.play.internal.RELEASE_NOTES_DEFAULT_NAME import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.MapProperty -import org.gradle.api.provider.Property import java.io.File -internal abstract class ArtifactWorkerBase : +internal abstract class PublishArtifactWorkerBase : EditWorkerBase() { protected var commit = true @@ -21,17 +18,6 @@ internal abstract class ArtifactWorkerBase - val versionCodes: MapProperty - val releaseNotesDir: DirectoryProperty // Optional val consoleNamesDir: DirectoryProperty // Optional - val mappingFile: RegularFileProperty // Optional } } diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/UploadArtifactWorkerBase.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/UploadArtifactWorkerBase.kt new file mode 100644 index 000000000..7581d4cad --- /dev/null +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/UploadArtifactWorkerBase.kt @@ -0,0 +1,27 @@ +package com.github.triplet.gradle.play.tasks.internal.workers + +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.Property +import java.io.File + +internal abstract class UploadArtifactWorkerBase : + PublishArtifactWorkerBase() { + protected fun findBestVersionCode(artifact: File): Long { + var onTheFlyBuild = parameters.versionCodes.get()[artifact]?.toLong() + if (onTheFlyBuild == null) { + // Since we aren't building the supplied artifact, we have no way of knowing its + // version code without opening it up. Since we don't want to do that, we instead + // pretend like we know the version code even though we really don't. + onTheFlyBuild = parameters.versionCodes.get().values.first().toLong() + } + return onTheFlyBuild + } + + internal interface ArtifactUploadingParams : ArtifactPublishingParams { + val variantName: Property + val versionCodes: MapProperty + + val mappingFile: RegularFileProperty // Optional + } +} 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 5ae890e05..b8e34a96d 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 @@ -129,6 +129,27 @@ class PromoteReleaseIntegrationTest : IntegrationTestBase() { assertThat(result.output).contains("promoteTrackName=myUpdateTrack") } + @Test + fun `Build succeeds when mapping file is produced but unavailable`() { + @Suppress("UnnecessaryQualifiedReference") + // language=gradle + val config = """ + com.github.triplet.gradle.play.tasks.PromoteReleaseIntegrationTest.installFactories() + + android.buildTypes.release { + shrinkResources true + minifyEnabled true + proguardFiles(getDefaultProguardFile("proguard-android.txt")) + } + """ + + val result = execute(config, ":promoteReleaseArtifact") + + assertThat(result.task(":promoteReleaseArtifact")).isNotNull() + assertThat(result.task(":promoteReleaseArtifact")!!.outcome).isEqualTo(TaskOutcome.SUCCESS) + assertThat(result.output).contains("promoteRelease(") + } + @Test fun `Build uses correct release status`() { @Suppress("UnnecessaryQualifiedReference")