/* * 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. */ /* * SOLR-14920 modelled on LUCENE-9564: This adds automatic (and enforced) code formatting using * spotless and Google Java Format. */ def resources = scriptResources(buildscript) configure(project(":solr").subprojects) { prj -> plugins.withType(JavaPlugin) { prj.apply plugin: 'com.diffplug.spotless' project.ext { spotlessJavaSetup = (Action){ it.toggleOffOn() // obviously, only to be used sparingly. // TODO: Work out how to support multiple different header files (we have // classes in the codebase that have original headers). We currently use // Apache RAT to enforce headers so this is of lesser priority. // // it.licenseHeaderFile(file("${resources}/asl-header.txt"), '^(\\s*package)') it.setLineEndings(Enum.valueOf(rootProject.buildscript.classLoader.loadClass("com.diffplug.spotless.LineEnding"), "UNIX")) it.endWithNewline() it.googleJavaFormat('1.18.1') it.custom('Refuse wildcard imports', { line -> // Wildcard imports can't be resolved by spotless itself. // This will require the developer themselves to adhere to best practices. if (line =~ /\nimport .*\*;/) { throw new AssertionError("Do not use wildcard imports. 'spotlessApply' cannot resolve this issue.") } line }) } } spotless { java { prj.ext.spotlessJavaSetup.execute(it) // Apply to all Java sources target "src/**/*.java" // Exclude certain files (generated ones, mostly). switch (project.path) { case ":solr:core": // These are excluded since they are generated by javacc targetExclude "src/java/org/apache/solr/parser/ParseException.java", "src/java/org/apache/solr/parser/QueryParser.java", "src/java/org/apache/solr/parser/QueryParserConstants.java", "src/java/org/apache/solr/parser/QueryParserTokenManager.java", "src/java/org/apache/solr/parser/Token.java", "src/java/org/apache/solr/parser/TokenMgrError.java" break case ":solr:modules:hdfs": // Exclude Hadoop copied files to make upgrades easier targetExclude "src/**/org/apache/hadoop/**" break case ":solr:solr-ref-guide": // Apply to all example Java sources in the ref-guide target "modules/**/examples/*.java" break } } } // Workaround for an odd problem in spotless where it fails because // of a missing folder. spotlessJava { doFirst { project.mkdir("${buildDir}/spotless/spotlessJava") } } // Schedule the core formatting task to run after Java compilation (GH-12012) spotlessJava { mustRunAfter tasks.withType(JavaCompile) } } // Emit a custom message about how to fix formatting errors. tasks.matching { task -> task.name == "spotlessJavaCheck" }.configureEach { runToFixMessage.set("\nIMPORTANT: run the top-level './gradlew tidy' to format code automatically (see help/formatting.txt for more info).") } // Add an alias to 'spotlessApply' simply called 'tidy' and wire up // spotlessCheck to convention's check. task tidy() { description "Applies formatters and cleanups to sources." group "verification" } tasks.matching { task -> task.name == "spotlessApply" }.configureEach { v -> tidy.dependsOn v v.dependsOn ":checkJdkInternalsExportedToGradle" } tasks.matching { task -> task.name == "spotlessCheck" }.configureEach { v -> check.dependsOn v v.dependsOn ":checkJdkInternalsExportedToGradle" } }