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 lineSplitter = ~$/[\r\n]+/$; 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/$; 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: '**/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); while (javadocsMatcher.find()) { def ratDocument = new FileDocument(f); licenseMatcher.reset(); if (lineSplitter.split(javadocsMatcher.group(1)).any{ licenseMatcher.match(ratDocument, it) }) { 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') && text.contains('org.slf4j.LoggerFactory')) { if (!validLoggerPattern.matcher(text).find()) { reportViolation(f, 'invalid logging pattern [not private static final, uses static class name]'); } } }; 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" '.' + file.getAbsolutePath().substring(baseLen).replace(File.separatorChar, (char)'/'); } Set missingProps = new TreeSet(), withKeywords = new TreeSet(), unversioned = new TreeSet(), changed = new TreeSet(); task.log('Getting all versioned and unversioned files...', Project.MSG_INFO); statusClient.doStatus(basedir, SVNRevision.WORKING, SVNDepth.fromRecurse(true), false, true, false, false, { status -> SVNStatusType nodeStatus = status.getNodeStatus(); if (nodeStatus == SVNStatusType.STATUS_UNVERSIONED || nodeStatus == SVNStatusType.STATUS_MISSING) { unversioned.add(convertRelative(status.getFile())); } else if (status.getKind() == SVNNodeKind.FILE && nodeStatus != SVNStatusType.STATUS_DELETED) { missingProps.add(convertRelative(status.getFile())); } if (nodeStatus == SVNStatusType.STATUS_MODIFIED || nodeStatus == SVNStatusType.STATUS_REPLACED || nodeStatus == SVNStatusType.STATUS_DELETED || nodeStatus == SVNStatusType.STATUS_ADDED) { changed.add(convertRelative(status.getFile())); } } as ISVNStatusHandler, null); task.log('Filtering files with existing svn:eol-style...', Project.MSG_INFO); wcClient.doGetProperty(basedir, 'svn:eol-style', SVNRevision.WORKING, SVNRevision.WORKING, true, { file, prop -> missingProps.remove(convertRelative(file)); } as ISVNPropertyHandler); task.log('Filtering files with binary svn:mime-type...', Project.MSG_INFO); wcClient.doGetProperty(basedir, 'svn:mime-type', SVNRevision.WORKING, SVNRevision.WORKING, true, { file, prop -> prop = SVNPropertyValue.getPropertyAsString(prop.getValue()); if (prop.startsWith('application/') || prop.startsWith('image/')) { missingProps.remove(convertRelative(file)); } } as ISVNPropertyHandler); task.log('Scanning for files with svn:keywords property...', Project.MSG_INFO); wcClient.doGetProperty(basedir, 'svn:keywords', SVNRevision.WORKING, SVNRevision.WORKING, true, { file, prop -> withKeywords.add(convertRelative(file)); } as ISVNPropertyHandler); def setProjectPropertyFromSet(prop, set) { if (set) { properties[prop] = '* ' + set.join(properties['line.separator'] + '* '); } }; setProjectPropertyFromSet('svn.checkprops.failed', missingProps); setProjectPropertyFromSet('svn.keywords.failed', withKeywords); setProjectPropertyFromSet('svn.unversioned.failed', unversioned); setProjectPropertyFromSet('svn.changed.failed', changed); ]]> 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}]