You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2020/01/15 08:55:50 UTC

[lucene-solr] branch gradle-master updated: Add RAT check using Gradle (#1157)

This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch gradle-master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/gradle-master by this push:
     new c9e7eeb  Add RAT check using Gradle (#1157)
c9e7eeb is described below

commit c9e7eebe28087f47b22fdefd96165e4c8d5442da
Author: Mike <ma...@users.noreply.github.com>
AuthorDate: Wed Jan 15 02:55:41 2020 -0600

    Add RAT check using Gradle (#1157)
    
    Merging Apache rat checks.
---
 build.gradle                                      |   1 +
 gradle/validation/precommit.gradle                |   1 +
 gradle/validation/rat-sources.gradle              | 266 ++++++++++++++++++++++
 gradle/validation/validate-source-patterns.gradle |  16 +-
 versions.props                                    |   1 +
 5 files changed, 277 insertions(+), 8 deletions(-)

diff --git a/build.gradle b/build.gradle
index 0f4768d..75756fd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -51,6 +51,7 @@ apply from: file('gradle/validation/git-status.gradle')
 apply from: file('gradle/validation/versions-props-sorted.gradle')
 apply from: file('gradle/validation/validate-source-patterns.gradle')
 apply from: file('gradle/validation/config-file-sanity.gradle')
+apply from: file('gradle/validation/rat-sources.gradle')
 
 // Additional development aids.
 apply from: file('gradle/maven/maven-local.gradle')
diff --git a/gradle/validation/precommit.gradle b/gradle/validation/precommit.gradle
index 88f9b99..f68b9c6 100644
--- a/gradle/validation/precommit.gradle
+++ b/gradle/validation/precommit.gradle
@@ -22,6 +22,7 @@ configure(rootProject) {
           "forbiddenApisTest",
           "licenses",
           "javadoc",
+          "rat",
       ]}
     }
   }
