This repository has been archived by the owner on Sep 17, 2024. It is now read-only.
forked from Piasy/AndroidCodeQualityConfig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjacoco.gradle
145 lines (120 loc) · 4.02 KB
/
jacoco.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* Apply additional build steps to sub-projects
*/
def jacocoToolVersion = rootProject.ext.has('jacocoVersion') ? rootProject.ext.jacocoVersion : '0.7.7.201606060606'
def moduleExcludes = rootProject.ext.has('moduleExcludes') ? rootProject.ext.moduleExcludes : [:]
def ignoredByJacoco = rootProject.ext.has('ignoredByJacoco') ? rootProject.ext.ignoredByJacoco : []
subprojects { prj ->
// Apply Jacoco only if the project is not in the ignore list
logger.debug("subprojects: " + prj.name)
if (!ignoredByJacoco.contains(prj.name)) {
apply plugin: 'jacoco'
jacoco {
version jacocoToolVersion
}
task jacocoReport(type: JacocoReport, dependsOn: 'test') {
group = 'Reporting'
description = 'Generate Jacoco coverage reports after running tests.'
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: 'build/intermediates/classes/debug'
)
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: [prj.name] ?: [])
})
}
sourceDirectories = files('src/main/java')
executionData = files('build/jacoco/testDebugUnitTest.exec')
doFirst {
renameClasses(prj.name + '/build/intermediates/classes/debug')
}
}
}
}
apply plugin: 'jacoco'
jacoco {
toolVersion jacocoToolVersion
}
/**
* Root task that generates an aggregated Jacoco test coverage report for all sub-projects
*/
task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') {
group = 'Reporting'
description = 'Generates an aggregate report from all subprojects'
// Get list of projects which should be included in the report
def projects = new ArrayList()
subprojects.each { prj ->
if (!ignoredByJacoco.contains(prj.name)) {
projects.add(prj)
}
}
//noinspection GrUnresolvedAccess
dependsOn(projects.jacocoReport)
additionalSourceDirs = generateSourceFiles(projects)
sourceDirectories = generateSourceFiles(projects)
classDirectories = generateClassDirs(projects, moduleExcludes)
executionData = files(projects.jacocoReport.executionData)
reports {
html {
enabled true
destination 'build/reports/jacoco/full'
}
xml {
enabled true
destination 'build/reports/jacoco/full/jacocoFullReport.xml'
}
}
doFirst {
//noinspection GroovyAssignabilityCheck
executionData = files(executionData.findAll { it.exists() })
}
}
/**
* Generate a FileCollection of all projects source files
*/
FileCollection generateSourceFiles(Collection projects) {
def dirs = []
projects.each { prj ->
dirs.add("${prj.name}/src/main/java")
}
return files(dirs)
}
/**
* Generate a FileCollection of all projects class files
*/
FileCollection generateClassDirs(Collection projects, moduleExcludes) {
def tree = fileTree('directory does not exists')
// I know it's ugly :)
projects.each { prj ->
//noinspection GrReassignedInClosureLocalVar
tree += fileTree(
dir: "${prj.name}/build/intermediates/classes/debug",
excludes: moduleExcludes[prj.name] ?: []
)
}
return tree
}
List<File> listDirRecursive(File rootPath) {
List<File> result = new ArrayList<>()
List<File> children = rootPath.listFiles()
children.each { file ->
if (file.isFile()) {
result.add(file)
} else if (file.isDirectory()) {
result.addAll(listDirRecursive(file))
}
}
return result
}
void renameClasses(String rootPath) {
List<File> classes = listDirRecursive(file(rootPath))
classes.each { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}