From 703ecdccda61b577aa9a4132e87ed1cf059568f1 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 7 Feb 2011 10:37:08 -0500 Subject: [PATCH] removed local buildSrc dir --- buildSrc/.gitignore | 4 - buildSrc/README.md | 11 - buildSrc/checks.gradle | 90 ----- buildSrc/dist.gradle | 150 --------- buildSrc/docbook.gradle | 315 ------------------ buildSrc/docs.gradle | 278 ---------------- buildSrc/maven-deployment.gradle | 266 --------------- buildSrc/maven-root-pom.gradle | 65 ---- buildSrc/preconditions.gradle | 19 -- buildSrc/schema-publication.gradle | 63 ---- .../org/springframework/build/Version.groovy | 81 ----- .../build/bundlor/BundlorPlugin.groovy | 125 ------- .../gradle-plugins/bundlor.properties | 1 - buildSrc/wrapper.gradle | 33 -- buildSrc/wrapper/gradle-wrapper.jar | Bin 13330 -> 0 bytes buildSrc/wrapper/gradle-wrapper.properties | 6 - 16 files changed, 1507 deletions(-) delete mode 100644 buildSrc/.gitignore delete mode 100644 buildSrc/README.md delete mode 100644 buildSrc/checks.gradle delete mode 100644 buildSrc/dist.gradle delete mode 100644 buildSrc/docbook.gradle delete mode 100644 buildSrc/docs.gradle delete mode 100644 buildSrc/maven-deployment.gradle delete mode 100644 buildSrc/maven-root-pom.gradle delete mode 100644 buildSrc/preconditions.gradle delete mode 100644 buildSrc/schema-publication.gradle delete mode 100644 buildSrc/src/main/groovy/org/springframework/build/Version.groovy delete mode 100644 buildSrc/src/main/groovy/org/springframework/build/bundlor/BundlorPlugin.groovy delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/bundlor.properties delete mode 100644 buildSrc/wrapper.gradle delete mode 100644 buildSrc/wrapper/gradle-wrapper.jar delete mode 100644 buildSrc/wrapper/gradle-wrapper.properties diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore deleted file mode 100644 index 452be348b6..0000000000 --- a/buildSrc/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.sw? -.gradle -build -!src/main/groovy/org/springframework/build diff --git a/buildSrc/README.md b/buildSrc/README.md deleted file mode 100644 index 082f8de99e..0000000000 --- a/buildSrc/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Welcome to the SpringSource *shared Gradle sources* project - ----- - -This project provides shared Gradle sources for automating Spring Project builds. - -For complete documentation, please visit the [project wiki](https://github.com/SpringSource/spring-build-gradle/wiki) - -Or clone the wiki and view it offline using [Gollum](https://github.com/github/gollum) - -`git clone git://github.com/SpringSource/spring-build-gradle.wiki.git` diff --git a/buildSrc/checks.gradle b/buildSrc/checks.gradle deleted file mode 100644 index 38e92e1967..0000000000 --- a/buildSrc/checks.gradle +++ /dev/null @@ -1,90 +0,0 @@ - -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -/** - * Issue a snapshot dependency report across all Java projects. Detects not - * only direct snapshot dependencies, but transitive as well. - * - * @author Chris Beams - * @see snapshotDependencyCheck - */ -task snapshotDependencyReport { - description = 'Issues a snapshot dependency report across all Java projects' - - doFirst() { - def snapshotDependencies = new HashMap>() - - javaprojects.each { project -> - project.sourceSets.main.compileClasspath.allDependencies.each { dep -> - if (dep.version?.endsWith('SNAPSHOT')) { - if (snapshotDependencies[project] == null) - snapshotDependencies[project] = new ArrayList() - snapshotDependencies[project].add(dep) - } - } - } - - project.hasSnapshotDependencies = snapshotDependencies.size() > 0 - - if (project.hasSnapshotDependencies) { - println "The following snapshot dependencies were found:" - snapshotDependencies.each { entry -> - println "${entry.key} depends on:" - entry.value.each { dep -> - println " ${dep}" - } - } - } - } -} - - -/** - * Abort the build if any Java projects have snapshot dependencies. It important - * that any non-snapshot release be checked for snapshot dependencies before - * final publication, as snapshot dependencies may change and thus make the - * release unstable and/or unreproducable. - * - * This task will be added to the build lifecycle automatically if the release - * is non-snapshot. - * - * -PignoreSnapshotDependencies will bypass aborting the build. A use case for - * this option would be if a transitive dependency out of your control is a - * snapshot release and you wish to proceed with releasing anyway. - * - * @author Chris Beams - * @see snapshotDependencyReport - */ -task snapshotDependencyCheck(dependsOn: snapshotDependencyReport) { - group = 'Verification' - description = 'Aborts the build if any Java project has snapshot dependencies.' - - // bind to build lifecycle if we're a non-snapshot release - if (version.releaseType != 'SNAPSHOT') { - check.dependsOn snapshotDependencyCheck - } - - onlyIf { - project.hasSnapshotDependencies && - !project.hasProperty('ignoreSnapshotDependencies') - } - doFirst { - throw new GradleException( - "aborting '${name}' task due to snapshot dependencies. " - + "supply -PignoreSnapshotDependencies to override") - } -} diff --git a/buildSrc/dist.gradle b/buildSrc/dist.gradle deleted file mode 100644 index c2aadc91a0..0000000000 --- a/buildSrc/dist.gradle +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -// ----------------------------------------------------------------------------- -// Task definitions related to releasing the project -// -// @author Chris Beams -// ----------------------------------------------------------------------------- - -buildscript { - repositories { - mavenRepo urls: 'http://repository.springsource.com/maven/bundles/release' - } - dependencies { - classpath group: 'org.springframework.build', - name: 'org.springframework.build.aws.ant', - version: '3.0.3.RELEASE' - } -} - - -// ensure that every project has been evaluated before this script -// this allows us to look up tasks below and dereference dynamically -// assigned properties like 'docsSpec' below -project.subprojects.each { project -> - evaluationDependsOn project.path -} - -task check { - group = 'Verification' -} - -task build(dependsOn: [check, assemble]) { - group = 'Build' -} - -/** - * Build the distribution zip file. - * - * @author Chris Beams - */ -task distArchive(type: Zip) { - group = 'Build' - - destinationDir = buildDir - archiveName = "${project.name}-${project.version}.zip" - checksumPath = "${destinationDir}/${archiveName}.sha1" - def zipRootDir = "${project.name}-${project.version}" - - description = "Builds the distribution zip file at ${project.relativePath(destinationDir)}/${archiveName}" - - // depend on all projects with an assemble task - dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' } - - // we need the docsSpec to be defined before evaluating this task - project.evaluationDependsOn(':docs') - - // set up outputs for use by incremental build and by tasks like 'cleanDist' - // the archive zip file will be added automatically to outputs.files - // but we must add the sha1 checksum ourselves - outputs.files file(checksumPath) - - // configure the contents of the zip file. remember that this is a - // configuration phase event. no zip is being created yet. the Zip - // task we extend will do that for us during the execution phase. - into(zipRootDir) { - // add all jars from java subprojects - into('bin') { - from javaprojects.collect { project -> project.libsBinDir } - } - - // add all source jars from java subprojects - into('src') { - from javaprojects.collect { project -> project.libsSrcDir } - } - - into('') { - from('docs/src/info') - } - - into("docs/api") { - from("docs/build/api") - } - - into("docs/reference") { - from("docs/build/reference") - } - } - - // once the zip has been written, create a sha1 hash for it - // this will write out the file at ${checksumPath} - doLast { - ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') - assert file(checksumPath).isFile(): "${checksumPath} was not created" - } -} - -/** - * Upload the distribution zip file. - * - * @author Luke Taylor - * @author Chris Beams - */ -task uploadArchives(overwrite: true, dependsOn: distArchive) { // base plugin adds one we need to overwrite - group = 'Buildmaster' - description = 'Uploads the distribution zip file.' - - configurations { antlibs } - dependencies { - antlibs "org.springframework.build:org.springframework.build.aws.ant:3.0.3.RELEASE", - "net.java.dev.jets3t:jets3t:0.6.1" - } - - def releaseType = version.releaseType.toString().toLowerCase() - - doLast() { - println "Uploading: ${distArchive.archivePath} to s3" - project.ant { - taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', - classpath: configurations.antlibs.asPath) - s3(accessKey: s3AccessKey, secretKey: s3SecretAccessKey) { - upload(bucketName: 'dist.springframework.org', file: distArchive.archivePath, - toFile: releaseType + "/${rootProject.abbreviation}/${distArchive.archiveName}", publicRead: 'true') { - metadata(name: 'project.name', value: rootProject.description) - metadata(name: 'release.type', value: releaseType) - metadata(name: 'bundle.version', value: version) - metadata(name: 'package.file.name', value: distArchive.archiveName) - } - upload(bucketName: 'dist.springframework.org', file: "${distArchive.archivePath}.sha1", - toFile: releaseType + "/${rootProject.abbreviation}/${distArchive.archiveName}.sha1", publicRead: 'true') - } - } - } -} - - - diff --git a/buildSrc/docbook.gradle b/buildSrc/docbook.gradle deleted file mode 100644 index 2ad4b55fef..0000000000 --- a/buildSrc/docbook.gradle +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ -import org.xml.sax.XMLReader; -import org.xml.sax.InputSource; -import org.apache.xml.resolver.CatalogManager; -import org.apache.xml.resolver.tools.CatalogResolver; - -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.*; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.util.zip.*; - -import org.apache.fop.apps.*; - -import org.gradle.api.logging.LogLevel; - -import com.icl.saxon.TransformerFactoryImpl; -import ch.qos.logback.classic.Level; -import org.slf4j.LoggerFactory; - -buildscript { - repositories { - mavenCentral() - mavenRepo name: 'Shibboleth Repo', urls: 'http://shibboleth.internet2.edu/downloads/maven2' - } - dependencies { - def fopDeps = ['org.apache.xmlgraphics:fop:0.95-1@jar', - 'org.apache.xmlgraphics:xmlgraphics-commons:1.3', - 'org.apache.xmlgraphics:batik-bridge:1.7@jar', - 'org.apache.xmlgraphics:batik-util:1.7@jar', - 'org.apache.xmlgraphics:batik-css:1.7@jar', - 'org.apache.xmlgraphics:batik-dom:1.7', - 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar', - 'org.apache.avalon.framework:avalon-framework-api:4.3.1'] - - classpath 'org.apache.xerces:resolver:2.9.1', - 'saxon:saxon:6.5.3', - 'org.apache.xerces:xercesImpl:2.9.1', - fopDeps, - 'net.sf.xslthl:xslthl:2.0.1', - 'net.sf.docbook:docbook-xsl:1.75.2:resources@zip' - } - -} - -/** - * Gradle Docbook plugin implementation. - *

- * Creates three tasks: docbookHtml, docbookHtmlSingle and docbookPdf. - * Each task takes a single File on which it operates. - * - * @author Luke Taylor - */ -// Add the plugin tasks to the project -task docbookHtml(type: DocbookHtml) { - setDescription('Generates chunked docbook html output.') - xdir = 'html' - classpath = buildscript.configurations.classpath -} - -task docbookHtmlSingle(type: Docbook) { - setDescription('Generates single page docbook html output.') - xdir = 'htmlsingle' - classpath = buildscript.configurations.classpath -} - -task docbookPdf(type: DocbookFoPdf) { - setDescription('Generates PDF docbook output.') - extension = 'fo' - xdir = 'pdf' - classpath = buildscript.configurations.classpath -} - -/** - */ -public class Docbook extends DefaultTask { - @Input - String extension = 'html'; - - @Input - boolean XIncludeAware = true; - - @Input - boolean highlightingEnabled = true; - - String admonGraphicsPath; - - @InputDirectory - File sourceDirectory = new File(project.getProjectDir(), "build/reference-work"); - - @Input - String sourceFileName; - - @InputFile - File stylesheet; - - @OutputDirectory - File docsDir = new File(project.getBuildDir(), "reference"); - - @InputFiles - Configuration classpath - - @TaskAction - public final void transform() { - // the docbook tasks issue spurious content to the console. redirect to INFO level - // so it doesn't show up in the default log level of LIFECYCLE unless the user has - // run gradle with '-d' or '-i' switches -- in that case show them everything - switch (project.gradle.startParameter.logLevel) { - case LogLevel.DEBUG: - case LogLevel.INFO: - break; - default: - logging.captureStandardOutput(LogLevel.INFO) - logging.captureStandardError(LogLevel.INFO) - } - - SAXParserFactory factory = new org.apache.xerces.jaxp.SAXParserFactoryImpl(); - factory.setXIncludeAware(XIncludeAware); - docsDir.mkdirs(); - - File srcFile = new File(sourceDirectory, sourceFileName); - String outputFilename = srcFile.getName().substring(0, srcFile.getName().length() - 4) + '.' + extension; - - File oDir = new File(getDocsDir(), xdir) - File outputFile = new File(oDir, outputFilename); - - Result result = new StreamResult(outputFile.getAbsolutePath()); - CatalogResolver resolver = new CatalogResolver(createCatalogManager()); - InputSource inputSource = new InputSource(srcFile.getAbsolutePath()); - - XMLReader reader = factory.newSAXParser().getXMLReader(); - reader.setEntityResolver(resolver); - TransformerFactory transformerFactory = new TransformerFactoryImpl(); - transformerFactory.setURIResolver(resolver); - URL url = stylesheet.toURL(); - Source source = new StreamSource(url.openStream(), url.toExternalForm()); - Transformer transformer = transformerFactory.newTransformer(source); - - if (highlightingEnabled) { - File highlightingDir = new File(getProject().getBuildDir(), "highlighting"); - if (!highlightingDir.exists()) { - highlightingDir.mkdirs(); - extractHighlightFiles(highlightingDir); - } - - transformer.setParameter("highlight.source", "1"); - transformer.setParameter("highlight.xslthl.config", new File(highlightingDir, "xslthl-config.xml").toURI().toURL()); - - if (admonGraphicsPath != null) { - transformer.setParameter("admon.graphics", "1"); - transformer.setParameter("admon.graphics.path", admonGraphicsPath); - } - } - - preTransform(transformer, srcFile, outputFile); - - transformer.transform(new SAXSource(reader, inputSource), result); - - postTransform(outputFile); - } - - private void extractHighlightFiles(File toDir) { - File docbookZip = classpath.files.find { file -> file.name.contains('docbook-xsl-')}; - - if (docbookZip == null) { - throw new GradleException("Docbook zip file not found"); - } - - ZipFile zipFile = new ZipFile(docbookZip); - - Enumeration e = zipFile.entries(); - while (e.hasMoreElements()) { - ZipEntry ze = (ZipEntry) e.nextElement(); - if (ze.getName().matches(".*/highlighting/.*\\.xml")) { - String filename = ze.getName().substring(ze.getName().lastIndexOf("/highlighting/") + 14); - copyFile(zipFile.getInputStream(ze), new File(toDir, filename)); - } - } - } - - private void copyFile(InputStream source, File destFile) { - destFile.createNewFile(); - FileOutputStream to = null; - try { - to = new FileOutputStream(destFile); - byte[] buffer = new byte[4096]; - int bytesRead; - - while ((bytesRead = source.read(buffer)) > 0) { - to.write(buffer, 0, bytesRead); - } - } finally { - if (source != null) { - source.close(); - } - if (to != null) { - to.close(); - } - } - } - - protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { - } - - protected void postTransform(File outputFile) { - } - - private CatalogManager createCatalogManager() { - CatalogManager manager = new CatalogManager(); - manager.setIgnoreMissingProperties(true); - ClassLoader classLoader = this.getClass().getClassLoader(); - StringBuilder builder = new StringBuilder(); - String docbookCatalogName = "docbook/catalog.xml"; - URL docbookCatalog = classLoader.getResource(docbookCatalogName); - - if (docbookCatalog == null) { - throw new IllegalStateException("Docbook catalog " + docbookCatalogName + " could not be found in " + classLoader); - } - - builder.append(docbookCatalog.toExternalForm()); - - Enumeration enumeration = classLoader.getResources("/catalog.xml"); - while (enumeration.hasMoreElements()) { - builder.append(';'); - URL resource = (URL) enumeration.nextElement(); - builder.append(resource.toExternalForm()); - } - String catalogFiles = builder.toString(); - manager.setCatalogFiles(catalogFiles); - return manager; - } -} - -/** - */ -class DocbookHtml extends Docbook { - - @Override - protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { - String rootFilename = outputFile.getName(); - rootFilename = rootFilename.substring(0, rootFilename.lastIndexOf('.')); - transformer.setParameter("root.filename", rootFilename); - transformer.setParameter("base.dir", outputFile.getParent() + File.separator); - } -} - -/** - */ -class DocbookFoPdf extends Docbook { - - /** - * From the FOP usage guide - */ - @Override - protected void postTransform(File foFile) { - FopFactory fopFactory = FopFactory.newInstance(); - - OutputStream out = null; - final File pdfFile = getPdfOutputFile(foFile); - logger.debug("Transforming 'fo' file " + foFile + " to PDF: " + pdfFile); - - try { - out = new BufferedOutputStream(new FileOutputStream(pdfFile)); - - Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); - - TransformerFactory factory = TransformerFactory.newInstance(); - Transformer transformer = factory.newTransformer(); - - Source src = new StreamSource(foFile); - - Result res = new SAXResult(fop.getDefaultHandler()); - - switch (project.gradle.startParameter.logLevel) { - case LogLevel.DEBUG: - case LogLevel.INFO: - break; - default: - // only show verbose fop output if the user has specified 'gradle -d' or 'gradle -i' - LoggerFactory.getILoggerFactory().getLogger('org.apache.fop').level = Level.ERROR - } - - transformer.transform(src, res); - - } finally { - if (out != null) { - out.close(); - } - } - - if (!foFile.delete()) { - logger.warn("Failed to delete 'fo' file " + foFile); - } - } - - private File getPdfOutputFile(File foFile) { - return new File(foFile.parent, this.project.rootProject.name + '-reference.pdf') - } -} diff --git a/buildSrc/docs.gradle b/buildSrc/docs.gradle deleted file mode 100644 index 5402c2d6a5..0000000000 --- a/buildSrc/docs.gradle +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -apply plugin: 'base' -apply from: "$rootDir/buildSrc/docbook.gradle" -apply from: "$rootDir/buildSrc/preconditions.gradle" - -description = "${rootProject.description} Documentation" - -task build(dependsOn: assemble) { - group = 'Build' - description = 'Builds reference and API documentation and archives' -} - - -/** - * Build aggregated JavaDoc HTML for all core project classes. Result is - * suitable for packaging into a distribution zip or viewing directly with - * a browser. - * - * @author Chris Beams - * @author Luke Taylor - * @see http://gradle.org/0.9-rc-1/docs/javadoc/org/gradle/api/tasks/javadoc/Javadoc.html - */ - task api(type: Javadoc) { - group = 'Documentation' - description = "Builds aggregated JavaDoc HTML for all core project classes." - - // this task is a bit ugly to configure. it was a user contribution, and - // Hans tells me it's on the roadmap to redesign it. - srcDir = file("${projectDir}/src/api") - destinationDir = file("${buildDir}/api") - tmpDir = file("${buildDir}/api-work") - optionsFile = file("${tmpDir}/apidocs/javadoc.options") - options.stylesheetFile = file("${srcDir}/spring-javadoc.css") - options.links = ["http://static.springframework.org/spring/docs/3.0.x/javadoc-api"] - options.overview = "${srcDir}/overview.html" - options.docFilesSubDirs = true - title = "${rootProject.description} ${version} API" - - // collect all the sources that will be included in the javadoc output - source javaprojects.collect {project -> - project.sourceSets.main.allJava - } - - // collect all main classpaths to be able to resolve @see refs, etc. - // this collection also determines the set of projects that this - // task dependsOn, thus the runtimeClasspath is used to ensure all - // projects are included, not just *dependencies* of all classes. - // this is awkward and took me a while to figure out. - classpath = files(javaprojects.collect {project -> - project.sourceSets.main.runtimeClasspath - }) - - // copy the images from the doc-files dir over to the target - doLast { task -> - copy { - from file("${task.srcDir}/doc-files") - into file("${task.destinationDir}/doc-files") - } - } -} - -/** - * Expand ${...} variables within docbook sources. This is a workaround - * accomodating the fact that the current docbook plugin has no way of - * parameterizing and replacing normal XML entities. - * - * Note that this task represents an implementation detail and it is - * unfortunate that it pollutes the listing of available tasks, e.g. - * during `gradle -t`. It's a good example of the need for 'task visibility' - - * a feature not yet implemented, but on the Gradle roadmap. - * - * @author Chris Beams - * @see http://jira.codehaus.org/browse/GRADLE-1026 - */ -task preprocessDocbookSources { - description = 'Expands ${...} variables within docbook sources.' - - doLast { - docbookSrcDir = file('src/reference/docbook') - docbookResourceDir = file('src/reference/resources/') - docbookWorkDir = file('build/reference-work') - - // copy everything but index.xml - copy { - into(docbookWorkDir) - from(docbookSrcDir) { exclude '**/index.xml' } - } - copy { - into(docbookWorkDir) - from(docbookResourceDir) - } - // copy index.xml and expand ${...} variables along the way - // e.g.: ${version} needs to be replaced in the header - copy { - into(docbookWorkDir) - from(docbookSrcDir) { include '**/index.xml' } - expand(version: "$version") - } - } -} - -// ----------------------------------------------------------------------------- -// Configure the three docbook* tasks that are added to the project by the -// 'docbook' plugin. -// ----------------------------------------------------------------------------- -task reference(dependsOn: [docbookHtml, docbookHtmlSingle, docbookPdf]) { - group = 'Documentation' - description = 'Generates all HTML and PDF reference documentation.' - - doLast { - // copy images and css into respective html dirs - ['html', 'htmlsingle'].each { dir -> - copy { - into "${buildDir}/reference/${dir}/images" - from "src/reference/resources/images" - } - copy { - into "${buildDir}/reference/${dir}/css" - from "src/reference/resources/css" - } - } - } -} - -[docbookHtml, docbookPdf, docbookHtmlSingle]*.sourceFileName = 'index.xml'; -[docbookHtml, docbookHtmlSingle, docbookPdf]*.dependsOn preprocessDocbookSources - -docbookHtml.stylesheet = file('src/reference/resources/xsl/html-custom.xsl') -docbookHtmlSingle.stylesheet = file('src/reference/resources/xsl/html-single-custom.xsl') -docbookPdf.stylesheet = file('src/reference/resources/xsl/pdf-custom.xsl') -def imagesDir = file('src/reference/resources/images'); -docbookPdf.admonGraphicsPath = "${imagesDir}/admon/" - - -/** - * - * @see http://www.gradle.org/0.9-preview-3/docs/userguide/userguide_single.html#sec:copying_files - * @see http://www.gradle.org/0.9-preview-3/docs/javadoc/org/gradle/api/file/CopySpec.html - */ -docsSpec = copySpec { - into("${version}") { - from('src/info/changelog.txt') - } - - into("${version}/api") { - from(api.destinationDir) - } - - into("${version}/reference") { - from("${buildDir}/reference") - } -} - -task archive(type: Zip, dependsOn: [api, reference]) { - group = "Documentation" - description = "Creates a zip archive of reference and API documentation." - - baseName = rootProject.name + '-docs' - - // drop it right in the root of the build dir for simplicity - destinationDir = buildDir - - // use the copy spec above to specify the contents of the zip - with docsSpec -} - -configurations { archives } -artifacts { archives archive } - -configurations { scpAntTask } -dependencies { - scpAntTask("org.apache.ant:ant-jsch:1.8.1") -} - -checkForProps(taskPath: project.path + ':uploadArchives', requiredProps: ['sshHost', 'sshUsername', 'sshPrivateKey', 'remoteDocRoot']) - -if (role == 'buildmaster') { - uploadArchives { - def docsPath = "${rootProject.name}/docs" - def docsUrl = "http://${sshHost}/${docsPath}/${version}" - def remoteDocsDir = "${remoteDocRoot}/${docsPath}/" - def fqRemoteDir = "${sshUsername}@${sshHost}:${remoteDocsDir}" - - group = 'Buildmaster' - - description = "Uploads and unpacks documentation archive" + (sshHost ? " to ${docsUrl}" : ": Host is not specified") - - uploadDescriptor = false - - repositories { - add(new org.apache.ivy.plugins.resolver.SshResolver()) { - name = 'sshHost: ' + sshHost // used for debugging - host = sshHost - user = sshUsername - if (project.hasProperty('sshPrivateKey')) { - keyFile = sshPrivateKey as File - } - addArtifactPattern "${remoteDocsDir}/${archive.archiveName}" - } - } - - configurations { scpAntTask } - dependencies { scpAntTask 'org.apache.ant:ant-jsch:1.8.1' } - - doFirst { - println "Uploading: ${archive.archivePath} to ${fqRemoteDir}" - } - - doLast { - project.ant { - taskdef(name: 'sshexec', - classname: 'org.apache.tools.ant.taskdefs.optional.ssh.SSHExec', - classpath: configurations.scpAntTask.asPath) - - // copy the archive, unpack it, then delete it - def unpackCommand = """ - cd ${remoteDocsDir} && - rm -rf ${version} && - unzip -qKo ${archive.archiveName} && - rm ${archive.archiveName} - """ - - def wildcardSymlinkCommand = """ - cd ${remoteDocsDir} && - if [ -e ${version.wildcardValue} ]; then - currentWildcard=`readlink ${version.wildcardValue}` - else - currentWildcard=-1 - fi && - if [[ ${version} > \$currentWildcard ]]; then - rm -f ${version.wildcardValue} && - ln -s ${version} ${version.wildcardValue} - fi - """ - - def latestGASymlinkCommand = """ - cd ${remoteDocsDir} && - if [ -e latest-ga ]; then - latestGa=`readlink latest-ga` - else - latestGa=-1 - fi && - if [[ ${version} > \$latestGa ]]; then - rm -f latest-ga && - ln -s ${version} latest-ga - fi - """ - - println "Unpacking docs archive: ${unpackCommand}" - sshexec(host: sshHost, username: sshUsername, keyfile: sshPrivateKey, command: unpackCommand) - if (version.releaseType != 'SNAPSHOT') { - println "Creating wildcard symlink: ${wildcardSymlinkCommand}" - sshexec(host: sshHost, username: sshUsername, keyfile: sshPrivateKey, command: wildcardSymlinkCommand) - } - if (version.releaseType == 'RELEASE') { - println "Creating latest-ga symlink: ${latestGASymlinkCommand}" - sshexec(host: sshHost, username: sshUsername, keyfile: sshPrivateKey, command: latestGASymlinkCommand) - } - println "UPLOAD SUCCESSFUL - validate by visiting ${docsUrl}" - } - } - } -} diff --git a/buildSrc/maven-deployment.gradle b/buildSrc/maven-deployment.gradle deleted file mode 100644 index ef8da58e31..0000000000 --- a/buildSrc/maven-deployment.gradle +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -// ----------------------------------------------------------------------------- -// Tasks related to deploying Maven artifacts. -// -// @author Chris Beams -// ----------------------------------------------------------------------------- - -// check that upload-related properties are defined and fail early if not -// these properties ('s3AccessKey', etc) should be defined in -// 'gradle.properties' in $HOME/.gradle/gradle.properties -apply from: "$rootDir/buildSrc/preconditions.gradle" -def requiredProps = ['mavenSyncRepoDir', 's3AccessKey', 's3SecretAccessKey'] -checkForProps(taskPath: project.path + ':uploadArchives', requiredProps: requiredProps) - -/** - * Builds a source jar artifact for all main java sources. - * - * @author Luke Taylor - */ -task sourceJar(type: Jar) { - description = 'Builds a source jar artifact suitable for maven deployment.' - classifier = 'sources' - from sourceSets.main.java -} -build.dependsOn sourceJar - -jar.destinationDir = project.libsBinDir -sourceJar.destinationDir = project.libsSrcDir - -// Add the source jar archive to the set of artifacts for this project. -// Note that the regular 'jar' archive is already added by default. -artifacts { - archives sourceJar -} - - -/** - * Deploy gradle-built artifacts to a remote maven repository. Overrides and - * further customizes the 'uploadArchives' task contributed by the 'maven' - * plugin. - * - * The repository that artifacts are deployed to is determined conditionally - * based on the release type of the project version. Snapshot builds will - * be deployed via s3 to the springframework maven snapshot repository; - * milestone builds will happen via s3 as well; release builds will be deployed - * to the local filesystem to be sync'd via sourceforge SVN and ultimately - * deployed to maven central. - * - * Gradle will generate Maven poms on-the-fly during the deployment process. - * This process is customized to add ASL license information, and for projects - * that have the erlangLicense property set to true, the Erlang License will be - * added to the pom as well. - * - * @author Chris Beams - * @see 'mavenSyncRepoDir' in gradle.properties - * @see 's3AccessKey' in gradle.properties - * @see 's3SecretAccessKey' in gradle.properties - * @see `gradle install` for deploying artifacts to the local .m2 cache - * @see http://maven.apache.org/guides/mini/guide-central-repository-upload.html - */ -uploadArchives { - group = 'Buildmaster' - description = "Does a maven deploy of archives artifacts to " // url appended below - - // add a configuration with a classpath that includes our s3 maven deployer - configurations { deployerJars } - dependencies { - deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" - } - - // bring up a deployer and push to the appropriate repo for this release type - // note that repository and snapshotRepository are the same - it doesn't matter - // if it is actually a BUILD-SNAPSHOT, the snapshotRepository will kick in, - // otherwise it is ignored. - repositories.mavenDeployer { deployer -> - def repositoryUrl = 's3://maven.springframework.org/' + version.releaseType.toString().toLowerCase() - - description += repositoryUrl - configuration = configurations.deployerJars - s3credentials = [userName: project.properties.s3AccessKey, - passphrase: project.properties.s3SecretAccessKey] - repository(url: repositoryUrl) { authentication(s3credentials) } - snapshotRepository(url: repositoryUrl) { authentication(s3credentials) } - - configurePom(deployer.pom) - } - - if (version.releaseType == 'RELEASE') { - // we're dealing with a GA release (RELEASE), so bring up a second - // maven deployer and deploy to the maven sync repository filesystem - // location. The SVN commit must be done manually after the build. - repositories.mavenDeployer { deployer -> - repository(url: "file://${project.properties.mavenSyncRepoDir}") - - configurePom(deployer.pom) - } - } -} - - -/** - * Install gradle-built artifacts to the local m2 maven cache. - * Further customizes the 'install' task contributed by the 'maven' plugin. - */ -install { - group = 'Build' - description = "Does a maven install of archives artifacts to local m2 cache" - - configurePom(repositories.mavenInstaller.pom) -} - - -/** - * Generate a Maven pom.xml for use at build time. Dependency information will - * be based on Gradle metadata for the project, and other customizations such - * as licensing information and source compatibility settings are configured - * within. - * - * @author Chris Beams - * @see http://gradle.org/0.9-preview-3/docs/userguide/userguide_single.html#pomBuilder - */ -task generatePom { - group = 'Build' - description = 'Generates a Maven POM file suitable for use in building the project' - - generatedPomFileName = "pom.xml" - - // ensure changes in the classpath trigger regeneration of poms - inputs.files(project.sourceSets.main.compileClasspath) - - // ensure version changes in gradle.properties trigger regeneration of poms - inputs.files(new File(project.rootProject.rootDir, Project.GRADLE_PROPERTIES)) - - // enable partial cleaning with `gradle cleanGeneratePom` - outputs.files(generatedPomFileName) - - doLast() { - // customize the pom creation process - p = pom { - project { - name = project.description - properties { - setProperty('project.build.sourceEncoding', 'UTF8') - } - build { - plugins { - plugin { - groupId = 'org.apache.maven.plugins' - artifactId = 'maven-compiler-plugin' - configuration { - source = '1.5' - target = '1.5' - } - } - plugin { - groupId = 'org.apache.maven.plugins' - artifactId = 'maven-surefire-plugin' - configuration { - includes { - include = '**/*Tests.java' - } - excludes { - exclude = '**/*Abstract*.java' - } - } - } - } - resources { - resource { - directory = 'src/main/java' - includes = ['**/*'] - excludes = ['**/*.java'] - } - resource { - directory = 'src/main/resources' - includes = ['**/*'] - } - } - testResources { - testResource { - directory = 'src/test/java' - includes = ['**/*'] - excludes = ['**/*.java'] - } - testResource { - directory = 'src/test/resources' - includes = ['**/*'] - } - } - } - } - } - - // customizing the artifact id is a special case that must be configured - // after the pom is fully configured, otherwise it'll be overwritten - p.whenConfigured { pom -> pom.artifactId = project.name } - - configurePom(p) - - // write the pom.xml file out to the filesystem - p.writeTo(generatedPomFileName) - } - - // ensure that pom generation happens every time resources are processed - // (which practically means any time a build happens). if the dependencies - // for the project have been updated (in $rootDir/build.gradle), the pom - // will have diffs in it and the developer will be reminded to check in - // the change during the next commit cycle. - //processResources.dependsOn generatePom -} - - -/** - * Read dynamic 'optional' and 'provided' properties from gradle dependencies - * and translate them to their maven POM equivalents. - */ -def configurePom(def pom) { - pom.whenConfigured { generatedPom -> - def optionalDeps = configurations.testRuntime.allDependencies.findAll { gradleDep -> - gradleDep.asDynamicObject.hasProperty('optional') && gradleDep.optional - } - def providedDeps = configurations.testRuntime.allDependencies.findAll { gradleDep -> - gradleDep.asDynamicObject.hasProperty('provided') && gradleDep.provided - } - generatedPom.dependencies.each { mavenDep -> - mavenDep.optional = optionalDeps.any { optionalDep -> - optionalDep.group == mavenDep.groupId && - optionalDep.name == mavenDep.artifactId && - optionalDep.version == mavenDep.version - } - boolean isProvided = providedDeps.any { providedDep -> - providedDep.group == mavenDep.groupId && - providedDep.name == mavenDep.artifactId && - providedDep.version == mavenDep.version - } - if (isProvided) { - mavenDep.scope = 'provided' - } - } - } - - pom.project { - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - } -} diff --git a/buildSrc/maven-root-pom.gradle b/buildSrc/maven-root-pom.gradle deleted file mode 100644 index 0658e46e3a..0000000000 --- a/buildSrc/maven-root-pom.gradle +++ /dev/null @@ -1,65 +0,0 @@ - -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -/** - * Generate a root Maven pom.xml for use at build time. Contains nothing other - * than a 'modules' section aggregating child projects. This pom will never be - * installed locally or deployed remotely. Child projects will not explicitly - * declare this pom as their parent, given than nothing need be inherited from - * it. - * - * @author Chris Beams - * @see maven-deployment.gradle for per-project generatePom task - */ -task generatePom { - apply plugin: 'maven' - group = 'Build' - description = 'Generates a root Maven pom for convenience.' - - generatedPomFileName = "pom.xml" - - // ensure version changes in gradle.properties trigger regeneration of root pom - inputs.files(new File(project.rootProject.rootDir, Project.GRADLE_PROPERTIES)) - - // enable partial cleaning with `gradle cleanGeneratePom` - outputs.files(generatedPomFileName) - - doLast() { - // customize the pom creation process - p = pom { - project { - name = project.description - packaging = 'pom' - modules = javaprojects.collect { project -> project.name } - } - } - - // customizing the artifact id is a special case that must be configured - // after the pom is fully configured, otherwise it'll be overwritten - p.whenConfigured { pom -> pom.artifactId = project.name } - - // write the pom.xml file out to the filesystem - p.writeTo(generatedPomFileName) - } - - // ensure that pom generation happens every time resources are processed - // (which practically means any time a build happens). if the dependencies - // for the project have been updated (in $rootDir/build.gradle), the pom - // will have diffs in it and the developer will be reminded to check in - // the change during the next commit cycle. - //processResources.dependsOn generatePom -} diff --git a/buildSrc/preconditions.gradle b/buildSrc/preconditions.gradle deleted file mode 100644 index e5f0b0fa34..0000000000 --- a/buildSrc/preconditions.gradle +++ /dev/null @@ -1,19 +0,0 @@ - -def requiredPropSets = [] - -gradle.taskGraph.whenReady { graph -> - requiredPropSets.each { args -> - if (graph.hasTask(args.taskPath)) { - def missingProps = args.requiredProps.findAll { prop -> - !project.hasProperty(prop) - } - if (missingProps) { - throw new GradleException("For executing the ${args.taskPath} task you need to set all ${missingProps} properties") - } - } - } -} -project.checkForProps = { Map args -> - requiredPropSets.add args -} - diff --git a/buildSrc/schema-publication.gradle b/buildSrc/schema-publication.gradle deleted file mode 100644 index f0483f8759..0000000000 --- a/buildSrc/schema-publication.gradle +++ /dev/null @@ -1,63 +0,0 @@ -apply from: "$rootDir/buildSrc/preconditions.gradle" - -checkForProps(taskPath: project.path + ':publishSchema', - requiredProps: ['sshHost', 'sshUsername', 'sshPrivateKey', 'remoteDocRoot']) - -configurations { scpAntTask } -dependencies { scpAntTask("org.apache.ant:ant-jsch:1.8.1") } - -/** - * @author Chris Beams - */ -task publishSchema << { - def props = new Properties() - def file = new File("${projectDir}/src/main/resources/META-INF/spring.schemas") - if (file.exists()) { - file.withInputStream { - stream -> props.load(stream) - } - } - - if (!props.size()) { - return - } - - project.ant { - taskdef(name: 'scp', - classname: 'org.apache.tools.ant.taskdefs.optional.ssh.Scp', - classpath: configurations.scpAntTask.asPath) - taskdef(name: 'sshexec', - classname: 'org.apache.tools.ant.taskdefs.optional.ssh.SSHExec', - classpath: configurations.scpAntTask.asPath) - - for (def key : props.keySet()) { - // process only explicitly-versioned entries in the file - // we'll deal with symlinking to the latest released version - // later below - // e.g.: - // spring-integration-2.0.xsd - // but not: - // spring-integration.xsd - if (key =~ /\d\.xsd/) { - // key entries are formatted as http://www.springframework.org/schema/... - // strip the protocol and domain, leaving just the path from 'schema' on - def remotePath = key.substring(key.indexOf('schema/')) - sshexec(keyfile: sshPrivateKey, - host: sshHost, - username: sshUsername, - command: "mkdir -p `dirname ${remoteDocRoot}/${remotePath}`") - scp(keyfile: sshPrivateKey, - file: "src/main/resources/${props.get(key)}", - todir: "${sshUsername}@${sshHost}:${remoteDocRoot}/${remotePath}") - } - } - } - - /* - def firstKey = props.keySet().iterator().next() - def path = firstKey.substring(firstKey.indexOf('schema/')) - def symlinkPath = (path =~ /-\d\.\d/).replaceFirst('') - - println "sshexec ln -s wtf ${symlinkPath}" - */ -} diff --git a/buildSrc/src/main/groovy/org/springframework/build/Version.groovy b/buildSrc/src/main/groovy/org/springframework/build/Version.groovy deleted file mode 100644 index e021592920..0000000000 --- a/buildSrc/src/main/groovy/org/springframework/build/Version.groovy +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -package org.springframework.build - -import org.gradle.api.InvalidUserDataException - - -class Version { - /** - * Indicates whether a version is a release, milestone, or snapshot - */ - static final String RELEASE = 'RELEASE' - static final String MILESTONE = 'MILESTONE' - static final String SNAPSHOT = 'SNAPSHOT' - - String value - String releaseType - int majorVersion - int minorVersion - - /** - * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE - */ - public Version(String value) { - this.value = value; - this.releaseType = releaseTypeFor(value); - this.majorVersion = Integer.parseInt(this.value.substring(0, this.value.indexOf('.'))); - String afterMajor = this.value.substring(this.value.indexOf('.') + 1); - this.minorVersion = Integer.parseInt(afterMajor.substring(0, afterMajor.indexOf('.'))); - } - - public int getMajorVersion() { - return this.majorVersion; - } - - public int getMinorVersion() { - return this.minorVersion - } - - /** - * @return 1.0.x style - */ - public String getWildcardValue() { - return majorVersion + '.' + minorVersion + '.x'; - } - - /** - * @return the version string returned by {@link getValue ( )} - */ - public String toString() { - return this.getValue(); - } - - /** - * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE - */ - public static String releaseTypeFor(String version) { - if (version.endsWith("RELEASE")) return RELEASE; - if (version.endsWith("SNAPSHOT")) return SNAPSHOT; - if (version.matches(".*\\.M[0-9]+\$")) return MILESTONE; - if (version.matches(".*\\.RC[0-9]+\$")) return MILESTONE; - - throw new InvalidUserDataException("unknown version scheme: " + - "versions must end in (SNAPSHOT|M[0-9]+|RC[0-9]+|RELEASE), " + - "but got (" + version + ")"); - } -} diff --git a/buildSrc/src/main/groovy/org/springframework/build/bundlor/BundlorPlugin.groovy b/buildSrc/src/main/groovy/org/springframework/build/bundlor/BundlorPlugin.groovy deleted file mode 100644 index f385bf1f67..0000000000 --- a/buildSrc/src/main/groovy/org/springframework/build/bundlor/BundlorPlugin.groovy +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -package org.springframework.build.bundlor - -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.plugins.JavaPlugin -import org.gradle.api.logging.LogLevel - - -/** - * Contribute a 'bundlor' task capable of creating an OSGi manifest. Task is tied - * to the lifecycle by having the 'jar' task depend on 'bundlor'. Applies the 'java' - * plugin to the project if it has not already been applied. - * - * @author Chris Beams - * @author Luke Taylor - * @see http://www.springsource.org/bundlor - * @see http://static.springsource.org/s2-bundlor/1.0.x/user-guide/html/ch04s02.html - */ -public class BundlorPlugin implements Plugin { - - public void apply(Project project) { - // bundlor plugin functionality only makes sense for java projects - // if the java plugin is already applied, the following is a no-op - project.getPlugins().apply(JavaPlugin.class) - - // configuration that will be used when creating the ant taskdef classpath - project.configurations { bundlorconf } - project.dependencies { - bundlorconf 'com.springsource.bundlor:com.springsource.bundlor.ant:1.0.0.RELEASE', - 'com.springsource.bundlor:com.springsource.bundlor:1.0.0.RELEASE', - 'com.springsource.bundlor:com.springsource.bundlor.blint:1.0.0.RELEASE' - } - - project.tasks.add("bundlor") { - dependsOn project.compileJava - description = 'Generates an OSGi-compatibile MANIFEST.MF file.' - - /* TODO - // prescriptive defaults - bundleName = project.description - bundleVersion = project.version - bundleVendor = 'SpringSource' - //TODO bundleSymbolicName = project.basePackage - bundleSymbolicName = 'replace-me-with-base-package' - bundleManifestVersion = '2' - */ - - def template = new File(project.projectDir, 'template.mf') - def bundlorDir = new File("${project.buildDir}/bundlor") - def manifest = new File("${bundlorDir}/META-INF/MANIFEST.MF") - - // inform gradle what directory this task writes so that - // it can be removed when issuing `gradle cleanBundlor` - outputs.dir bundlorDir - - // incremental build configuration - // if the manifest output file already exists, the bundlor - // task will be skipped *unless* any of the following are true - // * template.mf has been changed - // * main classpath dependencies have been changed - // * main java sources for this project have been modified - outputs.files manifest - inputs.files template, project.sourceSets.main.runtimeClasspath - - // the bundlor manifest should be evaluated as part of the jar task's - // incremental build - project.jar { - dependsOn 'bundlor' - inputs.files manifest - } - - project.jar.manifest.from manifest - - doFirst { - project.ant.taskdef( - resource: 'com/springsource/bundlor/ant/antlib.xml', - classpath: project.configurations.bundlorconf.asPath) - - // the bundlor ant task writes directly to standard out - // redirect it to INFO level logging, which gradle will - // deal with gracefully - logging.captureStandardOutput(LogLevel.INFO) - - // TODO tell the jar task to use bundlor manifest instead of the default - // and customize it with all common headers - //project.jar.manifest { - //from manifest - //attributes['Bundle-SymbolicName'] = bundleSymbolicName - //attributes['Bundle-Name'] = bundleName - //attributes['Bundle-Vendor'] = bundleVendor - //attributes['Bundle-Version'] = bundleVersion - //attributes['Bundle-ManifestVersion'] = bundleManifestVersion - //} - - // the ant task will throw unless this dir exists - if (!bundlorDir.isDirectory()) - bundlorDir.mkdir() - - // execute the ant task, and write out the manifest file - project.ant.bundlor( - inputPath: project.sourceSets.main.classesDir, - outputPath: bundlorDir, - manifestTemplatePath: template) { - property(name: 'version', value: project.version) - } - } - } - } -} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/bundlor.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/bundlor.properties deleted file mode 100644 index 4a1b85d2ad..0000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/bundlor.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.springframework.build.bundlor.BundlorPlugin diff --git a/buildSrc/wrapper.gradle b/buildSrc/wrapper.gradle deleted file mode 100644 index 0abbb5ea3e..0000000000 --- a/buildSrc/wrapper.gradle +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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. - */ - -/** - * Generate gradlew and gradlew.bat scripts and associated files. These - * convenience scripts allow users to operate the build without being forced to - * download and install gradle. - * - * @author Chris Beams - * @see http://gradle.org/0.9.1/docs/userguide/userguide_single.html#gradle_wrapper - */ -task wrapper(type: Wrapper) { - group = 'Buildmaster' - description = "Generates gradlew and gradlew.bat bootstrap scripts" - gradleVersion = '0.9.2' - urlRoot='http://gradle.artifactoryonline.com/gradle/distributions' - // place jar file and properties into a - // subdirectory to avoid root dir clutter - jarPath = 'buildSrc/wrapper' -} diff --git a/buildSrc/wrapper/gradle-wrapper.jar b/buildSrc/wrapper/gradle-wrapper.jar deleted file mode 100644 index 8acea11e611c2854f62846ca42c16b8717ac9951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13330 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