// Versions that we are building.
Properties properties = new Properties()
File versionRootDir = rootDir
String relativeVersionPath = project.hasProperty("release")
  ? "buildSrc/base/version.properties"
  : "buildSrc/base/dev-version.properties"
File versionProperties = new File(versionRootDir, relativeVersionPath)


project.ext['versionProperties'] = versionProperties

while (!versionProperties.exists() && versionRootDir.parentFile != null &&
        versionRootDir.parentFile.exists()) {
    versionRootDir = versionRootDir.parentFile
    versionProperties = new File(versionRootDir, relativeVersionPath)
}

versionProperties.withReader { properties.load(it) }

for (name in properties.stringPropertyNames()) {
    project.ext[name] = properties.getProperty(name)
}

// Add ext.libs for library versions
Properties dependencies = new Properties()
File dependenciesProperties = new File(versionRootDir, "buildSrc/base/dependencies.properties")
dependenciesProperties.withReader { dependencies.load(it) }

def libs = [:].withDefault { key -> throw new IllegalArgumentException('"' + key + '" not a valid dependency.') }
for (name in dependencies.stringPropertyNames()) {
    libs[name] = dependencies.getProperty(name)
}
// Use the proto compiler that matches the protobuf java runtime.
libs['proto_compiler'] = libs['protobuf'].replace('protobuf-java', 'protoc')
rootProject.ext['libs'] = libs
