/*
 *  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.
 *
 */
apply plugin: 'groovy'

def final mvnProfile="release"
task dosite (type: Exec) {
  workingDir "."
  commandLine "mvn clean site".split(" ")
}

task doassembly (type: Exec) {
  workingDir "."
  commandLine "mvn -P$mvnProfile package assembly:assembly".split(" ")
}

// deployTop has to run first and deploy/install root pom.xml
// hence all the other Maven tasks depend on it
task deployTop (type: Exec, dependsOn: ["bigtop-tests:assembleDist"]) {
  workingDir "."
  commandLine "mvn -P$mvnProfile -Pattach-smokes deploy -f pom.xml".split(" ")
  standardInput System.in
}
task deployITest (type: Exec, dependsOn: [deployTop]) {
  workingDir "."
  commandLine "mvn -P$mvnProfile -DskipTests deploy -f bigtop-test-framework/pom.xml".split(" ")
  standardInput System.in
}
task deployTestArtifacts (type: Exec, dependsOn: [deployTop]) {
  workingDir "."
  commandLine "mvn -P$mvnProfile deploy -f bigtop-tests/test-artifacts/pom.xml".split(" ")
  standardInput System.in
}
task deployTestExecutors (type: Exec, dependsOn: [deployTop]) {
  workingDir "."
  commandLine "mvn -P$mvnProfile deploy -f bigtop-tests/test-execution/pom.xml".split(" ")
  environment HADOOP_CONF_DIR: "", HADOOP_HOME: ""
  standardInput System.in
}
task deployAll (dependsOn: [deployTestExecutors, deployTestArtifacts,
                            deployITest, deployTop]) doLast {
  println "Done!"
}

task dorelease(description: 'Convenient wrapper for existing release tasks',
  dependsOn: [dosite, deployAll]) doLast {
}

task setversion doLast {
  assert project.hasProperty('nextversion')

  FileTree fTree = fileTree(dir: projectDir, exclude: ['dl', 'build'],
      include: ['**/pom.xml', '*.bom', 'build.gradle'])
  fTree.each() { pomFile ->
    println "Fixing $pomFile"
    pomFile.write(pomFile.text.replaceAll(version, nextversion))
  }
  println "Done! Please inspect changes to make sure everything is in order."
}
