From c185ebd09cf0e00c8aa4f02e571de3715bace450 Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Wed, 17 Mar 2021 08:16:19 +0100 Subject: [PATCH] feat(java): add segment --- docs/docs/segment-java.md | 45 ++++++++++++++++++++++++++++++ docs/sidebars.js | 1 + src/segment.go | 3 ++ src/segment_java.go | 57 ++++++++++++++++++++++++++++++++++++++ src/segment_java_test.go | 58 +++++++++++++++++++++++++++++++++++++++ themes/schema.json | 29 +++++++++++++++++++- 6 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 docs/docs/segment-java.md create mode 100644 src/segment_java.go create mode 100755 src/segment_java_test.go diff --git a/docs/docs/segment-java.md b/docs/docs/segment-java.md new file mode 100644 index 00000000..b88c24c5 --- /dev/null +++ b/docs/docs/segment-java.md @@ -0,0 +1,45 @@ +--- +id: java +title: Java +sidebar_label: Java +--- + +## What + +Display the currently active java version. + +## Sample Configuration + +```json +{ + "type": "java", + "style": "powerline", + "powerline_symbol": "\uE0B0", + "foreground": "#ffffff", + "background": "#4063D8", + "properties": { + "prefix": " \uE738 " + } +} +``` + +## Properties + +- display_version: `boolean` - display the java version - defaults to `true` +- display_error: `boolean` - show the error context when failing to retrieve the version information - defaults to `true` +- missing_command_text: `string` - text to display when the java command is missing - defaults to empty +- display_mode: `string` - determines when the segment is displayed + - `always`: the segment is always displayed + - `files`: the segment is only displayed when one of the following files is present: + - `build.gradle.kts` + - `build.sbt` + - `.java-version` + - `.deps.edn` + - `project.clj` + - `build.boot` + - `*.java` + - `*.class` + - `*.gradle` + - `*.jar` + - `*.clj` + - `*.cljc` diff --git a/docs/sidebars.js b/docs/sidebars.js index 588ab7b6..7c8d32bb 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -19,6 +19,7 @@ module.exports = { "exit", "git", "golang", + "java", "julia", "kubectl", "node", diff --git a/src/segment.go b/src/segment.go index 11592fdd..9a9128b3 100644 --- a/src/segment.go +++ b/src/segment.go @@ -94,6 +94,8 @@ const ( Ruby SegmentType = "ruby" // Aws writes the active aws context Aws SegmentType = "aws" + // Java writes the active java version + Java SegmentType = "java" ) func (segment *Segment) string() string { @@ -216,6 +218,7 @@ func (segment *Segment) mapSegmentWithWriter(env environmentInfo) error { ExecutionTime: &executiontime{}, Ruby: &ruby{}, Aws: &aws{}, + Java: &java{}, } if writer, ok := functions[segment.Type]; ok { props := &properties{ diff --git a/src/segment_java.go b/src/segment_java.go new file mode 100644 index 00000000..73f73603 --- /dev/null +++ b/src/segment_java.go @@ -0,0 +1,57 @@ +package main + +import "fmt" + +type java struct { + language *language +} + +func (j *java) string() string { + return j.language.string() +} + +func (j *java) init(props *properties, env environmentInfo) { + javaRegex := `\((?P(?P[0-9]+)\.(?P[0-9]+)\.(?P[0-9]+)).*\).*(?:built|from)` + javaCmd := &cmd{ + executable: "java", + args: []string{"-Xinternalversion"}, + regex: javaRegex, + } + j.language = &language{ + env: env, + props: props, + extensions: []string{ + "pom.xml", + "build.gradle.kts", + "build.sbt", + ".java-version", + ".deps.edn", + "project.clj", + "build.boot", + "*.java", + "*.class", + "*.gradle", + "*.jar", + "*.clj", + "*.cljc", + }, + } + javaHome := j.language.env.getenv("JAVA_HOME") + if len(javaHome) > 0 { + java := fmt.Sprintf("%s/bin/java", javaHome) + j.language.commands = []*cmd{ + { + executable: java, + args: []string{"-Xinternalversion"}, + regex: javaRegex, + }, + javaCmd, + } + return + } + j.language.commands = []*cmd{javaCmd} +} + +func (j *java) enabled() bool { + return j.language.enabled() +} diff --git a/src/segment_java_test.go b/src/segment_java_test.go new file mode 100755 index 00000000..55b7395b --- /dev/null +++ b/src/segment_java_test.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestJava(t *testing.T) { + cases := []struct { + Case string + ExpectedString string + Version string + JavaHomeVersion string + JavaHomeEnabled bool + }{ + { + Case: "OpenJDK macOS", + ExpectedString: "1.8.0", + Version: "OpenJDK 64-Bit Server VM (25.275-b01) for bsd-amd64 JRE (1.8.0_275-b01), built on Nov 9 2020 12:07:35 by \"jenkins\" with gcc 4.2.1", + }, + { + Case: "OpenJDK macOS with JAVA_HOME, no executable", + ExpectedString: "1.8.0", + Version: "OpenJDK 64-Bit Server VM (25.275-b01) for bsd-amd64 JRE (1.8.0_275-b01), built on Nov 9 2020 12:07:35 by \"jenkins\" with gcc 4.2.1", + }, + { + Case: "OpenJDK macOS with JAVA_HOME and executable", + ExpectedString: "1.7.0", + JavaHomeEnabled: true, + JavaHomeVersion: "OpenJDK 64-Bit Server VM (25.275-b01) for bsd-amd64 JRE (1.7.0_275-b01), built on Nov 9 2020 12:07:35 by \"jenkins\" with gcc 4.2.1", + Version: "OpenJDK 64-Bit Server VM (25.275-b01) for bsd-amd64 JRE (1.8.0_275-b01), built on Nov 9 2020 12:07:35 by \"jenkins\" with gcc 4.2.1", + }, + } + for _, tc := range cases { + env := new(MockedEnvironment) + env.On("hasCommand", "java").Return(true) + env.On("runCommand", "java", []string{"-Xinternalversion"}).Return(tc.Version, nil) + env.On("hasFiles", "pom.xml").Return(true) + if tc.JavaHomeEnabled { + env.On("getenv", "JAVA_HOME").Return("/usr/java") + env.On("hasCommand", "/usr/java/bin/java").Return(true) + env.On("runCommand", "/usr/java/bin/java", []string{"-Xinternalversion"}).Return(tc.JavaHomeVersion, nil) + } else { + env.On("getenv", "JAVA_HOME").Return("") + } + props := &properties{ + values: map[Property]interface{}{ + DisplayVersion: true, + }, + } + j := &java{} + j.init(props, env) + assert.True(t, j.enabled(), fmt.Sprintf("Failed in case: %s", tc.Case)) + assert.Equal(t, tc.ExpectedString, j.string(), fmt.Sprintf("Failed in case: %s", tc.Case)) + } +} diff --git a/themes/schema.json b/themes/schema.json index fdc1c051..9551716b 100644 --- a/themes/schema.json +++ b/themes/schema.json @@ -154,7 +154,8 @@ "ruby", "ytm", "executiontime", - "aws" + "aws", + "java" ] }, "style": { @@ -715,6 +716,32 @@ } } }, + { + "if": { + "properties": { + "type": { "const": "java" } + } + }, + "then": { + "title": "Julia Segment", + "description": "https://ohmyposh.dev/docs/java", + "properties": { + "properties": { + "properties": { + "display_version": { + "$ref": "#/definitions/display_version" + }, + "display_mode": { + "$ref": "#/definitions/display_mode" + }, + "missing_command_text": { + "$ref": "#/definitions/missing_command_text" + } + } + } + } + } + }, { "if": { "properties": {