execute pre-push hook · diffplug/spotless@776f7d1 (original) (raw)

`@@ -19,24 +19,26 @@

`

19

19

``

20

20

`import java.io.File;

`

21

21

`import java.io.IOException;

`

``

22

`+

import java.util.List;

`

22

23

`import java.util.Locale;

`

``

24

`+

import java.util.Map;

`

``

25

`+

import java.util.Optional;

`

23

26

``

24

27

`import org.junit.jupiter.api.Test;

`

25

28

``

``

29

`+

import com.diffplug.spotless.ProcessRunner;

`

``

30

+

26

31

`class SpotlessInstallPrePushHookMojoTest extends MavenIntegrationHarness {

`

27

32

``

28

33

`@Test

`

29

34

`public void should_create_pre_hook_file_when_hook_file_does_not_exists() throws Exception {

`

30

35

`// given

`

31

36

`setFile(".git/config").toContent("");

`

32

``

`-

setFile("license.txt").toResource("license/TestLicense");

`

``

37

`+

setFile("license.txt").toResource("git_pre_hook/TestLicense.txt");

`

33

38

`writePomWithJavaLicenseHeaderStep();

`

34

39

``

35

40

`// when

`

36

``

`-

final var output = mavenRunner()

`

37

``

`-

.withArguments("spotless:install-git-pre-push-hook")

`

38

``

`-

.runNoError()

`

39

``

`-

.stdOutUtf8();

`

``

41

`+

final var output = runMaven("spotless:install-git-pre-push-hook");

`

40

42

``

41

43

`// then

`

42

44

`assertThat(output).contains("Installing git pre-push hook");

`

`@@ -51,16 +53,13 @@ public void should_create_pre_hook_file_when_hook_file_does_not_exists() throws

`

51

53

`public void should_append_to_existing_pre_hook_file_when_hook_file_exists() throws Exception {

`

52

54

`// given

`

53

55

`setFile(".git/config").toContent("");

`

54

``

`-

setFile("license.txt").toResource("license/TestLicense");

`

``

56

`+

setFile("license.txt").toResource("git_pre_hook/TestLicense.txt");

`

55

57

`setFile(".git/hooks/pre-push").toResource("git_pre_hook/pre-push.existing");

`

56

58

``

57

59

`writePomWithJavaLicenseHeaderStep();

`

58

60

``

59

61

`// when

`

60

``

`-

final var output = mavenRunner()

`

61

``

`-

.withArguments("spotless:install-git-pre-push-hook")

`

62

``

`-

.runNoError()

`

63

``

`-

.stdOutUtf8();

`

``

62

`+

final var output = runMaven("spotless:install-git-pre-push-hook");

`

64

63

``

65

64

`// then

`

66

65

`assertThat(output).contains("Installing git pre-push hook");

`

`@@ -70,6 +69,30 @@ public void should_append_to_existing_pre_hook_file_when_hook_file_exists() thro

`

70

69

`assertFile(".git/hooks/pre-push").hasContent(hookContent);

`

71

70

` }

`

72

71

``

``

72

`+

@Test

`

``

73

`+

public void should_execute_pre_push_script() throws Exception {

`

``

74

`+

// given

`

``

75

`+

setFile("license.txt").toResource("git_pre_hook/TestLicense.txt");

`

``

76

`+

setFile(".git/config").toContent("");

`

``

77

`+

setFile("src/main/java/com.github.youribonnaffe.gradle.format/Java8Test.java").toResource("git_pre_hook/MissingLicense.test");

`

``

78

`+

writePomWithJavaLicenseHeaderStep();

`

``

79

+

``

80

`+

// when

`

``

81

`+

// install pre-hook

`

``

82

`+

final var output = runMaven("spotless:install-git-pre-push-hook");

`

``

83

+

``

84

`+

final var result = executeHookScript(".git/hooks/pre-push");

`

``

85

+

``

86

`+

// then

`

``

87

`+

assertThat(output).contains("Git pre-push hook installed successfully to the file " + newFile(".git/hooks/pre-push"));

`

``

88

+

``

89

`+

assertThat(result.stdErrUtf8()).startsWith("spotless found problems, running spotless:apply; commit the result and re-push");

`

