apply plugin: 'groovy'
apply plugin: 'maven'
apply plugin: 'signing'
apply plugin: 'clone-artifacts'

configurations {
    gradleApi
    compile.extendsFrom gradleApi
    gradleApi.extendsFrom groovy
}

sourceSets {
    main {
        groovy.srcDirs 'src/main/groovy', 'src/fromGradle/groovy'
        resources.srcDirs 'src/main/resources', 'src/fromGradle/resources'
    }
    buildTest {
        groovy.srcDir file('src/build-test/groovy')
        resources.srcDir file('src/build-test/resources')
    }
    deviceTest {
        groovy.srcDir file('src/device-test/groovy')
        resources.srcDir file('src/device-test/resources')
    }
}

dependencies {
    gradleApi gradleApi()
    groovy localGroovy()
    compile project(':builder')

    runtime 'net.sf.proguard:proguard-gradle:4.9'

    testCompile 'junit:junit:3.8.1'

    buildTestCompile sourceSets.main.output
    buildTestCompile sourceSets.test.output
    buildTestCompile configurations.testCompile
    buildTestCompile configurations.testRuntime

    deviceTestCompile sourceSets.main.output
    deviceTestCompile sourceSets.test.output
    deviceTestCompile sourceSets.buildTest.output
    deviceTestCompile configurations.testCompile
    deviceTestCompile configurations.testRuntime
}

// configuration for dependencies provided by the runtime,
// in this case proguard.
configurations{
    provided
}

dependencies{
    provided 'net.sf.proguard:proguard-gradle:4.9'
}

//Include provided for compilation
sourceSets.main.compileClasspath += configurations.provided


idea {
    module {
        testSourceDirs += files('src/build-test/groovy', 'src/device-test/groovy').files

        scopes.COMPILE.plus += configurations.provided
    }
}

def getVersion() {
    if (project.has("release")) {
        return project.ext.baseVersion
    }

    return project.ext.baseVersion + '-SNAPSHOT'
}

version = getVersion()
archivesBaseName = 'gradle'
jar.manifest.attributes("Plugin-Version": version)

task publishLocal(type: Upload) {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            repository(url: uri("$rootProject.ext.androidHostOut/repo"))
        }
    }
}
publishLocal.dependsOn ':builder:publishLocal'

task buildTest(type: Test, dependsOn: publishLocal) {
    testClassesDir = sourceSets.buildTest.output.classesDir
    classpath = sourceSets.buildTest.runtimeClasspath
    description = "Runs the project build tests. This requires an SDK either from the Android source tree, under out/..., or an env var ANDROID_HOME."
    group = "verification"
    systemProperties['jar.path'] = jar.archivePath
}

task deviceTest(type: Test, dependsOn: publishLocal) {
    testClassesDir = sourceSets.deviceTest.output.classesDir
    classpath = sourceSets.deviceTest.runtimeClasspath
    description = "Runs the device tests. This requires a device."
    group = "verification"
    systemProperties['jar.path'] = jar.archivePath
}

check.dependsOn buildTest

project.ext.sonatypeUsername = project.hasProperty('sonatypeUsername') ? sonatypeUsername : ""
project.ext.sonatypePassword = project.hasProperty('sonatypePassword') ? sonatypePassword : ""

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment { MavenDeployment deployment ->
                if (!project.has("release")) {
                    throw new StopExecutionException("uploadArchives must be called with the release.gradle init script")
                }

                if (project.ext.sonatypeUsername.length() == 0 || project.ext.sonatypePassword.length() == 0) {
                    throw new StopExecutionException("uploadArchives cannot be called without sonatype username and password")
                }

                signing.signPom(deployment)
            }

            repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
                authentication(userName: project.ext.sonatypeUsername, password: project.ext.sonatypePassword)
            }

            pom.project {
                name 'Gradle Plug-in for Android'
                description 'Gradle plug-in to build Android applications.'
                url 'http://tools.android.com'
                inceptionYear '2007'

                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution 'repo'
                    }
                }

                scm {
                    url "https://android.googlesource.com/platform/tools/build"
                    connection "git://android.googlesource.com/platform/tools/build.git"
                }

                developers {
                    developer {
                        name 'The Android Open Source Project'
                    }
                }
            }
        }
    }
}

// custom tasks for creating source/javadoc jars
task sourcesJar(type: Jar, dependsOn:classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

groovydoc {
    exclude     "**/internal/**"
    includePrivate false

    docTitle "Gradle Plugin for Android"
    header ""
    footer "Copyright (C) 2012 The Android Open Source Project"
    overview ""
}

task javadocJar(type: Jar, dependsOn:groovydoc) {
    classifier  'javadoc'
    from        groovydoc.destinationDir
}
 
// add javadoc/source jar tasks as artifacts
artifacts {
    archives jar
    archives sourcesJar
    archives javadocJar
}

signing {
    required { project.has("release") && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}
