/*
 * 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.2'

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: 'de.jflex:jflex:1.4.3',
                   jflex_plugin: 'co.tomlee.gradle.plugins:gradle-jflex-plugin:0.0.2',
                   proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1',
                   dx: 'com.google.android.tools:dx:1.7'
         ]
    }

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