/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
apply from: rootProject.file( 'gradle/base-information.gradle' )

apply plugin: 'idea'
apply plugin: 'distribution'

idea.module {
}

final File documentationDir = mkdir( "${project.buildDir}/documentation" );

/**
 * Assembles all documentation into the {buildDir}/documentation directory.
 *
 * Depends on building the docs
 */
task assembleDocumentation(type: Task, dependsOn: [rootProject.project( 'documentation' ).tasks.buildDocsForPublishing]) {
    description = 'Assembles all documentation into the {buildDir}/documentation directory'

    doLast {
        // copy documentation outputs into target/documentation.
        // 		* this is used in building the dist bundles
		//		* it is also used as a base to build a staged directory for documentation upload

        // Integrations Guide
        copy {
            from "${rootProject.project( 'documentation' ).buildDir}/asciidoc/integrationguide"
            into "${documentationDir}/integrationguide"
        }

        // Getting-started Guide
        copy {
            from "${rootProject.project( 'documentation' ).buildDir}/asciidoc/quickstart"
            into "${documentationDir}/quickstart"
        }

        // Topical Guide
        copy {
            from "${rootProject.project( 'documentation' ).buildDir}/asciidoc/topical"
            into "${documentationDir}/topical"
        }

        // User Guide
        copy {
            from "${rootProject.project( 'documentation' ).buildDir}/asciidoc/userguide"
            into "${documentationDir}/userguide"
        }

        // Aggregated JavaDoc
        copy {
            from "${rootProject.project( 'documentation' ).buildDir}/javadocs"
            into "${documentationDir}/javadocs"
        }
    }
}

/**
 * Upload the documentation to the JBoss doc server
 */
task uploadDocumentation(type:Exec, dependsOn: assembleDocumentation) {
    description = "Uploads documentation to the JBoss doc server"

    final String url = "filemgmt.jboss.org:/docs_htdocs/hibernate/orm/${rootProject.hibernateMajorMinorVersion}";

    executable 'rsync'
    args '-avz', '--links', '--protocol=28', "${documentationDir.absolutePath}/", url

    doFirst {
        if ( version.endsWith( "SNAPSHOT" ) ) {
            logger.error( "Cannot perform upload of SNAPSHOT documentation" );
            throw new RuntimeException( "Cannot perform upload of SNAPSHOT documentation" );
        }
        else {
            logger.lifecycle( "Uploading documentation [{$url}]..." )
        }
    }

    doLast {
        logger.lifecycle( 'Done uploading documentation' )
    }
}


/**
 * Configuration of the distribution plugin, used to build release bundle as both ZIP and TGZ
 */
