/*
 * 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.
 */
buildscript {
  repositories {
    maven { url "https://plugins.gradle.org/m2/" }
  }

  dependencies {
    classpath "org.ajoberstar:gradle-git:1.3.2"
  }
}

allprojects {
  //These methods will be added to each individual project.
  //Use this for methods that access project variables (like project.name)
  //
  //What is is doing is adding properties to the extra properties of the
  //project. Each property is itself a closure.
  ext {
    sanitizedName = {
      // Intended to strip off 'extensions/' from the modules so that artifacts
      // don't end up in libs/extensions/
      def parts = project.name.split("/")
      return parts[parts.length - 1];
    }

    disableMavenPublishing = {
      // Use this closure when a project should not publish anything to maven.
      afterEvaluate {
        install.enabled = false
        uploadArchives.enabled = false
      }
    }
    disableSigning = {
      // Use this closure when a project should not publish anything to maven.
      afterEvaluate {
        signArchives.enabled = false
      }
    }

    readScmInfo = {
      try {
        def git = org.ajoberstar.grgit.Grgit.open(currentDir: projectDir)
        try {
          return [
            'Source-Repository': git.branch.getCurrent().name,
            'Source-Revision'  : git.head().id,
            'Source-Date'      : git.head().getDate().format('yyyy-MM-dd HH:mm:ss Z')
          ] as Properties
        } finally {
          git.close()
        }
      } catch (IllegalArgumentException e) {
        // if we're building from the source distribution, we don't have git so
        // use cached info written during the assembly process
        def buildInfo = file "$rootDir/.buildinfo"
        if (buildInfo.exists()) {
          def props = new Properties()
          new FileInputStream(buildInfo).withStream { fis ->
            props.load(fis)
          }
          return props
        }

        logger.warn( '***** Unable to find Git workspace. Using default version information *****' )
        return [
          'Source-Repository': 'UNKNOWN',
          'Source-Revision'  : 'UNKNOWN',
          'Source-Date'      : new Date().format('yyyy-MM-dd HH:mm:ss Z')
        ] as Properties
      }
    }
  }
}
