/* * 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. */ /* * LUCENE-9564: This adds automatic (and enforced) code formatting using * spotless and Google Java Format. */ def resources = scriptResources(buildscript) configure(project(":lucene").subprojects) { prj -> plugins.withType(JavaPlugin) { prj.apply plugin: 'com.diffplug.spotless' spotless { java { 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. // // licenseHeaderFile file("${resources}/asl-header.txt"), '^(\\s*package)' lineEndings 'UNIX' endWithNewline() googleJavaFormat('1.15.0') // Apply to all Java sources target "src/**/*.java" // Exclude certain files (generated ones, mostly). switch (project.path) { case ":lucene:core": targetExclude "**/StandardTokenizerImpl.java" break case ":lucene:analysis:common": targetExclude "**/HTMLStripCharFilter.java", "**/UAX29URLEmailTokenizerImpl.java" break case ":lucene:test-framework": targetExclude "**/EmojiTokenizationTestUnicode_11_0.java", "**/WordBreakTestUnicode_9_0_0.java" break case ":lucene:expressions": break case ":lucene:queryparser": targetExclude "**/classic/ParseException.java", "**/classic/QueryParser.java", "**/classic/QueryParserConstants.java", "**/classic/QueryParserTokenManager.java", "**/classic/Token.java", "**/classic/TokenMgrError.java", "**/standard/parser/ParseException.java", "**/standard/parser/StandardSyntaxParser.java", "**/standard/parser/StandardSyntaxParserConstants.java", "**/standard/parser/StandardSyntaxParserTokenManager.java", "**/standard/parser/Token.java", "**/standard/parser/TokenMgrError.java", "**/surround/parser/ParseException.java", "**/surround/parser/QueryParser.java", "**/surround/parser/QueryParserConstants.java", "**/surround/parser/QueryParserTokenManager.java", "**/surround/parser/Token.java", "**/surround/parser/TokenMgrError.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" } }