/*
 * 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.
 */

/**
 * Gradle script used to perform DM releases (really similar to Apache ACE build.xml)
 */
import aQute.bnd.build.Workspace

// Our release number, which has to be monotonically incremented each time we make a new release.
ext.dmRelease = "r9"

// Our Apache svn Staging repo
ext.svnStagingPath = "https://dist.apache.org/repos/dist/dev/felix"

// Our Apache svn Release repo
ext.svnReleasePath = "https://dist.apache.org/repos/dist/release/felix"

apply plugin: 'java'
apply from: file("rat.gradle")

// Add bnd as a build dependency
buildscript {
    dependencies {
        classpath files('cnf/gradle/biz.aQute.bnd.gradle.jar')
    }
}

// Configure RAT plugin to ignore some files
rat {
  excludes = [
    'rat-report.xml',
    '**/.git/**',
    '**/.gradle/**',
    '**/.project',
    '**/.settings/**',
    '**/*.iml',
    '**/*.iws',
    '**/*.ipr',
    '**/.classpath',
    'cnf/**',
    'gradle/wrapper/**',
    'release/**',
    'gradlew',
    'README',
    '**/DEPENDENCIES',
    '**/README',
    '**/.gitignore',
    '**/generated/**',
    'doc/**',
    '**/packageinfo',
    '**/*.txt',
    'docs/**',
    '.metadata/**'
  ]
}

// Setup the workspace
Workspace workspace
workspace = Workspace.getWorkspace(".")

task makeStaging << {
    description = 'Packages the source and binary distributions.'

    // Package source and source bin dependencies distributions.
    logger.lifecycle("    Packaging source distributions.")
    def topdir="org.apache.felix.dependencymanager-" + dmRelease
    ant.zip(destfile: "staging/"+topdir+'-src.zip') {
		zipfileset(dir: '../cnf', prefix: topdir+"-src/cnf", includes: ".project,.classpath,src/**,*.bnd,ext/**")
		zipfileset(dir: '..', prefix: topdir+"-src", includes: '*.gradle,*.properties')
		zipfileset(dir: 'resources/src', prefix: topdir+"-src", includes: '*')
		new File('.').eachFile { 
	    	if(new File(it, 'bnd.bnd').exists()) {	    		
    			def bndProject = workspace.getProject(it.name)
    			if (! bndProject.isNoBundles() && ! bndProject.getName().endsWith(".benchmark")) {
    		    	zipfileset(dir: "../${bndProject.name}", prefix: topdir+"-src/${bndProject.name}",
    			       		   includes: "*.gradle,.project,.classpath,.settings/**,src/**,test/**,*.bnd,*.bndrun,run-*/conf/**,resources/**,README*")
    			}
	   		}
		}
    }

    // Package binary dependencies, needed to build the source distributions.
    logger.lifecycle("    Packaging binary dependencies.")    
    ant.zip(destfile: "staging/"+topdir+"-deps.zip") {
    	ant.zipfileset(dir: '..', prefix: topdir+"-src", includes: 'gradlew')
    	ant.zipfileset(dir: '../gradle', prefix: topdir+"-src/gradle", includes: '**')    	
		ant.zipfileset(dir: 'resources/deps', prefix: topdir+"-src", includes: '*')
		ant.zipfileset(dir: '../cnf', prefix: topdir+"-src/cnf",
		    		   includes: 'buildrepo/**,localrepo/**,releaserepo/**,plugins/**,gradle/**')
    }

    // Package binaries as a simple collection of bundles. We use same license files as for src distrib.
    logger.lifecycle("    Packaging binary distribution.")

    // First, get list of latest released bundles available from our Release repository
    def released = []
    def releaseRepo = workspace.getRepository("Release")
    def bundles=releaseRepo.list(null)
    bundles.each {
	    def sortedVersions = releaseRepo.versions(it)
	    def latestVersion = sortedVersions.last()
	    def latestBundle = releaseRepo.get(it, latestVersion, null)
	    released << latestBundle
    }

    // Before adding all latest released bundles in the binary distribution, check if they contain proper license files.
	logger.lifecycle("    Checking META-INF mandatory files.")
    released.each { jarfile -> 
    	if (jarfile.isFile()) {
       		new ByteArrayOutputStream().withStream { os ->
				def result = exec {
	    			executable = 'jar'
	    			args = ['tf', jarfile, "META-INF"]
	    			standardOutput = os
				}
				def files = os.toString().split("\n")
				def mandatory = ["META-INF/LICENSE", "META-INF/NOTICE", "META-INF/DEPENDENCIES", "META-INF/changelog.txt"]
				mandatory.each { resource ->			
					if (! files.contains(resource)) {
						throw new GradleException("Missing mandatory license files in " + jarfile)
					}
				}
			}
		}
    }

    // Now, add all the latest released bundles in the binary distribution
    ant.zip(destfile: "staging/"+topdir+"-bin.zip") {
        // simply include all released bundle.
        released.each {
	    file=it
            ant.mappedresources() {
        	ant.filelist(files: file)
                ant.chainedmapper() {
                    ant.flattenmapper()
                    ant.globmapper(from: '*', to: topdir+'-bin/*')
                }
            }
        }
        ant.mappedresources() {
            ant.fileset(dir: 'resources/bin', includes: '*')
            ant.chainedmapper() {
                ant.flattenmapper()
                ant.globmapper(from: '*', to: topdir+'-bin/*')
            }
        }
    }
}

