/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

project(':') {
  apply plugin: 'base'
  apply plugin: 'signing'
}

def isRelease = ext.release.toBoolean()

def releaseVersion = project.version
if (!isRelease) {
  releaseVersion += "-SNAPSHOT"
}

// Modify the gradle.properties to indicate whether this is a release.  This results in the
// source releases generating artifacts without -SNAPSHOT appended to the version when they are
// built.
task prepare_release_config(type: Copy) {
  from "$rootDir/gradle.properties"

  // There is a bug in Gradle on Windows that prevents copy tasks from copying into the same folder.
  // Therefore, we copy to a temporary dir, and use the copy method (which doesn't have this bug)
  // to copy back into rootDir so the Windows build works, even though this is ugly.
  // https://discuss.gradle.org/t/error-with-a-copy-task-on-windows/1803
  into temporaryDir
  rename { filename ->
    filename + ".release" }
  filter { line ->
    if (isRelease && line.startsWith("release=")) {
      "release=true"
    }
    else {
      line
    }
  }
  doLast {
    copy {
      from temporaryDir
      into "$rootDir"
      include 'gradle.properties.release'
    }
  }
}

task sourceRelease(type: Tar, dependsOn: prepare_release_config) {
  description = "Build a source release, specifically excluding the build directories and gradle wrapper files"
  compression = Compression.GZIP

  baseName "apache-datafu-sources-${releaseVersion}"

  from(project.rootDir) {
    // don't include gradle.properties because we use a modified version
    exclude "gradle.properties"
    exclude '**/build'
    exclude 'build'
    exclude '.gradle'
    exclude 'gradlew'
    exclude 'gradlew.bat'
    exclude 'gradle/wrapper/gradle-wrapper.jar'
    exclude 'gradle/wrapper/gradle-wrapper.properties'
    exclude 'site'
  }

  // rename gradle.properties.release to gradle.properties
  rename { filename ->
    if (filename.equals("gradle.properties.release")) {
      "gradle.properties"
    }
    else {
      filename
    }
  }

  into(baseName)

  // Set destination directory.
  destinationDir = file("${project.buildDir}/distribution/source")

  archiveName = "${baseName}.tgz"
  doLast {
    ant.checksum file:"$destinationDir/$archiveName", algorithm: "SHA-512", fileext: ".sha512"
  }
}

// Signing requires a user ~/.gradle/gradle.properties file with signing information.
// See: http://www.gradle.org/docs/current/userguide/signing_plugin.html
signing {
  // Sign the source archive if the proper configuration is in place to do so.  Otherwise
  // skip the signing process (it isn't required).  This archive can be manually signed if
  // needed.
  required false
  sign sourceRelease
}

task release(dependsOn: signSourceRelease)

// Publishing to Apache's Maven repository (Nexus). To install the archives in the
// local repository, run the 'install' task.
subprojects {
  apply plugin: 'nexus'

  nexus {
    attachSources = false
    attachTests = false
    attachJavadoc = false
    sign = true
    repositoryUrl = 'https://repository.apache.org/service/local/staging/deploy/maven2'
    snapshotRepositoryUrl = 'https://repository.apache.org/content/repositories/snapshots'
  }

  modifyPom {
    project {
      name 'Apache DataFu'
      description 'Librares that make easier to solve data problems using Hadoop and higher level languages based on it.'
      url 'https://datafu.apache.org/'

      scm {
        url 'https://git-wip-us.apache.org/repos/asf?p=datafu.git;a=tree'
        connection 'scm:http://git-wip-us.apache.org/repos/asf/datafu.git'
        developerConnection 'scm:https://git-wip-us.apache.org/repos/asf/datafu.git'
      }

      licenses {
        license {
          name 'The Apache Software License, Version 2.0'
          url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
        }
      }
    }
  }
}
