|
15 | 15 | */
|
16 | 16 | package com.diffplug.gradle;
|
17 | 17 |
|
18 |
| -import java.io.BufferedReader; |
19 | 18 | import java.io.File;
|
20 | 19 | import java.io.IOException;
|
21 |
| -import java.io.InputStreamReader; |
22 |
| -import java.nio.charset.Charset; |
23 | 20 | import java.util.Arrays;
|
24 | 21 | import java.util.List;
|
25 | 22 |
|
| 23 | +import javax.management.RuntimeErrorException; |
| 24 | + |
26 | 25 | import org.apache.commons.io.FileUtils;
|
27 | 26 |
|
28 | 27 | import com.diffplug.common.base.Throwing;
|
@@ -143,42 +142,32 @@ public static Result runCmd(File directory, String cmd, boolean echoCmd, boolean
|
143 | 142 | Process process = builder.start();
|
144 | 143 |
|
145 | 144 | // wrap the process' input and output
|
146 |
| - try ( |
147 |
| - BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.defaultCharset())); |
148 |
| - BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream(), Charset.defaultCharset()));) { |
149 |
| - |
| 145 | + try { |
150 | 146 | if (echoCmd) {
|
151 | 147 | System.out.println("cmd>" + cmd);
|
152 | 148 | }
|
153 | 149 |
|
154 |
| - // dump the output |
155 |
| - ImmutableList.Builder<String> output = ImmutableList.builder(); |
156 |
| - ImmutableList.Builder<String> error = ImmutableList.builder(); |
157 |
| - |
158 |
| - String line = null; |
159 |
| - while ((line = stdInput.readLine()) != null) { |
160 |
| - output.add(line); |
161 |
| - if (echoOutput) { |
162 |
| - System.out.println(line); |
163 |
| - } |
164 |
| - } |
165 |
| - |
166 |
| - // dump the input |
167 |
| - while ((line = stdError.readLine()) != null) { |
168 |
| - error.add(line); |
169 |
| - if (echoOutput) { |
170 |
| - System.err.println(line); |
171 |
| - } |
172 |
| - } |
| 150 | + InputStreamCollector stdInputThread = new InputStreamCollector(process.getInputStream(), echoOutput ? System.out : null, null); |
| 151 | + stdInputThread.start(); |
| 152 | + InputStreamCollector stdErrorThread = new InputStreamCollector(process.getErrorStream(), echoOutput ? System.err : null, null); |
| 153 | + stdErrorThread.start(); |
173 | 154 |
|
174 | 155 | // check that the process exited correctly
|
175 | 156 | int exitValue = process.waitFor();
|
176 |
| - if (exitValue != EXIT_VALUE_SUCCESS) { |
| 157 | + // then wait for threads collecting the output of thread |
| 158 | + stdInputThread.join(); |
| 159 | + stdErrorThread.join(); |
| 160 | + |
| 161 | + if (stdInputThread.getException() != null) { |
| 162 | + throw new RuntimeException(stdInputThread.getException()); |
| 163 | + } else if (stdErrorThread.getException() != null) { |
| 164 | + throw new RuntimeException(stdErrorThread.getException()); |
| 165 | + } else if (exitValue != EXIT_VALUE_SUCCESS) { |
177 | 166 | throw new RuntimeException("'" + cmd + "' exited with " + exitValue);
|
178 | 167 | }
|
179 | 168 |
|
180 | 169 | // returns the result of this successful execution
|
181 |
| - return new Result(directory, cmd, output.build(), error.build()); |
| 170 | + return new Result(directory, cmd, stdInputThread.getOutput(), stdErrorThread.getOutput()); |
182 | 171 | } catch (InterruptedException e) {
|
183 | 172 | // this isn't expected, but it's possible
|
184 | 173 | throw new RuntimeException(e);
|
|
0 commit comments