import org.ajoberstar.grgit.Grgit

buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath libs.grgit.plugin
    classpath libs.android.gradle.plugin
    classpath libs.kotlin.gradle.plugin
    classpath libs.gradle.maven.publish.plugin
    classpath libs.dokka.gradle.plugin
  }
}

plugins {
  id 'net.ltgt.errorprone' apply false
  id "com.google.devtools.ksp" apply false
}

allprojects {
  repositories {
    google()
    mavenCentral()
    maven { url "https://jitpack.io" }
  }
}

ext {
  git = Grgit.open(currentDir: project.rootDir)
  gitSha = git.head().id
  gitBranch = git.branch.current().name
}

tasks.register('clean', Delete) {
  delete rootProject.buildDir
}