// Sign staging directory 
task signStaging << {
    description = 'Signs the local staging distribution.'
	fileTree("staging").visit { FileVisitDetails details -> 
		logger.lifecycle("    Signing " + details.file.path)
		ant.exec(executable: 'gpg', dir: 'staging') { 
	    	ant.arg(line: '--armor')
	    	ant.arg(line: '--output')
	    	ant.arg(line: details.file.name + ".asc")
	    	ant.arg(line: "--detach-sig")
	    	ant.arg(line: details.file.name)
		}

		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".md5") { 
	    	ant.arg(line: '--print-md')
	    	ant.arg(line: 'MD5')
	    	ant.arg(line: details.file.name)
		}

		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".sha") {
	    	ant.arg(line: '--print-md')
	    	ant.arg(line: 'SHA512')
	    	ant.arg(line: details.file.name)
		}
    }
}


// Moves the source and binary distributions to staging.
task commitToStaging << {
    description = 'Commits the local staging to the Apache svn staging repository.'
    getProject().exec { 
    	commandLine 'svn', 
		'import', 'staging', svnStagingPath + "/org.apache.felix.dependencymanager-" + dmRelease + "/", 
		'-m', "Staging Apache Felix Dependency Manager release " + dmRelease + "."
    }
}

// Promotes the staged distributions to release
task promoteToRelease << {
    description = 'Moves the staging repository to the Apache release repository.'

    // Move all artifacts from the staging repo to the release repo
    new ByteArrayOutputStream().withStream { os ->
		def result = exec {
	    	executable = 'svn'
	    	args = ['list', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease]
	    	standardOutput = os
		}
		def outputAsString = os.toString()

		outputAsString.split("\n").each { artifact -> 
	    	logger.lifecycle("    Moving " + artifact + " to release repository ...")
	    	getProject().exec { 
				commandLine 'svn',
				'move', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease + "/" + artifact , 
				svnReleasePath, '-m', "Releasing Apache Felix Dependency Manager release " + dmRelease + "."
	    	}
		}
    }

    // And remove the toplevel release path from the staging repo
    logger.lifecycle("    Removing org.apache.felix.dependencymanager-" + dmRelease + " from staging ...")    
    getProject().exec { 
    	commandLine 'svn',
		'rm', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease, "-m", 
		"Releasing Apache Felix Dependency Manager release " + dmRelease + "."
    }
}

// Removes the staged distributions from staging
task deleteFromStaging << {
    description = 'Cancels the staged distribution from the Apache staging repository.'
    getProject().exec { 
    	commandLine 'svn',
		'delete', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease + "/",
		"-m", "Removing Apache Felix Dependency Manager release " + dmRelease + " from staging."
    }
}

// Clean staging directory
task clean(overwrite: true) << { 
    new File("release/staging").deleteDir()
    new File("rat-report.xml").delete()
}

// Only clean the staging directory
task cleanStaging << {
    description = 'Clean the local staging directory.'
    new File("release/staging").deleteDir()
    new File("release/staging-copy").deleteDir()
}
