Skip to content

Commit

Permalink
WIP - Introduce gradleLint configuration for classpath isolation (#229)
Browse files Browse the repository at this point in the history
* remove bad package for org.ow2.asm

* initial work to create own classpath for lint tasks

* initial work to create own classpath for lint tasks

* fix configuration creation for lint

* fix report task classpath

* remove asm from shading

* add asm back to shaded dependencies for lint plugin
  • Loading branch information
rpalcolea committed Mar 8, 2019
1 parent 035c82e commit 17c873b
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 16 deletions.
11 changes: 1 addition & 10 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -110,22 +110,13 @@ shadowJar {
include(dependency('commons-lang:commons-lang'))
include(dependency('org.codenarc:CodeNarc'))
include(dependency('org.ow2.asm:asm'))
include(dependency('org.ow2.asm:asm-commons'))
include(dependency('org.ow2.asm:asm-analysis'))
include(dependency('org.ow2.asm:asm-tree'))
include(dependency('org.ow2.asm:asm-util'))
}
relocate 'org.eclipse.jdt', 'com.netflix.nebula.lint.jdt'
relocate 'org.eclipse.jgit', 'com.netflix.nebula.lint.jgit'
relocate 'org.apache.commons.lang', 'com.netflix.nebula.lint.commons.lang'
relocate 'org.codenarc', 'com.netflix.nebula.lint.org.codenarc'
relocate 'org.ow2.asm', 'com.netflix.nebula.lint.org.ow2.asm'
relocate 'org.objectweb.asm', 'com.netflix.nebula.lint.org.objectweb.asm'
relocate 'org.objectweb.asm.common', 'com.netflix.nebula.lint.org.objectweb.asm.common'
relocate 'org.objectweb.asm.tree.analysis', 'com.netflix.nebula.lint.org.objectweb.asm.tree.analysis'
relocate 'org.objectweb.asm.tree', 'com.netflix.nebula.lint.org.objectweb.asm.tree'
relocate 'org.objectweb.asm.util', 'com.netflix.nebula.lint.org.objectweb.asm.util'


// powerassert is packed inside codenarc without relocation for some reason
relocate 'org.codehaus.groovy.transform.powerassert', 'com.netflix.nebula.lint.org.codehaus.groovy.transform.powerassert'
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.netflix.nebula.lint.plugin

import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.Classpath

class AbstractLintTask extends DefaultTask {
private FileCollection lintClassPath

/**
* Classpath containing lint dependencies for the task
*/
@Classpath
FileCollection getLintClassPath() {
return lintClassPath
}

void setLintClassPath(FileCollection lintClassPath) {
this.lintClassPath = lintClassPath
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import org.gradle.util.DeprecationLogger

import static com.netflix.nebula.lint.StyledTextService.Styling.*

class FixGradleLintTask extends DefaultTask implements VerificationTask {
class FixGradleLintTask extends AbstractLintTask implements VerificationTask {
List<GradleLintViolationAction> userDefinedListeners = []

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@ import org.gradle.BuildResult
import org.gradle.api.BuildCancelledException
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.execution.TaskExecutionGraph
import org.gradle.api.execution.TaskExecutionGraphListener
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.util.DeprecationLogger


class GradleLintPlugin implements Plugin<Project> {

public static final String AUTO_LINT_GRADLE = 'autoLintGradle'
private static final String LINT_CONFIGURATION = 'gradleLint'

@Override
void apply(Project project) {

Configuration configuration = configureLintConfiguration(project)

failForKotlinScript(project)

LintRuleRegistry.classLoader = getClass().classLoader
Expand All @@ -41,20 +45,25 @@ class GradleLintPlugin implements Plugin<Project> {
if (project.rootProject == project) {
def autoLintTask = project.tasks.create(AUTO_LINT_GRADLE, LintGradleTask)
autoLintTask.listeners = lintExt.listeners
autoLintTask.setLintClassPath(configuration)

def manualLintTask = project.tasks.create('lintGradle', LintGradleTask)
manualLintTask.group = 'lint'
manualLintTask.failOnWarning = true
manualLintTask.setLintClassPath(configuration)

def criticalLintTask = project.tasks.create('criticalLintGradle', LintGradleTask)
criticalLintTask.group = 'lint'
criticalLintTask.onlyCriticalRules = true
criticalLintTask.setLintClassPath(configuration)

def fixTask = project.tasks.create('fixGradleLint', FixGradleLintTask)
fixTask.userDefinedListeners = lintExt.listeners
fixTask.setLintClassPath(configuration)

def fixTask2 = project.tasks.create('fixLintGradle', FixGradleLintTask)
fixTask2.userDefinedListeners = lintExt.listeners
fixTask2.setLintClassPath(configuration)

project.gradle.addListener(new LintListener() {
def allTasks
Expand Down Expand Up @@ -88,7 +97,7 @@ class GradleLintPlugin implements Plugin<Project> {
})
}

configureReportTask(project, lintExt)
configureReportTask(project, configuration, lintExt)

project.plugins.withType(JavaBasePlugin) {
project.tasks.withType(AbstractCompile) { task ->
Expand All @@ -100,15 +109,26 @@ class GradleLintPlugin implements Plugin<Project> {

}

private Configuration configureLintConfiguration(Project project) {
Project projectToConfigure = project.rootProject ?: project
Configuration configuration = projectToConfigure.configurations.maybeCreate(LINT_CONFIGURATION)
configuration.setVisible(true)
configuration.setTransitive(true)
configuration.setDescription("Configuration for Gradle Lint tasks")
return configuration
}

def failForKotlinScript(Project project) {
if (project.buildFile.name.toLowerCase().endsWith('.kts')) {
throw new BuildCancelledException("Gradle Lint Plugin currently doesn't support kotlin build scripts." +
" Please, switch to groovy build script if you want to use linting.")
}
}

private void configureReportTask(Project project, GradleLintExtension extension) {
private void configureReportTask(Project project, Configuration configuration, GradleLintExtension extension) {
def task = project.tasks.create('generateGradleLintReport', GradleLintReportTask)
task.setLintClassPath(configuration)

task.reports.all { report ->
report.conventionMapping.with {
enabled = { report.name == extension.reportFormat }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import static com.netflix.nebula.lint.StyledTextService.Styling.*

import javax.inject.Inject

class GradleLintReportTask extends DefaultTask implements VerificationTask, Reporting<CodeNarcReports> {
class GradleLintReportTask extends AbstractLintTask implements VerificationTask, Reporting<CodeNarcReports> {
@Nested
private final CodeNarcReportsImpl reports

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import org.gradle.util.DeprecationLogger

import static com.netflix.nebula.lint.StyledTextService.Styling.*

class LintGradleTask extends DefaultTask {
class LintGradleTask extends AbstractLintTask {
List<GradleLintViolationAction> listeners = []

boolean failOnWarning = false
Expand Down

0 comments on commit 17c873b

Please sign in to comment.