| /* |
| * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. |
| * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. |
| */ |
| import org.gradle.api.Project |
| import java.net.URI |
| |
| var Project.bootstrapKotlinVersion: String |
| get() = property("bootstrapKotlinVersion") as String |
| private set(value) { |
| extensions.extraProperties.set("bootstrapKotlinVersion", value) |
| } |
| |
| var Project.bootstrapKotlinRepo: String? |
| get() = property("bootstrapKotlinRepo") as String? |
| private set(value) { |
| extensions.extraProperties.set("bootstrapKotlinRepo", value) |
| } |
| |
| @Deprecated("Obsolete, use internalBootstrapRepo instead.") |
| val Project.internalKotlinRepo: String? |
| get() = "https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_KotlinPublic_Aggregate),number:$bootstrapKotlinVersion," + |
| "branch:default:any/artifacts/content/internal/repo" |
| |
| fun Project.kotlinBootstrapFrom(defaultSource: BootstrapOption) { |
| val teamCityBootstrapVersion = kotlinBuildProperties.teamCityBootstrapVersion |
| val customBootstrapVersion = kotlinBuildProperties.customBootstrapVersion |
| val bootstrapSource = when { |
| kotlinBuildProperties.localBootstrap -> BootstrapOption.Local( |
| kotlinBuildProperties.localBootstrapVersion, |
| kotlinBuildProperties.localBootstrapPath |
| ) |
| teamCityBootstrapVersion != null -> BootstrapOption.TeamCity( |
| teamCityBootstrapVersion, |
| kotlinBuildProperties.teamCityBootstrapBuildNumber, |
| projectExtId = kotlinBuildProperties.teamCityBootstrapProject, |
| teamcityUrl = kotlinBuildProperties.teamCityBootstrapUrl, |
| onlySuccessBootstrap = false |
| ) |
| customBootstrapVersion != null -> BootstrapOption.Custom( |
| kotlinVersion = customBootstrapVersion, |
| repo = kotlinBuildProperties.customBootstrapRepo |
| ) |
| else -> defaultSource |
| } |
| |
| bootstrapSource.applyToProject(this) |
| logger.lifecycle("Using kotlin bootstrap version $bootstrapKotlinVersion from repo $bootstrapKotlinRepo") |
| } |
| |
| sealed class BootstrapOption { |
| abstract fun applyToProject(project: Project) |
| |
| /** Manual repository and version specification. |
| * |
| * If [repo] is not specified the default buildscript and project repositories are used |
| */ |
| open class Custom(val kotlinVersion: String, val repo: String?, val cacheRedirector: Boolean = false) : BootstrapOption() { |
| override fun applyToProject(project: Project) { |
| project.bootstrapKotlinVersion = kotlinVersion |
| project.bootstrapKotlinRepo = if (cacheRedirector) |
| repo?.let { URI(it) }?.let { "https://cache-redirector.jetbrains.com/${it.host}/${it.path}" } |
| else |
| repo |
| } |
| } |
| |
| /** Get bootstrap from kotlin bootstrap space repo, where bootstraps are published */ |
| class SpaceBootstrap(kotlinVersion: String, cacheRedirector: Boolean = false) : |
| Custom(kotlinVersion, "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/bootstrap", cacheRedirector) |
| |
| /** Get bootstrap from teamcity maven artifacts of the specified build configuration |
| * |
| * [kotlinVersion] the version of maven artifacts |
| * [buildNumber] build number of a teamcity build, by default the same as [kotlinVersion], |
| * [projectExtId] extId of a teamcity build configuration, by default "Kotlin_dev_Compiler", |
| * [onlySuccessBootstrap] allow artifacts only from success builds of the default branch tagged with 'bootstrap' tag |
| */ |
| class TeamCity( |
| val kotlinVersion: String, |
| val buildNumber: String? = null, |
| val projectExtId: String? = null, |
| val onlySuccessBootstrap: Boolean = true, |
| val teamcityUrl: String? = null |
| ) : BootstrapOption() { |
| override fun applyToProject(project: Project) { |
| val query = if (onlySuccessBootstrap) "status:SUCCESS,tag:bootstrap,pinned:true" else "branch:default:any" |
| project.bootstrapKotlinRepo = |
| "${teamcityUrl ?: "https://buildserver.labs.intellij.net"}/guestAuth/app/rest/builds/buildType:(id:${projectExtId |
| ?: "Kotlin_KotlinDev_Compiler"}),number:${buildNumber ?: kotlinVersion},$query/artifacts/content/maven/" |
| project.bootstrapKotlinVersion = kotlinVersion |
| } |
| } |
| |
| /** |
| * Use previously published local artifacts from the build/repo maven repository |
| * |
| * [kotlinVersion] version of artifacts, by default the snapshot version of project is used |
| * [localPath] the path to local repository, if specified it is resolved with respect or project dir |
| */ |
| class Local(val kotlinVersion: String? = null, val localPath: String? = null) : BootstrapOption() { |
| override fun applyToProject(project: Project) { |
| val rootProjectDir = project.kotlinBuildProperties.rootProjectDir |
| val repoPath = if (localPath != null) |
| rootProjectDir.resolve(localPath).canonicalFile |
| else |
| rootProjectDir.resolve("build").resolve("repo") |
| |
| project.bootstrapKotlinRepo = repoPath.toURI().toString() |
| project.bootstrapKotlinVersion = kotlinVersion ?: project.property("defaultSnapshotVersion") as String |
| } |
| } |
| } |