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')

    compile "com.android.tools:sdklib:$project.ext.baseAndroidVersion"
    compile "com.android.tools:sdk-common:$project.ext.baseAndroidVersion"
    compile "com.android.tools:common:$project.ext.baseAndroidVersion"

    compile "com.android.tools.lint:lint:$project.ext.baseAndroidVersion"
    compile 'net.sf.proguard:proguard-gradle:4.10'

    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.10'
}

//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.localRepo))
        }
    }
}
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
}
