Skip to content

Commit

Permalink
#292 Move submitting of files from KtfmtCheckTask and KtfmtFormatTask…
Browse files Browse the repository at this point in the history
… to KtfmtBaseTask in order to improve readability
  • Loading branch information
simonhauck committed Jan 23, 2025
1 parent 4b65242 commit 3c4d056
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import com.ncorti.ktfmt.gradle.util.KtfmtResultSummary
import com.ncorti.ktfmt.gradle.util.d
import java.io.File
import java.util.UUID
import javax.inject.Inject
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.file.ProjectLayout
import org.gradle.api.file.RegularFile
Expand All @@ -30,16 +30,12 @@ import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.api.tasks.SourceTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
import org.gradle.workers.WorkQueue
import org.gradle.workers.WorkerExecutor

/** ktfmt-gradle base Gradle tasks. Contains methods to properly process a single file with ktfmt */
@Suppress("LeakingThis")
abstract class KtfmtBaseTask
internal constructor(
private val workerExecutor: WorkerExecutor,
private val layout: ProjectLayout,
) : SourceTask() {
abstract class KtfmtBaseTask internal constructor(private val layout: ProjectLayout) :
SourceTask() {

init {
includeOnly.convention("")
Expand Down Expand Up @@ -67,48 +63,54 @@ internal constructor(
@get:OutputFile
val output: Provider<RegularFile> = layout.buildDirectory.file("ktfmt/${this.name}/output.txt")

@get:Inject internal abstract val workerExecutor: WorkerExecutor

@get:Internal internal abstract val reformatFiles: Boolean

protected abstract fun handleResultSummary(resultSummary: KtfmtResultSummary)

@TaskAction
internal fun taskAction() {
val workQueue =
workerExecutor.processIsolation { spec -> spec.classpath.from(ktfmtClasspath) }
execute(workQueue)
}

protected abstract fun execute(workQueue: WorkQueue)
val tmpResultDirectory =
temporaryDir.resolve(UUID.randomUUID().toString()).apply { mkdirs() }

internal fun <T : KtfmtWorkAction> FileCollection.submitToQueue(
queue: WorkQueue,
action: Class<T>,
): KtfmtResultSummary {
val workingDir = temporaryDir.resolve(UUID.randomUUID().toString())
workingDir.mkdirs()
try {
val includedFiles =
IncludedFilesParser.parse(includeOnly.get(), layout.projectDirectory.asFile)
logger.d(
"Preparing to format: includeOnly=${includeOnly.orNull}, includedFiles = $includedFiles"
)
forEach {
queue.submit(action) { parameters ->
parameters.sourceFile.set(it)
parameters.formattingOptions.set(formattingOptionsBean.get())
parameters.includedFiles.set(includedFiles)
parameters.resultDirectory.set(workingDir)
parameters.reformatFiles.set(reformatFiles)
}
}
queue.await()
submitFilesToFormatterWorker(tmpResultDirectory)

val results = collectResults(workingDir)
val results = collectResults(tmpResultDirectory)

writeResultsSummaryToOutput(results)
return results
handleResultSummary(results)
} finally {
// remove working directory and everything in it
workingDir.deleteRecursively()
tmpResultDirectory.deleteRecursively()
}
}

private fun submitFilesToFormatterWorker(tmpResultDirectory: File) {
val queue = workerExecutor.processIsolation { it.classpath.from(ktfmtClasspath) }

val includedFiles = getIncludedFiles()

source.forEach { file ->
queue.submit(KtfmtWorkAction::class.java) {
it.sourceFile.set(file)
it.formattingOptions.set(formattingOptionsBean.get())
it.includedFiles.set(includedFiles)
it.resultDirectory.set(tmpResultDirectory)
it.reformatFiles.set(reformatFiles)
}
}

queue.await()
}

private fun getIncludedFiles(): Set<File> {
val includedFiles =
IncludedFilesParser.parse(includeOnly.get(), layout.projectDirectory.asFile)
logger.d(
"Preparing to format: includeOnly=${includeOnly.orNull}, includedFiles = $includedFiles"
)
return includedFiles
}

private fun collectResults(tmpResultDirectory: File): KtfmtResultSummary {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package com.ncorti.ktfmt.gradle.tasks

import com.ncorti.ktfmt.gradle.tasks.worker.KtfmtWorkAction
import com.ncorti.ktfmt.gradle.util.KtfmtResultSummary
import com.ncorti.ktfmt.gradle.util.KtfmtUtils
import com.ncorti.ktfmt.gradle.util.i
import javax.inject.Inject
import org.gradle.api.file.ProjectLayout
import org.gradle.api.tasks.CacheableTask
import org.gradle.workers.WorkQueue
import org.gradle.workers.WorkerExecutor

/** ktfmt-gradle Check task. Verifies if the output of ktfmt is the same as the input */
@CacheableTask
abstract class KtfmtCheckTask
@Inject
internal constructor(workerExecutor: WorkerExecutor, private val layout: ProjectLayout) :
KtfmtBaseTask(workerExecutor, layout) {
abstract class KtfmtCheckTask @Inject internal constructor(private val layout: ProjectLayout) :
KtfmtBaseTask(layout) {

init {
group = KtfmtUtils.GROUP_VERIFICATION
Expand All @@ -23,9 +19,7 @@ internal constructor(workerExecutor: WorkerExecutor, private val layout: Project
override val reformatFiles: Boolean
get() = false

override fun execute(workQueue: WorkQueue) {
val resultSummary = source.submitToQueue(workQueue, KtfmtWorkAction::class.java)

override fun handleResultSummary(resultSummary: KtfmtResultSummary) {
if (resultSummary.failedFiles.isNotEmpty()) {
error("Ktfmt failed to run with ${resultSummary.failedFiles.size} failures")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package com.ncorti.ktfmt.gradle.tasks

import com.ncorti.ktfmt.gradle.tasks.worker.KtfmtWorkAction
import com.ncorti.ktfmt.gradle.util.KtfmtResultSummary
import com.ncorti.ktfmt.gradle.util.KtfmtUtils
import com.ncorti.ktfmt.gradle.util.i
import javax.inject.Inject
import org.gradle.api.file.ProjectLayout
import org.gradle.workers.WorkQueue
import org.gradle.workers.WorkerExecutor

/** ktfmt-gradle Format task. Replaces input file content with its formatted equivalent. */
abstract class KtfmtFormatTask
@Inject
internal constructor(workerExecutor: WorkerExecutor, layout: ProjectLayout) :
KtfmtBaseTask(workerExecutor, layout) {
abstract class KtfmtFormatTask @Inject internal constructor(layout: ProjectLayout) :
KtfmtBaseTask(layout) {

init {
group = KtfmtUtils.GROUP_FORMATTING
Expand All @@ -21,9 +17,7 @@ internal constructor(workerExecutor: WorkerExecutor, layout: ProjectLayout) :
override val reformatFiles: Boolean
get() = true

override fun execute(workQueue: WorkQueue) {
val resultSummary = source.submitToQueue(workQueue, KtfmtWorkAction::class.java)

override fun handleResultSummary(resultSummary: KtfmtResultSummary) {
if (resultSummary.failedFiles.isNotEmpty()) {
error("Ktfmt failed to run with ${resultSummary.failedFiles.size} failures")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ internal class KtfmtBaseTaskTest {

@Test
fun `outputFile contains a summary of the formatted files`() {
val project = ProjectBuilder.builder().build()
val project = ProjectBuilder.builder().withProjectDir(tempDir).build()
project.pluginManager.apply("org.jetbrains.kotlin.jvm")
project.pluginManager.apply("com.ncorti.ktfmt.gradle")

Expand Down

0 comments on commit 3c4d056

Please sign in to comment.