diff --git a/gradle/validation/rat-sources.gradle b/gradle/validation/rat-sources.gradle
new file mode 100644
index 0000000..90291e6
--- /dev/null
+++ b/gradle/validation/rat-sources.gradle
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import groovy.xml.NamespaceBuilder
+
+configure(rootProject) {
+    configurations {
+        rat
+    }
+
+    dependencies {
+        rat "org.apache.rat:apache-rat"
+    }
+}
+
+allprojects {
+    task("rat", type: RatTask) {
+        group = 'Verification'
+        description = 'Runs Apache Rat checks.'
+    }
+
+    if (project == rootProject) {
+        rat {
+            includes += [
+                "buildSrc/**/*.java",
+                "lucene/tools/forbiddenApis/**",
+                "lucene/tools/prettify/**",
+                // "dev-tools/**"
+            ]
+            excludes += [
+                // Unclear if this needs ASF header, depends on how much was copied from ElasticSearch
+                "**/ErrorReportingTestListener.java"
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:analysis:common") {
+        rat {
+            srcExcludes += [
+                "**/*.aff",
+                "**/*.dic",
+                "**/charfilter/*.htm*",
+                "**/*LuceneResourcesWikiPage.html"
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:analysis:kuromoji") {
+        rat {
+            srcExcludes += [
+                // whether rat detects this as binary or not is platform dependent?!
+                "**/bocchan.utf-8"
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:analysis:opennlp") {
+        rat {
+            excludes += [
+                "src/tools/test-model-data/*.txt",
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:highlighter") {
+        rat {
+            srcExcludes += [
+                "**/CambridgeMA.utf8"
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:suggest") {
+        rat {
+            srcExcludes += [
+                "**/Top50KWiki.utf8",
+                "**/stop-snowball.txt"
+            ]
+        }
+    }
+
+    if (project.path == ":lucene:tools") {
+        rat {
+            includes += [
+                "forbiddenApis/**",
+                "prettify/**",
+                // If/when :lucene:tools becomes a gradle project, then the following line will fail
+                // It is safe to remove it, but also remove the check for lucene/tools in rootProject above
+                "javadoc/ecj.javadocs.prefs"
+            ]
+        }
+    }
+
+
+    if (project.path == ":solr:core") {
+        rat {
+            srcExcludes += [
+                "**/htmlStripReaderTest.html"
+            ]
+        }
+    }
+
+    if (project.path == ":solr:webapp") {
+        rat {
+            includes = [ "**" ]
+            excludes += [
+                "web/img/**",
+                "*.iml",
+                "build.gradle",
+                "build/**",
+            ]
+        }
+    }
+}
+
+// Structure inspired by existing task from Apache Kafka, heavily modified since then.
+class RatTask extends DefaultTask {
+    @Input
+    List<String> includes = [
+        "*.xml",
+        "src/tools/**"
+    ]
+
+    @Input
+    List<String> excludes = []
+
+    @Input
+    List<String> srcExcludes = [
+        "**/TODO",
+        "**/*.txt",
+        "**/*.iml",
+        "**/*.gradle",
+        "build/**"
+    ]
+
+    @OutputFile
+    def xmlReport = new File(new File(project.buildDir, 'rat'), 'rat-report.xml')
+
+    def generateXmlReport() {
+        def uri = 'antlib:org.apache.rat.anttasks'
+        def ratClasspath = project.rootProject.configurations.rat.asPath
+        ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml', uri: uri, classpath: ratClasspath)
+
+        def rat = NamespaceBuilder.newInstance(ant, uri)
+        rat.report(format: 'xml', reportFile: xmlReport, addDefaultLicenseMatchers: true) {
+            ant.fileset(dir: "${project.projectDir}") {
+                includes.each { pattern -> ant.include(name: pattern) }
+                excludes.each { pattern -> ant.exclude(name: pattern) }
+            }
+
+            if (project.plugins.findPlugin(JavaPlugin)) {
+                [
+                    project.sourceSets.main.java.srcDirs,
+                    project.sourceSets.test.java.srcDirs,
+                ].flatten().each { srcLocation ->
+                    ant.fileset(dir: srcLocation, erroronmissingdir: false) {
+                        srcExcludes.each { pattern -> ant.exclude(name: pattern) }
+                    }
+                }
+
+                [
+                    project.sourceSets.main.resources.srcDirs
+                ].flatten().each { srcLocation ->
+                    ant.fileset(dir: srcLocation, erroronmissingdir: false) {
+                        ant.include(name: "META-INF/**")
+                    }
+                }
+            }
+
+            // The license rules below were manually copied from lucene/common-build.xml, there is currently no mechanism to sync them
+
+            // BSD 4-clause stuff (is disallowed below)
+            substringMatcher(licenseFamilyCategory: "BSD4 ", licenseFamilyName: "Original BSD License (with advertising clause)") {
+                pattern(substring: "All advertising materials")
+            }
+
+            // BSD-like stuff
+            substringMatcher(licenseFamilyCategory: "BSD  ", licenseFamilyName: "Modified BSD License") {
+                // brics automaton
+                pattern(substring: "Copyright (c) 2001-2009 Anders Moeller")
+                // snowball
+                pattern(substring: "Copyright (c) 2001, Dr Martin Porter")
+                // UMASS kstem
+                pattern(substring: "THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF MASSACHUSETTS AND OTHER CONTRIBUTORS")
+                // Egothor
+                pattern(substring: "Egothor Software License version 1.00")
+                // JaSpell
+                pattern(substring: "Copyright (c) 2005 Bruno Martins")
+                // d3.js
+                pattern(substring: "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS")
+                // highlight.js
+                pattern(substring: "THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS")
+            }
+
+            // MIT-like
+            substringMatcher(licenseFamilyCategory: "MIT  ", licenseFamilyName:"Modified BSD License") {
+                // ICU license
+                pattern(substring: "Permission is hereby granted, free of charge, to any person obtaining a copy")
+            }
+
+            // Apache
+            substringMatcher(licenseFamilyCategory: "AL   ", licenseFamilyName: "Apache") {
+                pattern(substring: "Licensed to the Apache Software Foundation (ASF) under")
+                // this is the old - school one under some files
+                pattern(substring: 'Licensed under the Apache License, Version 2.0 (the "License")')
+            }
+
+            substringMatcher(licenseFamilyCategory: "GEN  ", licenseFamilyName: "Generated") {
+                // svg files generated by gnuplot
+                pattern(substring: "Produced by GNUPLOT")
+                // snowball stemmers generated by snowball compiler
+                pattern(substring: "This file was generated automatically by the Snowball to Java compiler")
+                // parsers generated by antlr
+                pattern(substring: "ANTLR GENERATED CODE")
+            }
+
+            approvedLicense(familyName: "Apache")
+            approvedLicense(familyName: "The MIT License")
+            approvedLicense(familyName: "Modified BSD License")
+            approvedLicense(familyName: "Generated")
+        }
+    }
+
+    def printUnknownFiles() {
+        def ratXml = new XmlParser().parse(xmlReport)
+        def errors = []
+        ratXml.resource.each { resource ->
+            if (resource.'license-approval'.@name[0] == "false") {
+                errors << "Unknown license: ${resource.@name}"
+            }
+        }
+        if (errors) {
+            throw new GradleException("Found " + errors.size() + " file(s) with errors:\n" +
+                    errors.collect{ msg -> "  - ${msg}" }.join("\n"))
+        }
+    }
+
+    @TaskAction
+    def rat() {
+        def origEncoding = System.getProperty("file.encoding")
+        try {
+            generateXmlReport()
+            printUnknownFiles()
+        } finally {
+            if (System.getProperty("file.encoding") != origEncoding) {
+                throw new GradleException("Insane: rat changed file.encoding to ${System.getProperty('file.encoding')}?")
+            }
+        }
+    }
+}
diff --git a/gradle/validation/validate-source-patterns.gradle b/gradle/validation/validate-source-patterns.gradle
index 7f7d8d9..f177c4b 100644
--- a/gradle/validation/validate-source-patterns.gradle
+++ b/gradle/validation/validate-source-patterns.gradle
@@ -3,16 +3,16 @@
 // This should be eventually rewritten in plain gradle. For now, delegate to
 // the ant/groovy script we already have.
 
-configurations {
-  checkSourceDeps
-}
+configure(rootProject) {
+  configurations {
+    checkSourceDeps
+  }
 
-dependencies {
-  checkSourceDeps "org.codehaus.groovy:groovy-all:2.4.17"
-  checkSourceDeps "org.apache.rat:apache-rat:0.11"
-}
+  dependencies {
+    checkSourceDeps "org.codehaus.groovy:groovy-all:2.4.17"
+    checkSourceDeps "org.apache.rat:apache-rat"
+  }
 
-configure(rootProject) {
   task validateSourcePatterns() {
     doFirst {
       ant.taskdef(
diff --git a/versions.props b/versions.props
index 7f25678..94c48ef 100644
--- a/versions.props
+++ b/versions.props
@@ -72,6 +72,7 @@ org.apache.opennlp:opennlp-tools=1.9.1
 org.apache.pdfbox:*=2.0.17
 org.apache.pdfbox:jempbox=1.8.16
 org.apache.poi:*=4.1.1
+org.apache.rat:apache-rat:0.11
 org.apache.tika:*=1.23
 org.apache.velocity.tools:*=3.0
 org.apache.xmlbeans:xmlbeans=3.1.0