diff --git a/build.gradle b/build.gradle index 754a2f63844..58afa841dbc 100644 --- a/build.gradle +++ b/build.gradle @@ -131,3 +131,6 @@ apply from: file('gradle/ant-compat/test-classes-cross-deps.gradle') apply from: file('gradle/ant-compat/artifact-naming.gradle') apply from: file('gradle/ant-compat/solr-forbidden-apis.gradle') apply from: file('gradle/ant-compat/forbidden-api-rules-in-sync.gradle') + +apply from: file('gradle/documentation/documentation.gradle') +apply from: file('gradle/documentation/changes-to-html.gradle') diff --git a/gradle/documentation/changes-to-html.gradle b/gradle/documentation/changes-to-html.gradle new file mode 100644 index 00000000000..8d4b6dd0980 --- /dev/null +++ b/gradle/documentation/changes-to-html.gradle @@ -0,0 +1,89 @@ +/* + * 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. + */ + +configure(subprojects.findAll { it.path == ':lucene' || it.path == ':solr' }) { + task changesToHtml(type: ChangesToHtmlTask) +} + +// compile changes.txt into an html file +class ChangesToHtmlTask extends DefaultTask { + + @Input + File changesFile = project.file("CHANGES.txt") + + @Input + File changesDoapFile = project.rootProject.file("dev-tools/doap/${project.name}.rdf") + + @InputDirectory + File siteDir = project.rootProject.file("lucene/site/changes") + + @OutputDirectory + File targetDir = project.file("${project.docroot}/changes") + + def luceneDocUrl = "https://lucene.apache.org/core/${project.version.replace(".", "_")}/".toString() + + def loadVersions(File outfile) { + // load version properties from DOAP RDF + def prefix = "doap.${project.name}".toString() + ant.xmlproperty(keeproot: false, file: changesDoapFile, collapseAttributes: false, prefix: "${prefix}") + outfile.withWriter("UTF-8") { writer -> + writer.println(ant.properties["${prefix}.Project.release.Version.revision"]) + writer.println(ant.properties["${prefix}.Project.release.Version.created"]) + } + } + + def toHtml(File versionsFile) { + def output = new ByteArrayOutputStream() + def result = project.exec { + executable "perl" + standardInput changesFile.newInputStream() + standardOutput project.file("${targetDir}/Changes.html").newOutputStream() + errorOutput = output + ignoreExitValue = true + + args += [ + "-CSD", + project.rootProject.file("${siteDir}/changes2html.pl").toString(), + "${project.name}", + versionsFile.toString(), + luceneDocUrl + ] + } + + if (result.getExitValue() != 0) { + throw new GradleException("Changes generation failed:\n${output}") + } + } + + @TaskAction + def convert() { + project.mkdir targetDir + if (changesFile.exists() && changesDoapFile.exists()) { + File versionsFile = project.file("${project.buildDir}/doap.${project.name}.changes.version.dates.csv") + loadVersions(versionsFile) + toHtml(versionsFile) + project.copy { + from siteDir + into targetDir + include "*.css" + } + versionsFile.delete() + } else { + throw new GradleException("Changes file ${changesFile} or Doap file ${changesDoapFile} not found.") + } + } +} diff --git a/gradle/documentation/documentation.gradle b/gradle/documentation/documentation.gradle new file mode 100644 index 00000000000..9ba5c5df6cb --- /dev/null +++ b/gradle/documentation/documentation.gradle @@ -0,0 +1,37 @@ +/* + * 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. + */ + +configure(rootProject) { + task documentation() { + group = 'documentation' + description = 'Generate all documentation' + + dependsOn allprojects.collect { prj -> + prj.tasks.matching { task -> task.name in [ + "changesToHtml" + // TODO: "markdownToHtml" + // TODO: "gatherJavadocs" + ]} + } + } +} + +configure(subprojects.findAll { it.path == ':lucene' || it.path == ':solr' }) { + ext { + docroot = "${project.buildDir}/documentation" + } +}