Fix error detection in executeGitCommand

1. proc.consumeProcessErrorStream does not work correctly: it creates a
   thread to asynchronously copy the content of the stream to the string
   buffer, and does not provide any way to know when it's done. As a
   result, sometimes the buffer is correctly filled in after
   consumeProcessErrorStream returns, sometimes it's not.
2. Checking stderr to know if there was an error is not a good idea: a
   process can run just fine and give output on stderr (logs,
   basically), and a process can fail without giving any output on
   stderr. Checking the status code is more reliable.
This commit is contained in:
Yoann Rodière 2020-06-03 09:44:04 +02:00 committed by Andrea Boriero
parent cfeee5059b
commit 8363df3495
1 changed files with 23 additions and 6 deletions

View File

@ -1,3 +1,5 @@
import java.nio.charset.StandardCharsets
import groovy.json.JsonSlurper
/*
@ -321,13 +323,28 @@ task ciRelease() {
ciRelease.dependsOn updateChangeLogFile, release
release.mustRunAfter updateChangeLogFile
void executeGitCommand(String command, String errorMessage){
static void executeGitCommand(String command, String errorMessage){
def proc = command.execute()
def errorsStringBuffer = new StringBuffer()
proc.waitFor()
proc.consumeProcessErrorStream( errorsStringBuffer )
if ( errorsStringBuffer.toString( ) != "" ) {
throw new GradleException( errorMessage + " " + b );
def code = proc.waitFor()
def stdout = inputStreamToString( proc.getInputStream() )
def stderr = inputStreamToString( proc.getErrorStream() )
if ( code != 0 ) {
throw new GradleException( errorMessage + "\n\nstdout:\n" + stdout + "\n\nstderr:\n" + stderr )
}
}
static String inputStreamToString(InputStream inputStream) {
inputStream.withCloseable { ins ->
new BufferedInputStream(ins).withCloseable { bis ->
new ByteArrayOutputStream().withCloseable { buf ->
int result = bis.read();
while (result != -1) {
buf.write((byte) result);
result = bis.read();
}
return buf.toString( StandardCharsets.UTF_8.name());
}
}
}
}