Skip to content

Commit

Permalink
Simplify putVersionInCode
Browse files Browse the repository at this point in the history
  • Loading branch information
LouisCAD committed Nov 9, 2023
1 parent a595202 commit a303180
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,5 @@ class VersionSyncPlugin : Plugin<Settings> {
}.get()
gradle.beforeProject { project.version = version }
}
//TODO: Register extension or whatever to allow generating a property with:
// - given visibility (default to, if any?)
// - given name (default to, if any?)
// - given package
}
}
64 changes: 23 additions & 41 deletions gradle-plugins/version-sync/src/main/kotlin/putVersionInCode.kt
Original file line number Diff line number Diff line change
@@ -1,38 +1,36 @@
package org.splitties.incubator.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.gradle.kotlin.dsl.register
import org.gradle.api.tasks.Delete
import org.gradle.kotlin.dsl.named
import org.splitties.incubator.gradle.VersionFileWriter.Kotlin.Visibility.Internal
import org.splitties.incubator.gradle.VersionFileWriter.Kotlin.Visibility.Public
import java.io.File
import java.io.Serializable

fun Project.putVersionInCode(
taskName: String = "syncVersion",
outputDirectory: Provider<Directory>,
writer: VersionFileWriter,
vararg triggerTasks: TaskProvider<*>,
) {
val syncVersionTask = tasks.register<FileWriterTask>(taskName) {
version.set(project.version.toString())
this.outputDirectory.set(outputDirectory)
this.writer.set(writer)
val version = project.version.toString()
tasks.named<Delete>("clean").configure {
doLast { writer.write(version, outputDirectory.get()) }
}
triggerTasks.forEach {
it.configure { dependsOn(syncVersionTask) }
val file = writer.targetFile(outputDirectory.get())
// We write the file as soon as possible, so it's visible in the IDE as soon as possible.
// This is compatible with Gradle configuration cache.
if (file.exists().not()) {
writer.write(version, outputDirectory.get())
return
}
if (writer.exists(outputDirectory.get()).not()) {
// If there's no file at all, write it now.
//TODO: Revisit since property name and value can drift out of sync until triggerTasks run.
writer.write(project.version.toString(), outputDirectory.get())
val existingCode = file.readText()
val newCode = writer.generate(version)
if (newCode != existingCode) {
outputDirectory.get().asFile.mkdirs()
file.writeText(newCode)
return
}
}

Expand All @@ -46,9 +44,10 @@ abstract class VersionFileWriter(
}
protected abstract fun _write(version: String, outputDir: Directory)

fun exists(outputDir: Directory): Boolean {
val file = outputDir.file(fileName).asFile
return file.exists()
abstract fun generate(version: String): String

fun targetFile(outputDir: Directory): File {
return outputDir.file(fileName).asFile
}

class Kotlin(
Expand All @@ -71,7 +70,7 @@ abstract class VersionFileWriter(
outputDir.file(fileName).asFile.writeText(kotlinCode)
}

fun generate(version: String): String {
override fun generate(version: String): String {
val keywords = buildString {
when (visibility) {
Internal -> append("internal")
Expand All @@ -88,20 +87,3 @@ abstract class VersionFileWriter(
}
}
}

internal abstract class FileWriterTask : DefaultTask() {

@get:Input
abstract val writer: Property<VersionFileWriter>

@get:Input
abstract val version: Property<String>

@get:OutputDirectory
abstract val outputDirectory: DirectoryProperty

@TaskAction
fun writeVersionFileIntoDirectory() {
writer.get().write(version.get(), outputDirectory.get())
}
}

0 comments on commit a303180

Please sign in to comment.