view src/main/groovy/org/ssdt_ohio/gradle/plugins/VersionClassPlugin.groovy @ 2:4db19f1c5ad0

create ProjectVersion as instance instead of static. Add build info to jar manifest
author smith@nwoca.org
date Fri, 18 May 2012 18:21:13 +0100
parents c51874d4a5a7
children 1756755e4e71
line wrap: on
line source
package org.ssdt_ohio.gradle.plugins

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.GroovyPlugin

class VersionClassPlugin implements Plugin<Project> {

    def void apply(Project project) {
        project.getPlugins().apply(GroovyPlugin.class)
        def genSrc = 'generated-src/version'
        def generatedSrcDir = new File(project.buildDir, genSrc)

        def makeVersionClassTask = project.task('makeVersionClass') << {

            def now = new Date().format('yyyy-MM-dd hh:mm:ss')

            def buildNumber = -1
            if (project.rootProject?.file('build-number.txt').exists()) {
                def props = new Properties()
                project.rootProject?.file('build-number.txt').withInputStream {stream ->
                    props.load(stream)
                }
                buildNumber = props['build.number']
            }

            def targetPackage = getTargetClass(project)

            def outFile = new File(generatedSrcDir, targetPackage.replaceAll('\\.', "/") + "/ProjectVersion.groovy")

            outFile.getParentFile().mkdirs()
            logger.info("creating $targetPackage in $outFile")
            def f = new FileWriter(outFile)
            f.write("""
package $targetPackage
/**
 * Generated by gradle build. $now ($buildNumber)
 * @version ${project.version}
 */
public class ProjectVersion {

    final String name = "${project.name}"
    final String group = "${project.group}"
    final String version = "${project.version}"
    final String buildDate = "$now"
    final int buildNumber = $buildNumber

    String getFullVersion() {
        "\$version \$buildDate (#\$buildNumber)"
    }

    String getId() {
        "\$group:\$name:\$version"
    }

    String toString() {
        "\$id \$buildDate (#\$buildNumber)"
    }
}
""")
            f.close()
        }

        project.sourceSets {
            main {
                groovy {
                    srcDir project.buildDir.name + '/' + genSrc
                }
            }
        }

        makeVersionClassTask.getInputs().files(project.sourceSets.main.getAllSource())
        makeVersionClassTask.getOutputs().files(generatedSrcDir)
        if (project.getBuildFile() != null && project.getBuildFile().exists()) {
            makeVersionClassTask.getInputs().files(project.getBuildFile())
        }
        project.getTasks().getByName('compileGroovy').dependsOn('makeVersionClass')

        project.getTasks().getByName('jar').manifest.attributes(
                [
                        "Specification-Title": project.name,
                        "Specification-Version": project.version,
                        "Specification-Vendor": project.group,
                        "Implementation-Title": project.name,
                        "Implementation-Version": project.version,
                        "Implementation-Vendor": project.group,
                        "Built-By": System.properties['user.name'],
                        "Build-Jdk": System.properties['java.version'],
                        "Build-Time":  new Date().format('yyyy-MM-dd hh:mm:ss'),

                ]
        )


    }



    private getTargetClass(project) {
        def source = project.sourceSets.main.groovy.getSrcDirTrees()
        def files = project.sourceSets.main.groovy as File[]
        def targetDir = files.first().parentFile.toString()

        def targetPackage = targetDir
        source.each {
            targetPackage -= it.getDir().getPath().toString()
        }
        targetPackage = targetPackage.replaceAll("\\\\", '.').replaceAll('/', '.')
        targetPackage = targetPackage.startsWith(".") ? targetPackage - "." : targetPackage

        return targetPackage

    }

}