![JAR search and dependency download from the Maven repository](/logo.png)
run.qontract.core.utilities.ContractSource.kt Maven / Gradle / Ivy
package run.qontract.core.utilities
import run.qontract.core.git.NonZeroExitError
import run.qontract.core.git.SystemGit
import run.qontract.core.git.exitErrorMessageContains
import java.io.File
sealed class ContractSource {
abstract val testContracts: List
abstract val stubContracts: List
abstract fun pathDescriptor(path: String): String
abstract fun install(workingDirectory: File)
abstract fun directoryRelativeTo(workingDirectory: File): File
abstract fun getLatest(sourceGit: SystemGit)
abstract fun pushUpdates(sourceGit: SystemGit)
}
data class GitRepo(val gitRepositoryURL: String, override val testContracts: List, override val stubContracts: List) : ContractSource() {
val repoName = gitRepositoryURL.split("/").last().removeSuffix(".git")
override fun pathDescriptor(path: String): String {
return "${repoName}:${path}"
}
override fun directoryRelativeTo(workingDirectory: File) =
workingDirectory.resolve(repoName)
override fun getLatest(sourceGit: SystemGit) {
sourceGit.pull()
}
override fun pushUpdates(sourceGit: SystemGit) {
commitAndPush(sourceGit)
}
override fun install(workingDirectory: File) {
val sourceDir = workingDirectory.resolve(repoName)
val sourceGit = SystemGit(sourceDir.path)
try {
println("Checking ${sourceDir.path}")
if(!sourceDir.exists())
sourceDir.mkdirs()
if(!sourceGit.workingDirectoryIsGitRepo()) {
println("Found it, not a git dir, recreating...")
sourceDir.deleteRecursively()
sourceDir.mkdirs()
println("Cloning ${this.gitRepositoryURL} into ${sourceDir.absolutePath}")
sourceGit.clone(this.gitRepositoryURL, sourceDir.absoluteFile)
}
else {
println("Git repo already exists at ${sourceDir.path}, so ignoring it and moving on")
}
} catch (e: Throwable) {
println("Could not clone ${this.gitRepositoryURL}\n${e.javaClass.name}: ${exceptionCauseMessage(e)}")
}
}
}
data class GitMonoRepo(override val testContracts: List, override val stubContracts: List) : ContractSource() {
override fun pathDescriptor(path: String): String = path
override fun install(workingDirectory: File) {
println("Checking list of mono repo paths...")
val contracts = testContracts + stubContracts
for(path in contracts) {
val existenceMessage = when {
File(path).exists() -> "$path exists"
else -> "$path NOT FOUND!"
}
println(existenceMessage)
}
}
override fun directoryRelativeTo(workingDirectory: File): File = File("..")
override fun getLatest(sourceGit: SystemGit) {
// In mono repos, we can't pull latest arbitrarily
}
override fun pushUpdates(sourceGit: SystemGit) {
// In mono repos, we can't push arbitrarily
}
}
fun commitAndPush(sourceGit: SystemGit) {
val pushRequired = try {
sourceGit.commit()
true
} catch (e: NonZeroExitError) {
if (!exitErrorMessageContains(e, listOf("nothing to commit")))
throw e
exitErrorMessageContains(e, listOf("branch is ahead of"))
}
when {
pushRequired -> {
println("Pushing changes")
sourceGit.push()
}
else -> println("No changes were made to the repo, so nothing was pushed.")
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy