@@ -33,6 +33,7 @@ import org.gradle.api.provider.*
33
33
import org.gradle.api.tasks.*
34
34
import org.gradle.api.tasks.testing.*
35
35
import org.gradle.process.*
36
+ import java.io.File
36
37
import kotlin.reflect.*
37
38
38
39
class KoverPlugin : Plugin <Project > {
@@ -160,23 +161,25 @@ class KoverPlugin : Plugin<Project> {
160
161
providers : BuildProviders ,
161
162
block : (T ) -> Unit
162
163
): T {
163
- return tasks.create(taskName, type.java) { task ->
164
- task.group = VERIFICATION_GROUP
164
+ val task = tasks.create(taskName, type.java)
165
165
166
- providers.projects.forEach { (projectName, m) ->
167
- task.binaryReportFiles.put(projectName, NestedFiles (task.project.objects, m.reports))
168
- task.srcDirs.put(projectName, NestedFiles (task.project.objects, m.sources))
169
- task.outputDirs.put(projectName, NestedFiles (task.project.objects, m.output))
170
- }
166
+ task.group = VERIFICATION_GROUP
171
167
172
- task.coverageEngine.set(providers.engine)
173
- task.classpath.set(providers.classpath)
174
- task.dependsOn(providers.merged.tests)
168
+ providers.projects.forEach { (projectName, m) ->
169
+ task.binaryReportFiles.put(projectName, NestedFiles (task.project.objects, m.reports))
170
+ task.srcDirs.put(projectName, NestedFiles (task.project.objects, m.sources))
171
+ task.outputDirs.put(projectName, NestedFiles (task.project.objects, m.output))
172
+ }
175
173
176
- task.onlyIf { ! providers.merged.disabled.get() }
174
+ task.coverageEngine.set(providers.engine)
175
+ task.classpath.set(providers.classpath)
176
+ task.dependsOn(providers.merged.tests)
177
177
178
- block(task)
179
- }
178
+ val disabledProvider = providers.merged.disabled
179
+ task.onlyIf { ! disabledProvider.get() }
180
+
181
+ block(task)
182
+ return task
180
183
}
181
184
182
185
private fun Project.createCollectingTask () {
@@ -214,23 +217,25 @@ class KoverPlugin : Plugin<Project> {
214
217
throw GradleException (" Kover task '$taskName ' already exist. Plugin should not be applied in child project if it has already been applied in one of the parent projects." )
215
218
}
216
219
217
- return tasks.create(taskName, type.java) { task ->
218
- task.group = VERIFICATION_GROUP
220
+ val task = tasks.create(taskName, type.java)
221
+ task.group = VERIFICATION_GROUP
219
222
220
- task.coverageEngine.set(providers.engine)
221
- task.classpath.set(providers.classpath)
222
- task.srcDirs.set(projectProviders.sources)
223
- task.outputDirs.set(projectProviders.output)
223
+ task.coverageEngine.set(providers.engine)
224
+ task.classpath.set(providers.classpath)
225
+ task.srcDirs.set(projectProviders.sources)
226
+ task.outputDirs.set(projectProviders.output)
224
227
225
- // it is necessary to read all binary reports because project's classes can be invoked in another project
226
- task.binaryReportFiles.set(projectProviders.reports)
227
- task.dependsOn(projectProviders.tests)
228
+ // it is necessary to read all binary reports because project's classes can be invoked in another project
229
+ task.binaryReportFiles.set(projectProviders.reports)
230
+ task.dependsOn(projectProviders.tests)
228
231
229
- task.onlyIf { ! projectProviders.disabled.get() }
230
- task.onlyIf { ! task.binaryReportFiles.get().isEmpty }
232
+ val disabledProvider = projectProviders.disabled
233
+ task.onlyIf { ! disabledProvider.get() }
234
+ task.onlyIf { ! (it as KoverProjectTask ).binaryReportFiles.get().isEmpty }
231
235
232
- block(task)
233
- }
236
+ block(task)
237
+
238
+ return task
234
239
}
235
240
236
241
private fun Project.createKoverExtension (): KoverExtension {
@@ -249,26 +254,33 @@ class KoverPlugin : Plugin<Project> {
249
254
val taskExtension = extensions.create(TASK_EXTENSION_NAME , KoverTaskExtension ::class .java, project.objects)
250
255
251
256
taskExtension.isDisabled = false
252
- taskExtension.binaryReportFile.set(this . project.provider {
257
+ taskExtension.binaryReportFile.set(project.provider {
253
258
val koverExtension = providers.koverExtension.get()
254
259
val suffix = if (koverExtension.coverageEngine.get() == CoverageEngine .INTELLIJ ) " .ic" else " .exec"
255
260
project.layout.buildDirectory.get().file(" kover/$name$suffix " ).asFile
256
261
})
257
262
263
+ val pluginContainer = project.plugins
258
264
val excludeAndroidPackages =
259
- project.provider { project .androidPluginIsApplied && ! providers.koverExtension.get().instrumentAndroidPackage }
265
+ project.provider { pluginContainer .androidPluginIsApplied && ! providers.koverExtension.get().instrumentAndroidPackage }
260
266
261
267
jvmArgumentProviders.add(
262
268
CoverageArgumentProvider (
263
269
this ,
264
270
agents,
271
+ taskExtension,
265
272
providers.koverExtension,
266
273
excludeAndroidPackages
267
274
)
268
275
)
269
276
270
- doFirst(BinaryReportCleanupAction (providers.koverExtension, taskExtension))
271
- doLast(IntellijErrorLogCopyAction (taskExtension))
277
+ val sourceErrorProvider = project.provider {
278
+ File (taskExtension.binaryReportFile.get().parentFile, " coverage-error.log" )
279
+ }
280
+ val targetErrorProvider = project.layout.buildDirectory.file(" kover/errors/$name .log" ).map { it.asFile }
281
+
282
+ doFirst(BinaryReportCleanupAction (project.name, providers.koverExtension, taskExtension))
283
+ doLast(MoveIntellijErrorLogAction (sourceErrorProvider, targetErrorProvider))
272
284
}
273
285
}
274
286
@@ -277,6 +289,7 @@ class KoverPlugin : Plugin<Project> {
277
289
For this reason, before starting the tests, it is necessary to clear the file from the results of previous runs.
278
290
*/
279
291
private class BinaryReportCleanupAction (
292
+ private val projectName : String ,
280
293
private val koverExtensionProvider : Provider <KoverExtension >,
281
294
private val taskExtension : KoverTaskExtension
282
295
) : Action<Task> {
@@ -289,7 +302,7 @@ private class BinaryReportCleanupAction(
289
302
290
303
if (! taskExtension.isDisabled
291
304
&& ! koverExtension.isDisabled
292
- && ! koverExtension.disabledProjects.contains(task.project.name )
305
+ && ! koverExtension.disabledProjects.contains(projectName )
293
306
&& koverExtension.coverageEngine.get() == CoverageEngine .INTELLIJ
294
307
) {
295
308
// IntelliJ engine expected empty file for parallel test execution.
@@ -299,26 +312,28 @@ private class BinaryReportCleanupAction(
299
312
}
300
313
}
301
314
302
- private class IntellijErrorLogCopyAction (private val taskExtension : KoverTaskExtension ) : Action<Task> {
315
+ private class MoveIntellijErrorLogAction (
316
+ private val sourceFile : Provider <File >,
317
+ private val targetFile : Provider <File >
318
+ ) : Action<Task> {
303
319
override fun execute (task : Task ) {
304
- task.project.copyIntellijErrorLog(
305
- task.project.layout.buildDirectory.get().file(" kover/errors/${task.name} .log" ).asFile,
306
- taskExtension.binaryReportFile.get().parentFile
307
- )
320
+ val origin = sourceFile.get()
321
+ if (origin.exists() && origin.isFile) {
322
+ origin.copyTo(targetFile.get(), true )
323
+ origin.delete()
324
+ }
308
325
}
309
326
}
310
327
311
328
private class CoverageArgumentProvider (
312
329
private val task : Task ,
313
330
private val agents : Map <CoverageEngine , CoverageAgent >,
331
+ @get:Nested val taskExtension : KoverTaskExtension ,
314
332
@get:Nested val koverExtension : Provider <KoverExtension >,
315
333
@get:Input val excludeAndroidPackage : Provider <Boolean >
316
334
) : CommandLineArgumentProvider, Named {
317
335
318
- @get:Nested
319
- val taskExtension: Provider <KoverTaskExtension > = task.project.provider {
320
- task.extensions.getByType(KoverTaskExtension ::class .java)
321
- }
336
+ private val projectName: String = task.project.name
322
337
323
338
@Internal
324
339
override fun getName (): String {
@@ -327,11 +342,10 @@ private class CoverageArgumentProvider(
327
342
328
343
override fun asArguments (): MutableIterable <String > {
329
344
val koverExtensionValue = koverExtension.get()
330
- val taskExtensionValue = taskExtension.get()
331
345
332
- if (taskExtensionValue .isDisabled
346
+ if (taskExtension .isDisabled
333
347
|| koverExtensionValue.isDisabled
334
- || koverExtensionValue.disabledProjects.contains(task.project.name )
348
+ || koverExtensionValue.disabledProjects.contains(projectName )
335
349
) {
336
350
return mutableListOf ()
337
351
}
@@ -346,9 +360,9 @@ private class CoverageArgumentProvider(
346
360
347
361
FIXME Remove this code if the IntelliJ Agent stops changing project classes during instrumentation
348
362
*/
349
- taskExtensionValue .excludes = taskExtensionValue .excludes + " android.*" + " com.android.*"
363
+ taskExtension .excludes = taskExtension .excludes + " android.*" + " com.android.*"
350
364
}
351
365
352
- return agents.getFor(koverExtensionValue.coverageEngine.get()).buildCommandLineArgs(task, taskExtensionValue )
366
+ return agents.getFor(koverExtensionValue.coverageEngine.get()).buildCommandLineArgs(task, taskExtension )
353
367
}
354
368
}
0 commit comments