/*
 * 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.
 */

plugins {
  id "io.spring.dependency-management" version "1.0.11.RELEASE"
  id "com.bmuschko.docker-remote-api" version "6.7.0"
  id "com.diffplug.spotless" version "5.11.1"
  id "org.nosphere.apache.rat" version "0.7.0"
  id "com.github.ben-manes.versions" version "0.38.0"
}

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')
  images.add('geode-performance-testing:latest')
}

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