/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed 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.
 */
// upload anchor for subprojects to upload their artifacts to the local repo.
task(mainUpload)

task createArchive(type : Zip) {
    description "Creates a maven repository that includes just the libraries compiled in this" +
            " project, without any history from prebuilts."
    from rootProject.ext.supportRepoOut
    destinationDir rootProject.ext.distDir
    into 'm2repository'
    baseName = String.format("top-of-tree-m2repository-%s", project.ext.buildNumber)
    dependsOn mainUpload
}

task createDiffArchive(type : Zip) {
    description "Creates a maven repository that includes just the libraries compiled in this" +
            " project without any libraries that are already on maven.google.com. If you need " +
            " a full repo, use createArchive task."
    dependsOn mainUpload
    /**
     * building filters in a doFirst block so that we can query the output of other tasks and also
     * not query maven.google unless task runs.
     */
    doFirst {
        def includeFilters = subprojects.collect { it.tasks.withType(Upload) }.findResults {
            def group = it.project.group[0]
            def archiveName = it.project.name[0]
            def version = it.project.version[0]
            if (group == null || archiveName == null || version == null) {
                logger.info "null artifact info for ${it.project.path}"
                return null
            }
            def subFolder = group.replace('.', '/') + "/" + archiveName + "/" + version
            def localFolder = new File(rootProject.ext.supportRepoOut, subFolder)
            if (!localFolder.exists()) {
                // no reason to check, not even built
                logger.info "skipping $subFolder because it does not exist"
                return null
            }
            // query maven.google to check if it is released.
            if (rootProject.ext.versionChecker.isReleased(group, archiveName, version)) {
                logger.info "looks like $subFolder is released, skipping"
                return null
            } else {
                logger.info "adding $subFolder to partial maven zip because it cannot be found on" +
                        " maven.google.com"
            }
            return subFolder + "/**"
        }
        logger.info "include filters for diff maven zip ${includeFilters}"
        includeFilters.forEach {
            include it
        }
        if (includeFilters.isEmpty()) {
            // not providing any include would mean include everything so we provide a dummy
            // include constraint.
            include "do-not-include-anything"
        }
    }
    from rootProject.ext.supportRepoOut
    destinationDir rootProject.ext.distDir
    into 'm2repository'
    baseName = String.format("gmaven-diff-top-of-tree-m2repository-%s", project.ext.buildNumber)
    dependsOn mainUpload
}

// anchor for prepare repo. This is post unzip.
task prepareRepo() {
    description "This task clears the repo folder to ensure that we run a fresh build every" +
            " time we create arhives. Otherwise, snapshots will accumulate in the builds folder."
    doFirst {
        rootProject.ext.supportRepoOut.deleteDir()
        rootProject.ext.supportRepoOut.mkdirs()
    }
}