distributions {
    main {
        baseName = 'hibernate-release'
        contents {
            from rootProject.file( 'lgpl.txt' )
            from rootProject.file( 'changelog.txt' )
            from rootProject.file( 'hibernate_logo.gif' )

            into('lib/required') {
                from parent.project( 'hibernate-core' ).configurations.provided.files { dep -> dep.name == 'jta' }
                from parent.project( 'hibernate-core' ).configurations.runtime
                from parent.project( 'hibernate-core' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
                // for now,
                from parent.project( 'hibernate-core' ).configurations.provided.files { dep -> dep.name == 'javassist' }
            }

//            into( 'lib/jpa' ) {
//                from parent.project( 'hibernate-entitymanager' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
//            }

            into( 'lib/spatial' ) {
                from(
                        ( parent.project( 'hibernate-spatial' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
                                + parent.project( 'hibernate-spatial' ).configurations.runtime )
                                - parent.project( 'hibernate-core' ).configurations.runtime
                                - parent.project( 'hibernate-core' ).configurations.archives.allArtifacts.files
                )
            }

            into( 'lib/jpa-metamodel-generator' ) {
                from parent.project( 'hibernate-jpamodelgen' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
            }

            into( 'lib/envers' ) {
                from(
                        ( parent.project( 'hibernate-envers' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
                                + parent.project( 'hibernate-envers' ).configurations.runtime )
                                - parent.project( 'hibernate-core' ).configurations.runtime
                                - parent.project( 'hibernate-core' ).configurations.archives.allArtifacts.files
                )
            }

            into( 'lib/osgi' ) {
                from(
                        ( parent.project( 'hibernate-osgi' ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
                                + parent.project( 'hibernate-osgi' ).configurations.runtime )
                                - parent.project( 'hibernate-core' ).configurations.runtime
                                - parent.project( 'hibernate-core' ).configurations.archives.allArtifacts.files
                )
                from(
                        parent.project( 'hibernate-osgi' ).extensions.karafFeatures.featuresXmlFile
                )
            }

            // todo : this closure is problematic as it does not write into the hibernate-release-$project.version directory
            // due to http://issues.gradle.org/browse/GRADLE-1450
            [ 'hibernate-c3p0', 'hibernate-proxool', 'hibernate-ehcache' ].each { feature ->
                final String shortName = feature.substring( 'hibernate-'.length() )
// WORKAROUND http://issues.gradle.org/browse/GRADLE-1450
//                into('lib/optional/' + shortName) {
                owner.into('lib/optional/' + shortName) {
                    from (
                            ( parent.project( feature ).configurations.archives.allArtifacts.files.filter{ file -> !file.name.endsWith('-sources.jar') }
                                    + parent.project( feature ).configurations.runtime )
                                    - parent.project( 'hibernate-core' ).configurations.runtime
                                    - parent.project( 'hibernate-core' ).configurations.archives.allArtifacts.files
                    )
                }
            }

            into('documentation') {
                from documentationDir
            }

            into( 'project' ) {
                from ( rootProject.projectDir ) {
                    exclude( '.git' )
                    exclude( '.gitignore' )
                    exclude( 'changelog.txt' )
                    exclude( 'lgpl.txt' )
                    exclude( 'hibernate_logo.gif' )
                    exclude( 'tagRelease.sh' )
                    exclude( 'gradlew' )
                    exclude( 'gradlew.bat' )
                    exclude( 'wrapper/*' )
                    exclude( '**/.gradle/**' )
                    exclude( '**/target/**' )
                    exclude( '.idea' )
                    exclude( '**/*.ipr' )
                    exclude( '**/*.iml' )
                    exclude( '**/*.iws' )
                    exclude( '**/atlassian-ide-plugin.xml' )
                    exclude( '**/.classpath' )
                    exclude( '**/.project' )
                    exclude( '**/.settings' )
                    exclude( '**/.nbattrs' )
                    exclude( '**/out/**' )
                }
            }
        }
    }
}

distZip.dependsOn assembleDocumentation
distTar.dependsOn assembleDocumentation
distTar {
    compression = Compression.GZIP
}

/**
 * "virtual" task for building both types of dist bundles
 */
task buildBundles(type: Task, dependsOn: [distZip,distTar]) {
    description = "Builds all release bundles"
}

task uploadBundlesSourceForge(type: Exec, dependsOn: buildBundles) {
    description = "Uploads release bundles to SourceForge"

    final String url = "frs.sourceforge.net:/home/frs/project/hibernate/hibernate-orm/${version}";

    executable 'rsync'
    args '-vr', '-e ssh', "${project.buildDir}/distributions/", url

    doFirst {
        if ( version.endsWith( "SNAPSHOT" ) ) {
            logger.error( "Cannot perform upload of SNAPSHOT bundles to SourceForge" );
            throw new RuntimeException( "Cannot perform upload of SNAPSHOT bundles to SourceForge" )
        }
        else {
            logger.lifecycle( "Uploading release bundles to SourceForge..." )
        }
    }

    doLast {
        logger.lifecycle( 'Done uploading release bundles to SourceForge' )
    }
}

configurations {
    bundles {
        description = 'Configuration used to group the archives output from the distribution plugin.'
    }
}

artifacts {
    bundles distTar
    bundles distZip
}

task release( dependsOn: uploadBundlesSourceForge )