/*
 * Copyright (C) 2015 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.
 */
ext.dataBindingRootFolder = new File(project.projectDir, "..")
buildscript {
    ext.dataBindingRootFolder = new File(project.projectDir, "..")
    apply from: "${project.projectDir}/../propLoader.gradle"
    apply from: "${project.projectDir}/../supportBundle.gradle"
    ext.addRepos(repositories)
}

def bundleSupportLibTask = tasks['bundleSupportLib']

subprojects {
    apply plugin: 'maven'
    group = dataBindingConfig.group
    version = dataBindingConfig.extensionsVersion
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: "file://${dataBindingConfig.internalPrebuiltsRepoDir}")
            }
        }
    }
    bundleSupportLibTask.dependsOn tasks['uploadArchives']

    def configureOut = tasks.create(name: 'configureOut') << {
        println("configuring out...")
        def deployer = tasks['uploadArchives'].repositories.mavenDeployer.repository
        println "changing ${deployer.url} to ${rootProject.ext.supportRepoOut}"
        deployer.url = "file://${rootProject.ext.supportRepoOut}"
    }
    bundleSupportLibTask.dependsOn configureOut
    tasks['uploadArchives'].mustRunAfter configureOut
    tasks['uploadArchives'].mustRunAfter unzipRepo
}


task preparePrebuilds() {
}

allprojects {
    afterEvaluate { project ->
        preparePrebuilds.dependsOn project.tasks.findAll {task -> task.name.startsWith('prebuild')}
    }
}