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

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',
                mockito: 'org.mockito:mockito-core:1.10.19',
                antlr_runtime: 'org.antlr:antlr-runtime:3.5.2',
                antlr: 'org.antlr:antlr:3.5.2',
                stringtemplate: 'org.antlr:stringtemplate:3.2.1',
                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',
                jcommander: 'com.beust:jcommander:1.48'
         ]
    }

    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 = '3.1'
    distributionType = Wrapper.DistributionType.ALL
}