Skip to content

Commit 10d33a8

Browse files
authored
Restore version command output as in v3
Resolves #1286 Signed-off-by: David Pilar <[email protected]>
1 parent 9104687 commit 10d33a8

File tree

4 files changed

+285
-9
lines changed

4 files changed

+285
-9
lines changed

spring-shell-core-autoconfigure/src/main/java/org/springframework/shell/core/autoconfigure/SpringShellProperties.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,24 @@ public static class VersionCommand {
301301

302302
private boolean enabled = true;
303303

304+
private boolean showBuildGroup = false;
305+
306+
private boolean showBuildArtifact = false;
307+
308+
private boolean showBuildName = false;
309+
310+
private boolean showBuildVersion = true;
311+
312+
private boolean showBuildTime = false;
313+
314+
private boolean showGitBranch = false;
315+
316+
private boolean showGitCommitId = false;
317+
318+
private boolean showGitShortCommitId = false;
319+
320+
private boolean showGitCommitTime = false;
321+
304322
public boolean isEnabled() {
305323
return enabled;
306324
}
@@ -309,6 +327,78 @@ public void setEnabled(boolean enabled) {
309327
this.enabled = enabled;
310328
}
311329

330+
public boolean isShowBuildGroup() {
331+
return showBuildGroup;
332+
}
333+
334+
public void setShowBuildGroup(boolean showBuildGroup) {
335+
this.showBuildGroup = showBuildGroup;
336+
}
337+
338+
public boolean isShowBuildArtifact() {
339+
return showBuildArtifact;
340+
}
341+
342+
public void setShowBuildArtifact(boolean showBuildArtifact) {
343+
this.showBuildArtifact = showBuildArtifact;
344+
}
345+
346+
public boolean isShowBuildName() {
347+
return showBuildName;
348+
}
349+
350+
public void setShowBuildName(boolean showBuildName) {
351+
this.showBuildName = showBuildName;
352+
}
353+
354+
public boolean isShowBuildVersion() {
355+
return showBuildVersion;
356+
}
357+
358+
public void setShowBuildVersion(boolean showBuildVersion) {
359+
this.showBuildVersion = showBuildVersion;
360+
}
361+
362+
public boolean isShowBuildTime() {
363+
return showBuildTime;
364+
}
365+
366+
public void setShowBuildTime(boolean showBuildTime) {
367+
this.showBuildTime = showBuildTime;
368+
}
369+
370+
public boolean isShowGitBranch() {
371+
return showGitBranch;
372+
}
373+
374+
public void setShowGitBranch(boolean showGitBranch) {
375+
this.showGitBranch = showGitBranch;
376+
}
377+
378+
public boolean isShowGitCommitId() {
379+
return showGitCommitId;
380+
}
381+
382+
public void setShowGitCommitId(boolean showGitCommitId) {
383+
this.showGitCommitId = showGitCommitId;
384+
}
385+
386+
public boolean isShowGitShortCommitId() {
387+
return showGitShortCommitId;
388+
}
389+
390+
public void setShowGitShortCommitId(boolean showGitShortCommitId) {
391+
this.showGitShortCommitId = showGitShortCommitId;
392+
}
393+
394+
public boolean isShowGitCommitTime() {
395+
return showGitCommitTime;
396+
}
397+
398+
public void setShowGitCommitTime(boolean showGitCommitTime) {
399+
this.showGitCommitTime = showGitCommitTime;
400+
}
401+
312402
}
313403

