buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath ("io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE")
        classpath ("org.ajoberstar:grgit:2.0.0")
    }
}

plugins {
    id 'com.github.hierynomus.license' version '0.13.1'
    id "com.jfrog.bintray" version "1.7.3"
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'
apply plugin: 'license'
apply plugin: 'com.jfrog.bintray'
apply plugin: "org.ajoberstar.grgit"

ext {
    versions = [
            springcontext        : '4.3.3.RELEASE',
            springboot           : '1.4.1.RELEASE',
            findbugs             : '3.0.1'
    ]
    changesetId = grgit.head().id
}

group 'io.mifos.core'
version '0.1.0-BUILD-SNAPSHOT'

tasks.withType(JavaCompile) {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

repositories {
    jcenter()
    mavenLocal()
}

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
    }
}

dependencies {
    compile(
            [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
            [group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: versions.springboot],
            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
    )

    testCompile(
            [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot]
    )
}

jar {
    from sourceSets.main.allSource
}

publishing {
    publications {
        langPublication(MavenPublication) {
            from components.java
            groupId project.group
            artifactId project.name
            version project.version
        }
    }
}

bintray {
    user = System.getenv('BINTRAY_USER')
    key = System.getenv('BINTRAY_KEY')
    pkg {
        repo = 'mifosio'
        userOrg = 'kuelap'
        name = "${project.group}.${project.name}"
        licenses = ['Apache-2.0']
        vcsUrl = 'https://github.com/mifosio/lang.git'
        version {
            name = project.version
            desc = 'build snapshot'
            released  = new Date()
            attributes = ['changesetId': changesetId]
        }
    }
    publications = ['langPublication']
}

license {
    header rootProject.file('HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
    }
    ext.year = Calendar.getInstance().get(Calendar.YEAR)
    ext.name = 'Kuelap, Inc'
    skipExistingHeaders true
}