@@ -5,104 +5,105 @@ import org.gradle.api.Task
55import org.gradle.kotlin.dsl.extra
66
77/* *
8- * Checks if a task is affected by git changes
8+ * Returns the task's path, given affected projects, if this task or its dependencies are affected by git changes.
99 */
10- internal fun isAffectedBy (baseTask : Task , affectedProjects : Map <Project , Set <String >>): String? {
11- val visited = mutableSetOf<Task >()
12- val queue = mutableListOf (baseTask)
10+ internal fun findAffectedTaskPath (baseTask : Task , affectedProjects : Map <Project , Set <String >>): String? {
11+ val visited = mutableSetOf<Task >()
12+ val queue = mutableListOf (baseTask)
13+
14+ while (queue.isNotEmpty()) {
15+ val t = queue.removeAt(0 )
16+ if (visited.contains(t)) {
17+ continue
18+ }
19+ visited.add(t)
1320
14- while (queue.isNotEmpty()) {
15- val t = queue.removeAt(0 )
16- if (visited.contains(t)) {
17- continue
18- }
19- visited.add(t)
20-
21- val affectedTasks = affectedProjects[t.project]
22- if (affectedTasks != null ) {
23- if (affectedTasks.contains(" all" )) {
24- return " ${t.project.path} :${t.name} "
25- }
26- if (affectedTasks.contains(t.name)) {
27- return " ${t.project.path} :${t.name} "
28- }
29- }
30-
31- t.taskDependencies.getDependencies(t).forEach { queue.add(it) }
21+ val affectedTasks = affectedProjects[t.project]
22+ if (affectedTasks != null ) {
23+ if (affectedTasks.contains(" all" )) {
24+ return " ${t.project.path} :${t.name} "
25+ }
26+ if (affectedTasks.contains(t.name)) {
27+ return " ${t.project.path} :${t.name} "
28+ }
3229 }
33- return null
30+
31+ t.taskDependencies.getDependencies(t).forEach { queue.add(it) }
32+ }
33+ return null
3434}
3535
3636/* *
3737 * Creates a single aggregate root task that depends on matching subproject tasks
3838 */
3939private fun Project.createRootTask (
40- rootTaskName : String ,
41- subProjTaskName : String ,
42- includePrefixes : List <String >,
43- excludePrefixes : List <String >,
44- forceCoverage : Boolean
40+ rootTaskName : String ,
41+ subProjTaskName : String ,
42+ includePrefixes : List <String >,
43+ excludePrefixes : List <String >,
44+ forceCoverage : Boolean
4545) {
46- val coverage = forceCoverage || rootProject.hasProperty(" checkCoverage" )
47- tasks.register(rootTaskName) {
48- subprojects.forEach { subproject ->
49- val activePartition = subproject.extra.get(" activePartition" ) as Boolean
50- if (activePartition &&
51- includePrefixes.any { subproject.path.startsWith(it) } &&
52- ! excludePrefixes.any { subproject.path.startsWith(it) }) {
53-
54- val testTask = subproject.tasks.findByName(subProjTaskName)
55- var isAffected = true
56-
57- if (testTask != null ) {
58- val useGitChanges = rootProject.extra.get(" useGitChanges" ) as Boolean
59- if (useGitChanges) {
60- @Suppress(" UNCHECKED_CAST" )
61- val affectedProjects = rootProject.extra.get(" affectedProjects" ) as Map <Project , Set <String >>
62- val fileTrigger = isAffectedBy(testTask, affectedProjects)
63- if (fileTrigger != null ) {
64- logger.warn(" Selecting ${subproject.path} :$subProjTaskName (triggered by $fileTrigger )" )
65- } else {
66- logger.warn(" Skipping ${subproject.path} :$subProjTaskName (not affected by changed files)" )
67- isAffected = false
68- }
69- }
70- if (isAffected) {
71- dependsOn(testTask)
72- }
73- }
74-
75- if (isAffected && coverage) {
76- val coverageTask = subproject.tasks.findByName(" jacocoTestReport" )
77- if (coverageTask != null ) {
78- dependsOn(coverageTask)
79- }
80- val verificationTask = subproject.tasks.findByName(" jacocoTestCoverageVerification" )
81- if (verificationTask != null ) {
82- dependsOn(verificationTask)
83- }
84- }
46+ val coverage = forceCoverage || rootProject.providers.gradleProperty(" checkCoverage" ).isPresent
47+ tasks.register(rootTaskName) {
48+ subprojects.forEach { subproject ->
49+ val activePartition = subproject.extra.get(" activePartition" ) as Boolean
50+ if (
51+ activePartition &&
52+ includePrefixes.any { subproject.path.startsWith(it) } &&
53+ ! excludePrefixes.any { subproject.path.startsWith(it) }
54+ ) {
55+ val testTask = subproject.tasks.findByName(subProjTaskName)
56+ var isAffected = true
57+
58+ if (testTask != null ) {
59+ val useGitChanges = rootProject.extra.get(" useGitChanges" ) as Boolean
60+ if (useGitChanges) {
61+ @Suppress(" UNCHECKED_CAST" )
62+ val affectedProjects = rootProject.extra.get(" affectedProjects" ) as Map <Project , Set <String >>
63+ val affectedTaskPath = findAffectedTaskPath(testTask, affectedProjects)
64+ if (affectedTaskPath != null ) {
65+ logger.warn(" Selecting ${subproject.path} :$subProjTaskName (affected by $affectedTaskPath )" )
66+ } else {
67+ logger.warn(" Skipping ${subproject.path} :$subProjTaskName (not affected by changed files)" )
68+ isAffected = false
8569 }
70+ }
71+ if (isAffected) {
72+ dependsOn(testTask)
73+ }
74+ }
75+
76+ if (isAffected && coverage) {
77+ val coverageTask = subproject.tasks.findByName(" jacocoTestReport" )
78+ if (coverageTask != null ) {
79+ dependsOn(coverageTask)
80+ }
81+ val verificationTask = subproject.tasks.findByName(" jacocoTestCoverageVerification" )
82+ if (verificationTask != null ) {
83+ dependsOn(verificationTask)
84+ }
8685 }
86+ }
8787 }
88+ }
8889}
8990
9091/* *
9192 * Creates aggregate test tasks for CI using createRootTask() above
92- *
93+ *
9394 * Creates three subtasks for the given base task name:
9495 * - ${baseTaskName}Test - runs allTests
9596 * - ${baseTaskName}LatestDepTest - runs allLatestDepTests
9697 * - ${baseTaskName}Check - runs check
9798 */
9899fun Project.testAggregate (
99- baseTaskName : String ,
100- includePrefixes : List <String >,
101- excludePrefixes : List <String > = emptyList(),
102- forceCoverage : Boolean = false
100+ baseTaskName : String ,
101+ includePrefixes : List <String >,
102+ excludePrefixes : List <String > = emptyList(),
103+ forceCoverage : Boolean = false
103104) {
104- createRootTask(" ${baseTaskName} Test" , " allTests" , includePrefixes, excludePrefixes, forceCoverage)
105- createRootTask(" ${baseTaskName} LatestDepTest" , " allLatestDepTests" , includePrefixes, excludePrefixes, forceCoverage)
106- createRootTask(" ${baseTaskName} Check" , " check" , includePrefixes, excludePrefixes, forceCoverage)
105+ createRootTask(" ${baseTaskName} Test" , " allTests" , includePrefixes, excludePrefixes, forceCoverage)
106+ createRootTask(" ${baseTaskName} LatestDepTest" , " allLatestDepTests" , includePrefixes, excludePrefixes, forceCoverage)
107+ createRootTask(" ${baseTaskName} Check" , " check" , includePrefixes, excludePrefixes, forceCoverage)
107108}
108109
0 commit comments