/*
 * Copyright 2012, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

apply plugin: 'idea'

version = '2.1.3'

if (!('release' in gradle.startParameter.taskNames)) {
    def versionSuffix
    try {
        def git = org.eclipse.jgit.api.Git.open(file('.'))
        def head = git.getRepository().getRef('HEAD')
        versionSuffix = head.getObjectId().abbreviate(8).name()

        if (!git.status().call().clean) {
            versionSuffix += '-dirty'
        }
    } catch (Exception) {
        // In case we can't get the commit for some reason,
        // just use -dev
        versionSuffix = 'dev'
    }

    version += "-${versionSuffix}"
} else {
    if (System.env.JDK6_HOME == null && !JavaVersion.current().isJava6()) {
        throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 6. " +
                "Either run gradle with java 6, or define the JDK6_HOME environment variable.")
    }
}

// Note: please don't use this. This is strictly for the official releases
// that are posted on, e.g. the bitbucket download page.
task release() {
}

task(install) << {
    println "Installing version: ${version}"
}

// The projects that get pushed to maven
def maven_release_projects = ['smali', 'baksmali', 'dexlib2', 'util']

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'

    if (JavaVersion.current().isJava8Compatible()) {
        allprojects {
            tasks.withType(Javadoc) {
                options.addStringOption('Xdoclint:none', '-quiet')
            }
        }
    }

    if (System.env.JDK6_HOME != null) {
        sourceCompatibility = 1.6
        targetCompatibility = 1.6

        tasks.withType(JavaCompile) {
            doFirst {
                options.fork = true
                options.bootClasspath = "$System.env.JDK6_HOME/jre/lib/rt.jar"
                options.bootClasspath += "$File.pathSeparator$System.env.JDK6_HOME/jre/lib/jsse.jar"
            }
        }
    }

    version = parent.version

    ext {
        depends = [
                guava: 'com.google.guava:guava:18.0',
                findbugs: 'com.google.code.findbugs:jsr305:1.3.9',
                junit: 'junit:junit:4.6',
                antlr_runtime: 'org.antlr:antlr-runtime:3.5.2',
                antlr: 'org.antlr:antlr:3.5.2',
                stringtemplate: 'org.antlr:stringtemplate:3.2.1',
                commons_cli: 'commons-cli:commons-cli:1.2',
                jflex_plugin: 'org.xbib.gradle.plugin:gradle-plugin-jflex:1.1.0',
                proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1',
                dx: 'com.google.android.tools:dx:1.7',
                gson: 'com.google.code.gson:gson:2.3.1'
         ]
    }

    repositories {
        mavenCentral()
    }

    if (project.name in maven_release_projects) {
        apply plugin: 'maven'
        apply plugin: 'signing'

        group = 'org.smali'

        task javadocJar(type: Jar, dependsOn: javadoc) {
            classifier = 'javadoc'
            from 'build/docs/javadoc'
        }

        task sourcesJar(type: Jar) {
            classifier = 'sources'
            from sourceSets.main.allJava
        }

        artifacts {
            archives javadocJar
            archives sourcesJar
        }

        signing {
            required { gradle.taskGraph.hasTask('uploadArchives') }
            sign configurations.archives
        }

        uploadArchives {
            repositories.mavenDeployer {
                configuration = configurations.archives

                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                if (rootProject.hasProperty('sonatypeUsername') && rootProject.hasProperty('sonatypePassword')) {
                    repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/') {
                        authentication(userName: sonatypeUsername, password: sonatypePassword)
                    }
                }

                pom.artifactId = project.name

                pom.project {
                    name project.name
                    url 'http://smali.org'
                    packaging 'jar'
                    licenses {
                        license {
                            name 'The BSD 3-Clause License'
                            url 'http://opensource.org/licenses/BSD-3-Clause'
                            distribution 'repo'
                        }
                    }
                    scm {
                        connection 'scm:git:git://github.com/JesusFreke/smali.git'
                        developerConnection 'scm:git:git@github.com:JesusFreke/smali.git'
                    }
                    developers {
                        developer {
                            id 'jesusfreke'
                            name 'Ben Gruver'
                            email 'jesusfreke@jesusfreke.com'
                        }
                    }
                }
            }
        }

        tasks.getByPath(':release').dependsOn(uploadArchives)
    }
}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.eclipse.jgit:org.eclipse.jgit:2.0.0.201206130900-r'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.14'
}