Browse Source

add a 'binaryOutput' attribute to redirector to prevent Ant from corrupting, well, binary output. PRs 56156 and 55667

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1573617 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 11 years ago
parent
commit
3c1f0ee7fa
5 changed files with 83 additions and 2 deletions
  1. +7
    -0
      WHATSNEW
  2. +10
    -0
      manual/Types/redirector.html
  3. +21
    -2
      src/main/org/apache/tools/ant/taskdefs/Redirector.java
  4. +16
    -0
      src/main/org/apache/tools/ant/types/RedirectorElement.java
  5. +29
    -0
      src/tests/antunit/taskdefs/exec/exec-test.xml

+ 7
- 0
WHATSNEW View File

@@ -111,6 +111,13 @@ Other changes:
* changes to DOMElementWriter to make OutOfMemoryErrors less likely.
Bugzilla Report 54147

* <redirector> has a new attribute binaryOutput that prevents Ant
from splitting the output into lines. This prevents binary output
from being corrupted but may lead to error and normal output being
mixed up.
Bugzilla Report 55667
Bugzilla Report 56156

Changes from Ant 1.9.2 TO Ant 1.9.3
===================================



+ 10
- 0
manual/Types/redirector.html View File

@@ -136,6 +136,16 @@ source (input) and destination (output/error) files. <em>Since Apache Ant 1.6.2
</td>
<td align="center" valign="top">No, default is <code>true</code></td>
</tr>
<tr>
<td valign="top">binaryOutput</td>
<td valign="top">When set to true Ant will not try to split the
output into lines - which it will usually do in order to separate
error from normal output. This setting will not prevent binary
output from getting corrupted if you also specify filter chains.
<i>Since Ant 1.9.4</i>.
</td>
<td align="center" valign="top">No, default is <code>false</code></td>
</tr>
</table>
<h3>Parameters specified as nested elements</h3>
<h4>inputmapper</h4>


+ 21
- 2
src/main/org/apache/tools/ant/taskdefs/Redirector.java View File

@@ -192,6 +192,9 @@ public class Redirector {
/** Mutex for err */
private Object errMutex = new Object();

/** Is the output binary or can we safely split it into lines? */
private boolean outputIsBinary = false;

/**
* Create a redirector instance for the given task
*
@@ -523,6 +526,18 @@ public class Redirector {
}
}

/**
* Whether to consider the output created by the process binary.
*
* <p>Binary output will not be split into lines which may make
* error and normal output look mixed up when they get written to
* the same stream.</p>
* @since 1.9.4
*/
public void setBinaryOutput(boolean b) {
outputIsBinary = b;
}

/**
* Set a property from a ByteArrayOutputStream
*
@@ -722,8 +737,12 @@ public class Redirector {
OutputStreamFunneler funneler = new OutputStreamFunneler(
outputStream, funnelTimeout);
try {
outputStream = new LineOrientedOutputStreamRedirector(funneler.getFunnelInstance());
errorStream = new LineOrientedOutputStreamRedirector(funneler.getFunnelInstance());
outputStream = funneler.getFunnelInstance();
errorStream = funneler.getFunnelInstance();
if (!outputIsBinary) {
outputStream = new LineOrientedOutputStreamRedirector(outputStream);
errorStream = new LineOrientedOutputStreamRedirector(errorStream);
}
} catch (IOException eyeOhEx) {
throw new BuildException(
"error splitting output/error streams", eyeOhEx);


+ 16
- 0
src/main/org/apache/tools/ant/types/RedirectorElement.java View File

@@ -104,6 +104,9 @@ public class RedirectorElement extends DataType {
/** whether to log the inputstring */
private Boolean logInputString;

/** Is the output binary or can we safely split it into lines? */
private boolean outputIsBinary = false;

/**
* Add the input file mapper.
* @param inputMapper <code>Mapper</code>.
@@ -426,6 +429,18 @@ public class RedirectorElement extends DataType {
return result;
}

/**
* Whether to consider the output created by the process binary.
*
* <p>Binary output will not be split into lines which may make
* error and normal output look mixed up when they get written to
* the same stream.</p>
* @since 1.9.4
*/
public void setBinaryOutput(boolean b) {
outputIsBinary = b;
}

/**
* Configure the specified <code>Redirector</code>.
* @param redirector <code>Redirector</code>.
@@ -530,6 +545,7 @@ public class RedirectorElement extends DataType {
if (errorEncoding != null) {
redirector.setErrorEncoding(errorEncoding);
}
redirector.setBinaryOutput(outputIsBinary);
}

/**


+ 29
- 0
src/tests/antunit/taskdefs/exec/exec-test.xml View File

@@ -678,4 +678,33 @@ public class Hello {
<au:assertLogDoesntContain text="Hello 20"/>
</target>

<target name="test-output-is-split-into-lines" if="cat.can.run" depends="setUp">
<echo file="${input}/redirector.in">1&#xa;2&#xd;&#xa;3</echo>
<echo file="${output}/expected">1${line.separator}2${line.separator}3</echo>
<exec executable="cat">
<redirector output="${output}/redirector.out"
input="${input}/redirector.in"/>
</exec>
<au:assertTrue>
<resourcesmatch astext="true">
<file file="${output}/redirector.out" />
<file file="${output}/expected" />
</resourcesmatch>
</au:assertTrue>
</target>

<target name="test-binary-output-is-not-split-into-lines" if="cat.can.run" depends="setUp">
<echo file="${input}/redirector.in">1&#xa;2&#xd;&#xa;3</echo>
<exec executable="cat">
<redirector output="${output}/redirector.out" binaryOutput="true"
input="${input}/redirector.in"/>
</exec>
<au:assertTrue>
<resourcesmatch astext="true">
<file file="${output}/redirector.out" />
<file file="${input}/redirector.in" />
</resourcesmatch>
</au:assertTrue>
</target>

</project>

Loading…
Cancel
Save