``

90

`+

assertThat(result.exitCode()).isEqualTo(1);

`

``

91

+

``

92

`+

final var fileContent = read("src/main/java/com.github.youribonnaffe.gradle.format/Java8Test.java");

`

``

93

`+

assertThat(fileContent).startsWith("this is a test license!\n");

`

``

94

`+

}

`

``

95

+

73

96

`private void writePomWithJavaLicenseHeaderStep() throws IOException {

`

74

97

`writePomWithJavaSteps(

`

75

98

`"",

`

`@@ -86,8 +109,12 @@ private String getHookContent(String resourceFile) {

`

86

109

` .replace("${applyCommand}", "spotless:apply");

`

87

110

` }

`

88

111

``

``

112

`+

private boolean isWindows() {

`

``

113

`+

return System.getProperty("os.name").toLowerCase(Locale.ROOT).startsWith("win");

`

``

114

`+

}

`

``

115

+

89

116

`private File executorWrapperFile() {

`

90

``

`-

if (System.getProperty("os.name").toLowerCase(Locale.ROOT).startsWith("win")) {

`

``

117

`+

if (isWindows()) {

`

91

118

`final var bat = newFile("mvnw.bat");

`

92

119

`if (bat.exists()) {

`

93

120

`return bat;

`

`@@ -98,4 +125,57 @@ private File executorWrapperFile() {

`

98

125

``

99

126

`return newFile("mvnw");

`

100

127

` }

`

``

128

+

``

129

`+

private String runMaven(String command) throws Exception {

`

``

130

`+

return mavenRunner()

`

``

131

`+

.withArguments(command)

`

``

132

`+

.withEnvironment("JAVA_HOME", System.getProperty("java.home"))

`

``

133

`+

.runNoError()

`

``

134

`+

.stdOutUtf8();

`

``

135

`+

}

`

``

136

+

``

137

`+

private ProcessRunner.Result executeHookScript(String hookFile) throws Exception {

`

``

138

`+

try (final var runner = new ProcessRunner()) {

`

``

139

`+

String executor = "sh";

`

``

140

`+

if (isWindows()) {

`

``

141

`+

final var bashPath = findGitBashExecutable();

`

``

142

`+

if (bashPath.isEmpty()) {

`

``

143

`+

throw new RuntimeException("Could not find git bash executable");

`

``

144

`+

}

`

``

145

+

``

146

`+

executor = bashPath.get();

`

``

147

`+

}

`

``

148

+

``

149

`+

return runner.exec(rootFolder(), Map.of("JAVA_HOME", System.getProperty("java.home")), null, List.of(executor, hookFile));

`

``

150

`+

}

`

``

151

`+

}

`

``

152

+

``

153

`+

private Optional findGitBashExecutable() {

`

``

154

`+

// 1. Check environment variable

`

``

155

`+

final var envPath = System.getenv("GIT_BASH");

`

``

156

`+

if (envPath != null && new File(envPath).exists()) {

`

``

157

`+

return Optional.of(envPath);

`

``

158

`+

}

`

``

159

+

``

160

`+

// 2. Check common install paths

`

``

161

`+

final var commonPaths = List.of(

`

``

162

`+

"C:\Program Files\Git\bin\bash.exe",

`

``

163

`+

"C:\Program Files (x86)\Git\bin\bash.exe",

`

``

164

`+

"C:\Program Files\Git\usr\bin\bash.exe");

`

``

165

+

``

166

`+

for (var path : commonPaths) {

`

``

167

`+

if (new File(path).exists()) {

`

``

168

`+

return Optional.of(path);

`

``

169

`+

}

`

``

170

`+

}

`

``

171

+

``

172

`+

// 3. Try bash from PATH

`

``

173

`+

try {

`

``

174

`+

Process process = new ProcessBuilder("bash", "--version").start();

`

``

175

`+

process.waitFor();

`

``

176

`+

return Optional.of("bash"); // just use "bash"

`

``

177

`+

} catch (Exception e) {

`

``

178

`+

return Optional.empty();

`

``

179

`+

}

`

``

180

`+

}

`

101

181

`}

`