apply plugin: 'com.github.kt3k.coveralls'

description = "gRPC: All"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1'
    }
}

def subprojects = [
  project(':grpc-auth'),
  project(':grpc-core'),
  project(':grpc-context'),
  project(':grpc-netty'),
  project(':grpc-okhttp'),
  project(':grpc-protobuf'),
  project(':grpc-protobuf-lite'),
  project(':grpc-protobuf-nano'),
  project(':grpc-stub'),
  project(':grpc-testing'),
]

for (subproject in rootProject.subprojects) {
    if (subproject == project) {
        continue
    }
    evaluationDependsOn(subproject.path)
}

dependencies {
    compile subprojects.minus(project(':grpc-protobuf-lite'))
}

javadoc {
    classpath = files(subprojects.collect { subproject ->
        subproject.javadoc.classpath
    })
    for (subproject in subprojects) {
        if (subproject == project) {
            continue;
        }
        source subproject.javadoc.source
        options.links subproject.javadoc.options.links.toArray(new String[0])
    }
}

task jacocoMerge(type: JacocoMerge) {
    dependsOn(subprojects.jacocoTestReport.dependsOn)
    mustRunAfter(subprojects.jacocoTestReport.mustRunAfter)
    destinationFile = file("${buildDir}/jacoco/test.exec")
    executionData = files(subprojects.jacocoTestReport.executionData)
        .plus(project(':grpc-interop-testing').jacocoTestReport.executionData)
        .filter { f -> f.exists() }
}

jacocoTestReport {
    dependsOn(jacocoMerge)
    reports {
        xml.enabled = true
        html.enabled = true
    }

    additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories = files(subprojects.sourceSets.main.output)
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it,
                exclude: ['**/io/grpc/okhttp/internal/**'])
    })
}

coveralls {
    sourceDirs = subprojects.sourceSets.main.allSource.srcDirs.flatten()
}

tasks.coveralls {
    dependsOn(jacocoTestReport)
}
