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

// This file contains the dependencies required for the gradle build itself.

repositories {
  mavenCentral()
  jcenter()
  maven { url "https://clojars.org/repo" } // Only used for the clojure plugin below.
  maven { url "https://repo.spring.io/plugins-release" } // Only used for the propdeps plugin below.
  maven { url "https://plugins.gradle.org/m2/" }
}

// Manage plugin dependencies since the plugin block can't be used in included build scripts yet.
// For more details see: https://docs.gradle.org/current/userguide/plugins.html#plugins_dsl_limitations
dependencies {
  compile "com.github.ben-manes:gradle-versions-plugin:0.41.0"
  compile "com.github.jengelman.gradle.plugins:shadow:6.1.0"
  compile "gradle.plugin.org.barfuin.gradle.jacocolog:gradle-jacoco-log:1.2.4"
  compile "gradle.plugin.com.google.gradle:osdetector-gradle-plugin:1.7.0"
  compile "com.google.protobuf:protobuf-gradle-plugin:0.8.18"
  compile "com.netflix.nebula:nebula-clojure-plugin:10.1.1"
  compile "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.0"
  compile "io.spring.gradle:propdeps-plugin:0.0.10.RELEASE"
  compile "net.ltgt.gradle:gradle-errorprone-plugin:2.0.2"
  compile "ru.vyarus:gradle-animalsniffer-plugin:1.5.4"
  compile "com.google.code.gson:gson:2.8.9"
  compile "cz.alenkacz:gradle-scalafmt:1.14.0"
  compile "com.google.guava:guava:31.0.1-jre"
  compile "me.champeau.gradle:jmh-gradle-plugin:0.5.3"
}

// Compiler configuration
tasks.withType(GroovyCompile) {
  options.compilerArgs << '-proc:none' // Ignore leaked annotation processors on the compile classpath.
}
