task.log(name + ': ' + f.toString().substring(baseDirLen).replace(File.separatorChar, (char)'/'), Project.MSG_ERR); violations.add(name); found++; } def javadocsPattern = ~$/(?sm)^\Q/**\E(.*?)\Q*/\E/$; def javaCommentPattern = ~$/(?sm)^\Q/*\E(.*?)\Q*/\E/$; def xmlCommentPattern = ~$/(?sm)\Q\E/$; def lineSplitter = ~$/[\r\n]+/$; def singleLineSplitter = ~$/\n\r?/$; def licenseMatcher = Defaults.createDefaultMatcher(); def validLoggerPattern = ~$/(?s)\b(private\s|static\s|final\s){3}+\s*Logger\s+\p{javaJavaIdentifierStart}+\s+=\s+\QLoggerFactory.getLogger(MethodHandles.lookup().lookupClass());\E/$; def packagePattern = ~$/(?m)^\s*package\s+org\.apache.*;/$; def xmlTagPattern = ~$/(?m)\s*<[a-zA-Z].*/$; def sourceHeaderPattern = ~$/\[source\b.*/$; def blockBoundaryPattern = ~$/----\s*/$; def blockTitlePattern = ~$/\..*/$; def unescapedSymbolPattern = ~$/(?<=[^\\]|^)([-=]>|<[-=])/$; // SOLR-10883 def isLicense = { matcher, ratDocument -> licenseMatcher.reset(); return lineSplitter.split(matcher.group(1)).any{ licenseMatcher.match(ratDocument, it) }; } def checkLicenseHeaderPrecedes = { f, description, contentPattern, commentPattern, text, ratDocument -> def contentMatcher = contentPattern.matcher(text); if (contentMatcher.find()) { def contentStartPos = contentMatcher.start(); def commentMatcher = commentPattern.matcher(text); while (commentMatcher.find()) { if (isLicense(commentMatcher, ratDocument)) { if (commentMatcher.start() < contentStartPos) { break; // This file is all good, so break loop: license header precedes 'description' definition } else { reportViolation(f, description+' declaration precedes license header'); } } } } } def checkForUnescapedSymbolSubstitutions = { f, text -> def inCodeBlock = false; def underSourceHeader = false; def lineNumber = 0; singleLineSplitter.split(text).each { ++lineNumber; if (underSourceHeader) { // This line is either a single source line, or the boundary of a code block inCodeBlock = blockBoundaryPattern.matcher(it).matches(); if ( ! blockTitlePattern.matcher(it).matches()) { // Keep underSourceHeader=true underSourceHeader = false; } } else { if (inCodeBlock) { inCodeBlock = ! blockBoundaryPattern.matcher(it).matches(); } else { underSourceHeader = sourceHeaderPattern.matcher(it).matches(); if ( ! underSourceHeader) { def unescapedSymbolMatcher = unescapedSymbolPattern.matcher(it); if (unescapedSymbolMatcher.find()) { reportViolation(f, 'Unescaped symbol "' + unescapedSymbolMatcher.group(1) + '" on line #' + lineNumber); } } } } } } ant.fileScanner{ fileset(dir: baseDir){ extensions.each{ include(name: 'lucene/**/*.' + it) include(name: 'solr/**/*.' + it) include(name: 'dev-tools/**/*.' + it) include(name: '*.' + it) } // TODO: For now we don't scan txt files, so we // check licenses in top-level folders separately: include(name: '*.txt') include(name: '*/*.txt') // excludes: exclude(name: '**/build/**') exclude(name: '**/dist/**') exclude(name: 'lucene/benchmark/work/**') exclude(name: 'lucene/benchmark/temp/**') exclude(name: '**/CheckLoggingConfiguration.java') exclude(name: 'build.xml') // ourselves :-) } }.each{ f -> task.log('Scanning file: ' + f, Project.MSG_VERBOSE); def text = f.getText('UTF-8'); invalidPatterns.each{ pattern,name -> if (pattern.matcher(text).find()) { reportViolation(f, name); } } def javadocsMatcher = javadocsPattern.matcher(text); def ratDocument = new FileDocument(f); while (javadocsMatcher.find()) { if (isLicense(javadocsMatcher, ratDocument)) { reportViolation(f, String.format(Locale.ENGLISH, 'javadoc-style license header [%s]', ratDocument.getMetaData().value(MetaData.RAT_URL_LICENSE_FAMILY_NAME))); } } if (f.toString().endsWith('.java')) { if (text.contains('org.slf4j.LoggerFactory')) { if (!validLoggerPattern.matcher(text).find()) { reportViolation(f, 'invalid logging pattern [not private static final, uses static class name]'); } } checkLicenseHeaderPrecedes(f, 'package', packagePattern, javaCommentPattern, text, ratDocument); } if (f.toString().endsWith('.xml') || f.toString().endsWith('.xml.template')) { checkLicenseHeaderPrecedes(f, '', xmlTagPattern, xmlCommentPattern, text, ratDocument); } if (f.toString().endsWith('.adoc')) { checkForUnescapedSymbolSubstitutions(f, text); } }; if (found) { throw new BuildException(String.format(Locale.ENGLISH, 'Found %d violations in source files (%s).', found, violations.join(', '))); } ]]> k.startsWith(propPrefix) } .collectEntries{ k, v -> [k.substring(propPrefixLen), v] }; cmdlineProps << project.userProperties.findAll{ k, v -> !k.startsWith('ant.') }; def artifact = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.maven.artifact.ant'); task.log('Running Maven with props: ' + cmdlineProps.toString(), Project.MSG_INFO); artifact.mvn(pom: properties['maven-build-dir']+'/pom.xml', mavenVersion: properties['maven-version'], failonerror: true, fork: true) { cmdlineProps.each{ k, v -> arg(value: '-D' + k + '=' + v) }; arg(value: '-fae'); arg(value: 'install'); }; ]]> SUCCESS: You must right-click your project and choose Refresh. Your project must use a Java 8 JRE. To complete IntelliJ IDEA setup, you must manually configure File | Project Structure | Project | Project SDK. You won't have to do this in the future if you define property $${idea.jdk}, e.g. in ~/lucene.build.properties, ~/build.properties or lucene/build.properties, with a value consisting of the following two XML attributes/values (adjust values according to JDKs you have defined locally - see File | Project Structure | Platform Settings | SDKs): idea.jdk = project-jdk-name="1.8" project-jdk-type="JavaSDK" if (val instanceof Set) { if (prop in ['untracked', 'untrackedFolders', 'missing']) { unversioned.addAll(val); } else if (prop != 'ignoredNotInIndex') { modified.addAll(val); } } }; setProjectPropertyFromSet('wc.unversioned.files', unversioned); setProjectPropertyFromSet('wc.modified.files', modified); } } catch (RepositoryNotFoundException | NoWorkTreeException | NotSupportedException e) { task.log('WARNING: Development directory is not a valid GIT checkout! Disabling checks...', Project.MSG_WARN); } ]]> Clover not enabled! You can find the merged Lucene/Solr Clover report in '${clover.report.dir}'. java version "${java.version}" ${java.runtime.name} (${java.runtime.version}, ${java.vendor}) ${java.vm.name} (${java.vm.version}, ${java.vm.vendor}) Test args: [${args}]