/*
 * 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 { gradlePluginPortal() }
  dependencies {
    classpath 'com.bmuschko:gradle-docker-plugin:4.0.4'
    classpath "com.diffplug.spotless:spotless-plugin-gradle:3.16.0"
    classpath "io.spring.gradle:dependency-management-plugin:1.0.3.RELEASE"
  }
}


plugins { id "org.nosphere.apache.rat" version "0.5.2" }

apply plugin: 'com.bmuschko.docker-remote-api'


// Import task types
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
// Load all properties in dependency-version.properties as project properties, so all projects can read them
Properties dependencyVersions = new Properties()
dependencyVersions.load(new FileInputStream("${project.projectDir}/gradle/dependency-versions.properties"))
dependencyVersions.keys().each{ k -> project.ext[k] = dependencyVersions[k]}

// Use task types
task buildTestingImage(type: DockerBuildImage) {
  inputDir = file(project.rootDir)
  dockerFile = file('images/geode-performance/Dockerfile')
  tag = 'geode-performance-testing:latest'
}

apply from: "gradle/spotless.gradle"
apply from: "gradle/rat.gradle"
apply from: "gradle/resolve-dependencies.gradle"
