Skip to content

Commit

Permalink
Fix #188: fail release task if ZIP already exists (#191)
Browse files Browse the repository at this point in the history
  • Loading branch information
TWiStErRob committed Dec 17, 2021
1 parent 7596dfc commit 89beaf9
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ import net.twisterrob.gradle.kotlin.dsl.extensions
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.UnknownTaskException
import org.gradle.api.tasks.StopExecutionException
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip
import org.gradle.kotlin.dsl.closureOf
import org.gradle.kotlin.dsl.getByName
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.register
import java.io.File
import java.io.IOException
import java.util.zip.ZipFile

private val defaultReleaseDir: File
Expand Down Expand Up @@ -124,20 +125,9 @@ class AndroidReleasePlugin : BasePlugin() {
it.rename("(.*)", "proguard_$1")
}
}
doFirst {
val outFile = outputs.files.singleFile
if (outFile.exists()) {
throw StopExecutionException("Target zip file already exists, did you run 'svn update'?\nRelease archive: ${outFile}")
}
}
doLast {
println("Published release artifacts to ${outputs.files.singleFile}:" + ZipFile(outputs.files.singleFile)
.entries()
.toList()
.sortedBy { it.name }
.joinToString(prefix = "\n", separator = "\n") { "\t * ${it}" }
)
}

doFirst(closureOf<Zip> { failIfAlreadyArchived() })
doLast(closureOf<Zip> { printResultingArchive() })
}

private fun registerFlavorTask(flavor: ProductFlavor): TaskProvider<Task> {
Expand Down Expand Up @@ -194,20 +184,23 @@ class AndroidReleasePlugin : BasePlugin() {
}
}

doFirst {
val outFile = outputs.files.singleFile
if (outFile.exists()) {
throw StopExecutionException("Target zip file already exists.\nRelease archive: ${outFile}")
}
}

doLast {
println("Published release artifacts to ${outputs.files.singleFile}:" + ZipFile(outputs.files.singleFile)
.entries()
.toList()
.sortedBy { it.name }
.joinToString(prefix = "\n", separator = "\n") { "\t * ${it}" }
)
}
doFirst(closureOf<Zip> { failIfAlreadyArchived() })
doLast(closureOf<Zip> { printResultingArchive() })
}
}

private fun Zip.failIfAlreadyArchived() {
val outFile = outputs.files.singleFile
if (outFile.exists()) {
throw IOException("Target zip file already exists.\nRelease archive: ${outFile}")
}
}

private fun Zip.printResultingArchive() {
println("Published release artifacts to ${outputs.files.singleFile}:" + ZipFile(outputs.files.singleFile)
.entries()
.toList()
.sortedBy { it.name }
.joinToString(prefix = "\n", separator = "\n") { "\t * ${it}" }
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package net.twisterrob.gradle.android

import net.twisterrob.gradle.test.GradleRunnerRule
import net.twisterrob.gradle.test.GradleRunnerRuleExtension
import net.twisterrob.gradle.test.assertFailed
import net.twisterrob.gradle.test.assertHasOutputLine
import net.twisterrob.gradle.test.assertNoOutputLine
import net.twisterrob.gradle.test.assertNoTask
import net.twisterrob.gradle.test.assertSuccess
import net.twisterrob.gradle.test.root
Expand Down Expand Up @@ -188,6 +190,34 @@ class AndroidReleasePluginIntgTest : BaseAndroidIntgTest() {
assertDebugArchive(result)
}

@Test fun `test app fails to release when already exists (debug) and (release)`() {
gradle.root.resolve("gradle.properties").appendText(Minification.R8.gradleProperties)

@Language("gradle")
val script = """
apply plugin: 'net.twisterrob.android-app'
android.defaultConfig.version { major = 1; minor = 2; patch = 3; build = 4 }
afterEvaluate {
tasks.named("releaseRelease", Zip) { destinationDirectory.set(file('releases/release')) }
tasks.named("releaseDebug", Zip) { destinationDirectory.set(file('releases/debug')) }
}
""".trimIndent()

val setup = gradle.run(script, "release").build()
setup.assertSuccess(":releaseRelease")
setup.assertSuccess(":releaseDebug")

// Make a change to force non-up-to-date packageRelease.
gradle.root.resolve("gradle.properties").appendText("\n")
gradle.root.resolve("gradle.properties").appendText(Minification.R8Full.gradleProperties)

val result = gradle.run(null, "releaseRelease").buildAndFail()
result.assertFailed(":releaseRelease")
result.assertHasOutputLine(Regex(""".*Target zip file already exists\..*"""))
result.assertHasOutputLine(Regex(""".*Release archive:.*\+archive\.zip"""))
result.assertNoOutputLine(Regex(""".*Published release artifacts.*"""))
}

private inline fun assertArchive(archive: File, crossinline assertions: (File) -> Unit) {
try {
assertThat(archive.absolutePath, archive, anExistingFile())
Expand Down

0 comments on commit 89beaf9

Please sign in to comment.