mirror of
https://github.com/corda/corda.git
synced 2025-05-30 14:14:29 +00:00
[CORDA-2211]: Added error for older bash versions when attempting to install shell extensions. (#4263)
This commit is contained in:
parent
e14ade58e3
commit
97c1e5babc
@ -71,6 +71,7 @@ buildscript {
|
|||||||
ext.class_graph_version = '4.2.12'
|
ext.class_graph_version = '4.2.12'
|
||||||
ext.jcabi_manifests_version = '1.1'
|
ext.jcabi_manifests_version = '1.1'
|
||||||
ext.picocli_version = '3.8.0'
|
ext.picocli_version = '3.8.0'
|
||||||
|
ext.commons_io_version = '2.6'
|
||||||
|
|
||||||
// Name of the IntelliJ SDK created for the deterministic Java rt.jar.
|
// Name of the IntelliJ SDK created for the deterministic Java rt.jar.
|
||||||
// ext.deterministic_idea_sdk = '1.8 (Deterministic)'
|
// ext.deterministic_idea_sdk = '1.8 (Deterministic)'
|
||||||
|
@ -9,6 +9,7 @@ dependencies {
|
|||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
compile "info.picocli:picocli:$picocli_version"
|
compile "info.picocli:picocli:$picocli_version"
|
||||||
|
compile "commons-io:commons-io:$commons_io_version"
|
||||||
compile "com.jcabi:jcabi-manifests:$jcabi_manifests_version"
|
compile "com.jcabi:jcabi-manifests:$jcabi_manifests_version"
|
||||||
compile "org.slf4j:slf4j-api:$slf4j_version"
|
compile "org.slf4j:slf4j-api:$slf4j_version"
|
||||||
compile "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version"
|
compile "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version"
|
||||||
|
@ -184,6 +184,10 @@ abstract class CordaCliWrapper(alias: String, description: String) : CliWrapperB
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun printHelp() = cmd.usage(System.out)
|
fun printHelp() = cmd.usage(System.out)
|
||||||
|
|
||||||
|
fun printlnErr(message: String) = System.err.println(message)
|
||||||
|
|
||||||
|
fun printlnWarn(message: String) = System.err.println(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package net.corda.cliutils
|
package net.corda.cliutils
|
||||||
|
|
||||||
import net.corda.core.internal.*
|
import net.corda.core.internal.*
|
||||||
|
import org.apache.commons.io.IOUtils
|
||||||
|
import org.apache.commons.lang.SystemUtils
|
||||||
import picocli.CommandLine
|
import picocli.CommandLine
|
||||||
import picocli.CommandLine.Command
|
import picocli.CommandLine.Command
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@ -9,6 +11,10 @@ import java.nio.file.StandardCopyOption
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
private class ShellExtensionsGenerator(val parent: CordaCliWrapper) {
|
private class ShellExtensionsGenerator(val parent: CordaCliWrapper) {
|
||||||
|
private companion object {
|
||||||
|
private const val minSupportedBashVersion = 4
|
||||||
|
}
|
||||||
|
|
||||||
private class SettingsFile(val filePath: Path) {
|
private class SettingsFile(val filePath: Path) {
|
||||||
private val lines: MutableList<String> by lazy { getFileLines() }
|
private val lines: MutableList<String> by lazy { getFileLines() }
|
||||||
var fileModified: Boolean = false
|
var fileModified: Boolean = false
|
||||||
@ -80,10 +86,22 @@ private class ShellExtensionsGenerator(val parent: CordaCliWrapper) {
|
|||||||
autoCompleteFile.writeText(builder.toString())
|
autoCompleteFile.writeText(builder.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun installShellExtensions() {
|
fun installShellExtensions(): Int {
|
||||||
// Get jar location and generate alias command
|
// Get jar location and generate alias command
|
||||||
val command = "alias ${parent.alias}='java -jar \"${jarLocation.toStringWithDeWindowsfication()}\"'"
|
val command = "alias ${parent.alias}='java -jar \"${jarLocation.toStringWithDeWindowsfication()}\"'"
|
||||||
|
var generateAutoCompleteFile = true
|
||||||
|
if (SystemUtils.IS_OS_UNIX && installedShell() == ShellType.BASH) {
|
||||||
|
val semanticParts = declaredBashVersion().split(".")
|
||||||
|
semanticParts.firstOrNull()?.toIntOrNull()?.let { major ->
|
||||||
|
if (major < minSupportedBashVersion) {
|
||||||
|
parent.printlnWarn("Cannot install shell extension for bash major version earlier than $minSupportedBashVersion. Please upgrade your bash version. Aliases should still work.")
|
||||||
|
generateAutoCompleteFile = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (generateAutoCompleteFile) {
|
||||||
generateAutoCompleteFile(parent.alias)
|
generateAutoCompleteFile(parent.alias)
|
||||||
|
}
|
||||||
|
|
||||||
// Get bash settings file
|
// Get bash settings file
|
||||||
val bashSettingsFile = SettingsFile(userHome / ".bashrc")
|
val bashSettingsFile = SettingsFile(userHome / ".bashrc")
|
||||||
@ -101,9 +119,34 @@ private class ShellExtensionsGenerator(val parent: CordaCliWrapper) {
|
|||||||
zshSettingsFile.addIfNotExists(completionFileCommand)
|
zshSettingsFile.addIfNotExists(completionFileCommand)
|
||||||
zshSettingsFile.updateAndBackupIfNecessary()
|
zshSettingsFile.updateAndBackupIfNecessary()
|
||||||
|
|
||||||
|
if (generateAutoCompleteFile) {
|
||||||
println("Installation complete, ${parent.alias} is available in bash with autocompletion.")
|
println("Installation complete, ${parent.alias} is available in bash with autocompletion.")
|
||||||
|
} else {
|
||||||
|
println("Installation complete, ${parent.alias} is available in bash, but autocompletion was not installed because of an old version of bash.")
|
||||||
|
}
|
||||||
println("Type `${parent.alias} <options>` from the commandline.")
|
println("Type `${parent.alias} <options>` from the commandline.")
|
||||||
println("Restart bash for this to take effect, or run `. ~/.bashrc` in bash or `. ~/.zshrc` in zsh to re-initialise your shell now")
|
println("Restart bash for this to take effect, or run `. ~/.bashrc` in bash or `. ~/.zshrc` in zsh to re-initialise your shell now")
|
||||||
|
return ExitCodes.SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun declaredBashVersion(): String = execCommand("bash -c 'echo \$BASH_VERSION'")
|
||||||
|
|
||||||
|
private fun installedShell(): ShellType {
|
||||||
|
val path = execCommand("bash -c 'echo \$SHELL'")
|
||||||
|
return when {
|
||||||
|
path.endsWith("/zsh") -> ShellType.ZSH
|
||||||
|
path.endsWith("/bash") -> ShellType.BASH
|
||||||
|
else -> ShellType.OTHER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class ShellType {
|
||||||
|
ZSH, BASH, OTHER
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun execCommand(command: String): String {
|
||||||
|
val process = ProcessBuilder(command)
|
||||||
|
return IOUtils.toString(process.start().inputStream, Charsets.UTF_8)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkForAutoCompleteUpdate() {
|
fun checkForAutoCompleteUpdate() {
|
||||||
@ -127,8 +170,7 @@ private class ShellExtensionsGenerator(val parent: CordaCliWrapper) {
|
|||||||
class InstallShellExtensionsParser(private val cliWrapper: CordaCliWrapper) : CliWrapperBase("install-shell-extensions", "Install alias and autocompletion for bash and zsh") {
|
class InstallShellExtensionsParser(private val cliWrapper: CordaCliWrapper) : CliWrapperBase("install-shell-extensions", "Install alias and autocompletion for bash and zsh") {
|
||||||
private val generator = ShellExtensionsGenerator(cliWrapper)
|
private val generator = ShellExtensionsGenerator(cliWrapper)
|
||||||
override fun runProgram(): Int {
|
override fun runProgram(): Int {
|
||||||
generator.installShellExtensions()
|
return generator.installShellExtensions()
|
||||||
return ExitCodes.SUCCESS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateShellExtensions() = generator.checkForAutoCompleteUpdate()
|
fun updateShellExtensions() = generator.checkForAutoCompleteUpdate()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user