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

        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 jarAll

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

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

}