314404
public static class Context {

spring-shell-core-autoconfigure/src/main/java/org/springframework/shell/core/autoconfigure/StandardCommandsAutoConfiguration.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616

1717
package org.springframework.shell.core.autoconfigure;
1818

19+
import org.springframework.beans.factory.ObjectProvider;
1920
import org.springframework.boot.autoconfigure.AutoConfiguration;
2021
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2122
import org.springframework.boot.context.properties.EnableConfigurationProperties;
23+
import org.springframework.boot.info.BuildProperties;
24+
import org.springframework.boot.info.GitProperties;
2225
import org.springframework.context.annotation.Bean;
23-
import org.springframework.shell.core.command.Clear;
24-
import org.springframework.shell.core.command.Command;
25-
import org.springframework.shell.core.command.Help;
26-
import org.springframework.shell.core.command.Script;
27-
import org.springframework.shell.core.command.Version;
26+
import org.springframework.shell.core.command.*;
2827

2928
/**
3029
* Creates beans for standard commands.
@@ -51,8 +50,25 @@ public Command clearCommand() {
5150

5251
@Bean
5352
@ConditionalOnProperty(value = "spring.shell.command.version.enabled", havingValue = "true", matchIfMissing = true)
54-
public Command versionCommand() {
55-
return new Version();
53+
public Command versionCommand(SpringShellProperties shellProperties,
54+
ObjectProvider<BuildProperties> buildProperties, ObjectProvider<GitProperties> gitProperties) {
55+
SpringShellProperties.VersionCommand properties = shellProperties.getCommand().getVersion();
56+
Version version = new Version();
57+
58+
buildProperties.ifAvailable(props -> version
59+
.setBuildProperties(new Version.BuildProperties(properties.isShowBuildGroup() ? props.getGroup() : null,
60+
properties.isShowBuildArtifact() ? props.getArtifact() : null,
61+
properties.isShowBuildName() ? props.getName() : null,
62+
properties.isShowBuildVersion() ? props.getVersion() : null,
63+
properties.isShowBuildTime() ? props.getTime() : null)));
64+
65+
gitProperties.ifAvailable(props -> version
66+
.setGitProperties(new Version.GitProperties(properties.isShowGitBranch() ? props.getBranch() : null,
67+
properties.isShowGitCommitId() ? props.getCommitId() : null,
68+
properties.isShowGitShortCommitId() ? props.getShortCommitId() : null,
69+
properties.isShowGitCommitTime() ? props.getCommitTime() : null)));
70+
71+
return version;
5672
}
5773

5874
@Bean

spring-shell-core/src/main/java/org/springframework/shell/core/command/Version.java

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,47 @@
1515
*/
1616
package org.springframework.shell.core.command;
1717

18+
import org.jspecify.annotations.Nullable;
19+
import org.springframework.beans.BeansException;
20+
import org.springframework.beans.factory.InitializingBean;
21+
import org.springframework.context.ApplicationContext;
22+
import org.springframework.context.ApplicationContextAware;
23+
import org.springframework.util.StringUtils;
24+
1825
import java.io.PrintWriter;
26+
import java.time.Instant;
1927

2028
/**
2129
* Command to print the current version of Spring Shell.
2230
*
2331
* @author Janne Valkealahti
2432
* @author Mahmoud Ben Hassine
2533
* @author Piotr Olaszewski
34+
* @author David Pilar
2635
*/
27-
public class Version implements Command {
36+
public class Version implements Command, InitializingBean, ApplicationContextAware {
37+
38+
public record BuildProperties(@Nullable String group, @Nullable String artifact, @Nullable String name,
39+
@Nullable String version, @Nullable Instant time) {
40+
}
41+
42+
public record GitProperties(@Nullable String branch, @Nullable String commitId, @Nullable String shortCommitId,
43+
@Nullable Instant commitTime) {
44+
}
45+
46+
private ApplicationContext applicationContext;
47+
48+
private @Nullable BuildProperties buildProperties;
49+
50+
private @Nullable GitProperties gitProperties;
51+
52+
public void setBuildProperties(BuildProperties buildProperties) {
53+
this.buildProperties = buildProperties;
54+
}
55+
56+
public void setGitProperties(GitProperties gitProperties) {
57+
this.gitProperties = gitProperties;
58+
}
2859

2960
@Override
3061
public String getDescription() {
@@ -40,13 +71,57 @@ public String getGroup() {
4071
public ExitStatus execute(CommandContext commandContext) throws Exception {
4172
Package pkg = Version.class.getPackage();
4273
String version = "N/A";
43-
if (pkg != null && pkg.getImplementationVersion() != null) {
74+
if (buildProperties != null && StringUtils.hasText(buildProperties.version())) {
75+
version = buildProperties.version();
76+
}
77+
else if (pkg != null && pkg.getImplementationVersion() != null) {
4478
version = pkg.getImplementationVersion();
4579
}
4680
PrintWriter printWriter = commandContext.outputWriter();
4781
printWriter.println("Version: " + version);
82+
83+
if (buildProperties != null) {
84+
if (StringUtils.hasText(buildProperties.group())) {
85+
printWriter.println("Build Group: " + buildProperties.group());
86+
}
87+
if (StringUtils.hasText(buildProperties.artifact())) {
88+
printWriter.println("Build Artifact: " + buildProperties.artifact());
89+
}
90+
if (StringUtils.hasText(buildProperties.name())) {
91+
printWriter.println("Build Name: " + buildProperties.name());
92+
}
93+
if (buildProperties.time() != null) {
94+
printWriter.println("Build Time: " + buildProperties.time());
95+
}
96+
}
97+
if (gitProperties != null) {
98+
if (StringUtils.hasText(gitProperties.shortCommitId())) {
99+
printWriter.println("Git Short Commit ID: " + gitProperties.shortCommitId());
100+
}
101+
if (StringUtils.hasText(gitProperties.commitId())) {
102+
printWriter.println("Git Commit ID: " + gitProperties.commitId());
103+
}
104+
if (StringUtils.hasText(gitProperties.branch())) {
105+
printWriter.println("Git Branch: " + gitProperties.branch());
106+
}
107+
if (gitProperties.commitTime() != null) {
108+
printWriter.println("Git Commit Time: " + gitProperties.commitTime());
109+
}
110+
}
111+
48112
printWriter.flush();
49113
return ExitStatus.OK;
50114
}
51115

116+
@Override
117+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
118+
this.applicationContext = applicationContext;
119+
}
120+
121+
@Override
122+
public void afterPropertiesSet() {
123+
applicationContext.getBeanProvider(Version.BuildProperties.class).ifAvailable(this::setBuildProperties);
124+
applicationContext.getBeanProvider(Version.GitProperties.class).ifAvailable(this::setGitProperties);
125+
}
126+
52127
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.springframework.shell.core.command;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.params.ParameterizedTest;
6+
import org.junit.jupiter.params.provider.Arguments;
7+
import org.junit.jupiter.params.provider.MethodSource;
8+
9+
import java.io.PrintWriter;
10+
import java.io.StringWriter;
11+
import java.time.Instant;
12+
import java.util.stream.Stream;
13+
14+
import static org.junit.jupiter.api.Assertions.assertFalse;
15+
import static org.junit.jupiter.api.Assertions.assertTrue;
16+
import static org.mockito.Mockito.mock;
17+
import static org.mockito.Mockito.when;
18+
19+
/**
20+
* @author David Pilar
21+
*/
22+
class VersionTests {
23+
24+
private StringWriter writer;
25+
26+
private CommandContext context;
27+
28+
@BeforeEach
29+
void before() {
30+
writer = new StringWriter();
31+
context = mock(CommandContext.class);
32+
when(context.outputWriter()).thenReturn(new PrintWriter(writer));
33+
}
34+
35+
@ParameterizedTest
36+
@MethodSource("versionWithoutDetailsInfoData")
37+
void testVersionWithoutDetailsInfo(Version.BuildProperties buildProperties, Version.GitProperties gitProperties)
38+
throws Exception {
39+
// given
40+
Version version = new Version();
41+
version.setBuildProperties(buildProperties);
42+
version.setGitProperties(gitProperties);
43+
44+
// when
45+
version.execute(context);
46+
String result = writer.toString();
47+
48+
// then
49+
assertTrue(result.contains("Version:"));
50+
assertFalse(result.contains("Build Version:"));
51+
assertFalse(result.contains("Build Group:"));
52+
assertFalse(result.contains("Build Artifact:"));
53+
assertFalse(result.contains("Build Name:"));
54+
assertFalse(result.contains("Build Time:"));
55+
assertFalse(result.contains("Git Short Commit ID:"));
56+
assertFalse(result.contains("Git Commit ID:"));
57+
assertFalse(result.contains("Git Branch:"));
58+
assertFalse(result.contains("Git Commit Time:"));
59+
}
60+
61+
static Stream<Arguments> versionWithoutDetailsInfoData() {
62+
return Stream.of(Arguments.of(null, null),
63+
Arguments.of(new Version.BuildProperties(null, null, null, null, null),
64+
new Version.GitProperties(null, null, null, null)));
65+
}
66+
67+
@Test
68+
void testVersionWithDetailsInfo() throws Exception {
69+
// given
70+
Version.BuildProperties buildProperties = new Version.BuildProperties("group", "artifact", "name", "1.0.0",
71+
Instant.now());
72+
Version.GitProperties gitProperties = new Version.GitProperties("branch", "commitId", "shortCommitId",
73+
Instant.now());
74+
75+
Version version = new Version();
76+
version.setBuildProperties(buildProperties);
77+
version.setGitProperties(gitProperties);
78+
79+
// when
80+
version.execute(context);
81+
String result = writer.toString();
82+
83+
// then
84+
assertTrue(result.contains("Version: " + buildProperties.version()));
85+
assertTrue(result.contains("Build Group: " + buildProperties.group()));
86+
assertTrue(result.contains("Build Artifact: " + buildProperties.artifact()));
87+
assertTrue(result.contains("Build Name: " + buildProperties.name()));
88+
assertTrue(result.contains("Build Time: " + buildProperties.time()));
89+
assertTrue(result.contains("Git Short Commit ID: " + gitProperties.shortCommitId()));
90+
assertTrue(result.contains("Git Commit ID: " + gitProperties.commitId()));
91+
assertTrue(result.contains("Git Branch: " + gitProperties.branch()));
92+
assertTrue(result.contains("Git Commit Time: " + gitProperties.commitTime()));
93+
}
94+
95+
}

0 commit comments

Comments
 (0)