Search code examples
groovygradle-pluginjacoco-plugin

Custom JaCoCo Gradle Plugin - exclude files in report


I'm new to Gradle and Groovy. I have something like this in my build.gradle file:

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: ['aaa/bbb.*', 'ccc/ddd/*',])
        }))
    }
}

Now, I need this in my custom plugin. But I'm not sure how to set these excludes to it. I have something like this:

project.afterEvaluate { p ->
    def reportTask = project.tasks.findByName('jacocoTestReport') as JacocoReport
    reportTask.classDirectories.setFrom(reportTask.classDirectories.files.) // Now what?
}

And I'm stuck here. Can you help me sort this out, please?

EDIT1:

I tried to solve it using patternSet.

println '----------------BEFORE REPORT----------------------'
def patternSet = new PatternSet()
def filesAsString = reportTask.classDirectories.files.collect { file ->
    file.path
}
patternSet.setIncludes(filesAsString)
patternSet.setExcludes(['aaa/bbb.*', 'ccc/ddd/*'])
def excludeFiles = reportTask.classDirectories.asFileTree.matching(patternSet).files
println filesAsString
println excludeFiles
def files = reportTask.classDirectories.asFileTree.minus(excludeFiles)
reportTask.classDirectories.setFrom(files)
println '----------------AFTER REPORT----------------------'
println reportTask.classDirectories.files

Result is not what I expected:

----------------BEFORE REPORT----------------------
[aaa\bbb\build\classes\java\main, aaa\bbb\build\classes\groovy\main, aaa\bbb\build\resources\main]
[]
----------------AFTER REPORT----------------------
[]

No exclude directories at all.


Solution

  • So, I somehow solved it.

    def ex = ['aaa/bbb/*','ccc/ddd.*','eee/fff/*']
    def ft = reportTask.classDirectories.asFileTree.matching {
        ex.each {
            exclude it
        }
    }
    

    Don't ask me how Gradle wraps this since it's not a Groovy syntax, but it works. My opinion is that Gradle somehow implements AntlrTask as a pattern matcher since it implements interface 'PatternFilterable' and documentation mentions Ant. I tried to solve it in pure Groovy using PatternSet which is another class implementing PatternFilterable but I haven't succeded.

    But the simple exclude 'aaa/bbb/*' works OK. It doesn't take list so I had to do it using forEach cycle. Maybe there is more simple and elegant way and I'll try to play with it but this solution is good enough.