有没有办法只在VCS中有变化的文件上运行checkstyle?

时间:2017-05-02 05:45:10

标签: java git gradle android-gradle checkstyle

我最近开始帮助一个年轻的团队帮助改进他们的开发实践,并希望他们在每次提交之前运行checkstyle。不幸的是,他们的代码充满了错误,实现它的唯一可扩展方法是每次都在一小部分文件上运行checkstyle。

从战略上讲,我想只对那些在VCS中修改过的文件运行checkstyle。我写了一个gradle脚本来实现这一点,但它似乎没有用。任何人都有关于如何实现这一目标的提示?

apply plugin: 'checkstyle'

def getChangedFiles = { ->
    try {
        def stdout = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'diff', '--name-only'
            standardOutput = stdout
        }
        return stdout.toString().trim().split("\n")
    }
    catch (ignored) {
        return null;
    }
}

task checkstyle(type: Checkstyle) {
    configFile file("${project.rootDir}/quality/checkstyle/uncommon-checkstyle.xml")
    configProperties = [
            'checkstyle.cache.file': rootProject.file('build/checkstyle.cache'),
            'checkstyleSuppressionsPath': file("${project.rootDir}/quality/checkstyle/suppressions.xml").absolutePath
    ]
    source 'src'
    String[] split = getChangedFiles()
    for (int i=0; i<split.length; i++){
        include split[i]
        println split[i]
    }
    exclude '**/build/**'   // Exclude everything inside build folders.
    exclude '**/test/**' // Exclude tests
    exclude '**/androidTest/**' // Exclude android test files.
    ignoreFailures = false  // Don't allow the build to continue if there are warnings.
    classpath = files()
}

checkstyle {
    toolVersion '6.19'    // set Checkstyle version here
}

打印命令显示getChangedFiles()正在返回正确的文件集,并且我已经检查过以确保包含的文件也是准确的,但checkstyle本身似乎并没有在它们上运行

2 个答案:

答案 0 :(得分:0)

我认为,您真正想要的是过滤掉已更改文件中发现的违规行为。

Checkout Violations Lib以及该自述文件中提到的插件。有离线执行此操作的插件,或将其与pull请求集成。

答案 1 :(得分:0)

最近,我写了一个基于checkstyle的工具,仅支持对代码行的增量更改进行样式检查,您可以将此工具添加到Git预提交钩子中,以在每次提交之前触发检查。

有关详细信息,请参见:https://github.com/yangziwen/diff-checkstyle

尽管现在提出您的问题为时已晚,但我仍然希望这对以后有帮助。