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

/*
 * This file describes artifacts which will be distributed in separate jars, intended to be used with
 * <b>older</b> versions of Groovy for binary compatibility with classes compiled with newer versions of groovy
 */

ext.backports = [
        compat23: ['org/codehaus/groovy/runtime/typehandling/ShortTypeHandling.class']
]

task backportJars {
    group = 'Backports'
    description = 'Generates backports jars'
}

dist.dependsOn backportJars
install.dependsOn backportJars
uploadArchives.dependsOn backportJars

backports.each { pkg, classList ->
    def backportJar = task "backport${pkg}Jar"(type:Jar) {
        group = 'Backports'
        dependsOn jar

        from zipTree(jar.archivePath)
        include classList
        baseName = "groovy-backports-$pkg"
        classifier = ''
    }

    // the following two jars are empty. No wonder, Maven Central *requires* a javadoc and sources classifier
    // it's stupid in our case, because we don't have such, but we have no choice
    def javadocJar = task "backport${pkg}JavadocJar"(type:Jar) {
        group = 'Backports'
        dependsOn jar

        baseName = "groovy-backports-$pkg"
        classifier = 'javadoc'
    }
    def sourcesJar = task "backport${pkg}SourcesJar"(type:Jar) {
        group = 'Backports'
        dependsOn jar

        baseName = "groovy-backports-$pkg"
        classifier = 'sources'
    }
    backportJars.dependsOn([backportJar, javadocJar, sourcesJar])

}

