Skip to content

Commit

Permalink
Don't require mapping file when promoting artifact (#740)
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Saveau <[email protected]>
  • Loading branch information
SUPERCILEX authored Nov 20, 2019
1 parent abddfe9 commit d3ad1f8
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -29,7 +29,7 @@ internal abstract class PromoteRelease @Inject constructor(
}
}

abstract class Promoter : ArtifactWorkerBase<ArtifactWorkerBase.ArtifactPublishingParams>() {
abstract class Promoter : PublishArtifactWorkerBase<PublishArtifactWorkerBase.ArtifactPublishingParams>() {
override fun upload() {
edits2.promoteRelease(
config.promoteTrackOrDefault,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -59,7 +59,7 @@ internal abstract class PublishApk @Inject constructor(

abstract class Processor @Inject constructor(
private val executor: WorkerExecutor
) : ArtifactWorkerBase<Processor.Params>() {
) : UploadArtifactWorkerBase<Processor.Params>() {
override fun upload() {
for (apk in parameters.apkFiles.get()) {
executor.noIsolation().submit(ApkUploader::class) {
Expand All @@ -86,13 +86,13 @@ internal abstract class PublishApk @Inject constructor(
)
}

interface Params : ArtifactPublishingParams {
interface Params : ArtifactUploadingParams {
val apkFiles: ListProperty<File>
val uploadResults: DirectoryProperty
}
}

abstract class ApkUploader : ArtifactWorkerBase<ApkUploader.Params>() {
abstract class ApkUploader : UploadArtifactWorkerBase<ApkUploader.Params>() {
init {
commit = false
}
Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -48,7 +48,7 @@ internal abstract class PublishBundle @Inject constructor(
}
}

abstract class BundleUploader : ArtifactWorkerBase<BundleUploader.Params>() {
abstract class BundleUploader : UploadArtifactWorkerBase<BundleUploader.Params>() {
override fun upload() {
val bundleFile = parameters.bundleFile.get().asFile
edits2.uploadBundle(
Expand All @@ -67,7 +67,7 @@ internal abstract class PublishBundle @Inject constructor(
)
}

interface Params : ArtifactPublishingParams {
interface Params : ArtifactUploadingParams {
val bundleFile: RegularFileProperty
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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<Directory>.optional() =
flatMap { project.objects.directoryProperty().apply { set(it.asFile.orNull()) } }
}
Original file line number Diff line number Diff line change
@@ -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" }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
}
}
Expand All @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<T : ArtifactWorkerBase.ArtifactPublishingParams> :
internal abstract class PublishArtifactWorkerBase<T : PublishArtifactWorkerBase.ArtifactPublishingParams> :
EditWorkerBase<T>() {
protected var commit = true

Expand All @@ -21,17 +18,6 @@ internal abstract class ArtifactWorkerBase<T : ArtifactWorkerBase.ArtifactPublis

abstract fun upload()

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
}

protected fun findReleaseName(track: String): String? {
return if (config.releaseName != null) {
config.releaseName
Expand All @@ -58,11 +44,7 @@ internal abstract class ArtifactWorkerBase<T : ArtifactWorkerBase.ArtifactPublis
}

internal interface ArtifactPublishingParams : EditPublishingParams {
val variantName: Property<String>
val versionCodes: MapProperty<File, Int>

val releaseNotesDir: DirectoryProperty // Optional
val consoleNamesDir: DirectoryProperty // Optional
val mappingFile: RegularFileProperty // Optional
}
}
Original file line number Diff line number Diff line change
@@ -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<T : UploadArtifactWorkerBase.ArtifactUploadingParams> :
PublishArtifactWorkerBase<T>() {
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<String>
val versionCodes: MapProperty<File, Int>

val mappingFile: RegularFileProperty // Optional
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit d3ad1f8

Please sign in to comment.