You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
provs/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/VSCode.kt

94 lines
3.2 KiB
Kotlin

package org.domaindrivenarchitecture.provs.desktop.infrastructure
import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.framework.core.ProvResult
import org.domaindrivenarchitecture.provs.framework.ubuntu.install.base.aptInstall
import org.domaindrivenarchitecture.provs.framework.ubuntu.install.base.isPackageInstalled
fun Prov.installVSC(vararg options: String) = requireAll {
val clojureExtensions =
arrayListOf("betterthantomorrow.calva", "martinklepsch.clojure-joker-linter", "DavidAnson.vscode-markdownlint")
val pythonExtensions = arrayListOf("ms-python.python")
prerequisitesVSCinstall()
installVSCPackage()
installVSCodiumPackage()
if (options.contains("clojure")) {
installExtensionsCode(clojureExtensions)
installExtensionsCodium(clojureExtensions)
}
if (options.contains("python")) {
installExtensionsCode(pythonExtensions)
installExtensionsCodium(pythonExtensions)
}
provisionAdditionalTools()
}
private fun Prov.prerequisitesVSCinstall() = def {
aptInstall("curl gpg unzip apt-transport-https")
}
@Suppress("unused") // only required for installation of vscode via apt
private fun Prov.installVscWithApt() = requireAll {
val packageName = "code"
if (!isPackageInstalled(packageName)) {
// see https://code.visualstudio.com/docs/setup/linux
// alternatively install with snapd (but this cannot be tested within docker as snapd within docker is not working/supported)
sh("""
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo \"deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/vscode.list'
""")
aptInstall("apt-transport-https")
aptInstall(packageName)
} else {
ProvResult(true, out = "Package $packageName already installed.")
}
}
private fun Prov.installVSCPackage() = def {
cmd("sudo snap install code --classic")
// to install via apt use:
// installVscWithApt()
}
private fun Prov.installVSCodiumPackage() = def {
cmd("sudo snap install codium --classic")
}
private fun Prov.installExtensionsCode(extensions: List<String>) = optional {
var res = ProvResult(true)
for (ext in extensions) {
res = cmd("code --install-extension $ext")
}
res
// Settings can be found at $HOME/.config/Code/User/settings.json
}
private fun Prov.installExtensionsCodium(extensions: List<String>) = optional {
var res = ProvResult(true)
for (ext in extensions) {
res = cmd("codium --install-extension $ext")
}
res
// Settings can be found at $HOME/.config/Code/User/settings.json
}
internal fun Prov.provisionAdditionalTools() = requireAll {
// Joker
val version = "0.18.0"
cmd("curl -Lo joker-${version}-linux-amd64.zip https://github.com/candid82/joker/releases/download/v${version}/joker-${version}-linux-amd64.zip")
cmd("unzip joker-${version}-linux-amd64.zip")
cmd("sudo mv joker /usr/local/bin/")
}