/*
 * 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.10.RELEASE"
  id "com.bmuschko.docker-remote-api" version "6.6.1"
  id "com.diffplug.spotless" version "5.6.1"
  id "org.nosphere.apache.rat" version "0.7.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"
