git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1573617 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -111,6 +111,13 @@ Other changes: | |||||
| * changes to DOMElementWriter to make OutOfMemoryErrors less likely. | * changes to DOMElementWriter to make OutOfMemoryErrors less likely. | ||||
| Bugzilla Report 54147 | 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 | Changes from Ant 1.9.2 TO Ant 1.9.3 | ||||
| =================================== | =================================== | ||||
| @@ -136,6 +136,16 @@ source (input) and destination (output/error) files. <em>Since Apache Ant 1.6.2 | |||||
| </td> | </td> | ||||
| <td align="center" valign="top">No, default is <code>true</code></td> | <td align="center" valign="top">No, default is <code>true</code></td> | ||||
| </tr> | </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> | </table> | ||||
| <h3>Parameters specified as nested elements</h3> | <h3>Parameters specified as nested elements</h3> | ||||
| <h4>inputmapper</h4> | <h4>inputmapper</h4> | ||||
| @@ -192,6 +192,9 @@ public class Redirector { | |||||
| /** Mutex for err */ | /** Mutex for err */ | ||||
| private Object errMutex = new Object(); | 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 | * 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 | * Set a property from a ByteArrayOutputStream | ||||
| * | * | ||||
| @@ -722,8 +737,12 @@ public class Redirector { | |||||
| OutputStreamFunneler funneler = new OutputStreamFunneler( | OutputStreamFunneler funneler = new OutputStreamFunneler( | ||||
| outputStream, funnelTimeout); | outputStream, funnelTimeout); | ||||
| try { | 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) { | } catch (IOException eyeOhEx) { | ||||
| throw new BuildException( | throw new BuildException( | ||||
| "error splitting output/error streams", eyeOhEx); | "error splitting output/error streams", eyeOhEx); | ||||
| @@ -104,6 +104,9 @@ public class RedirectorElement extends DataType { | |||||
| /** whether to log the inputstring */ | /** whether to log the inputstring */ | ||||
| private Boolean logInputString; | private Boolean logInputString; | ||||
| /** Is the output binary or can we safely split it into lines? */ | |||||
| private boolean outputIsBinary = false; | |||||
| /** | /** | ||||
| * Add the input file mapper. | * Add the input file mapper. | ||||
| * @param inputMapper <code>Mapper</code>. | * @param inputMapper <code>Mapper</code>. | ||||
| @@ -426,6 +429,18 @@ public class RedirectorElement extends DataType { | |||||
| return result; | 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>. | * Configure the specified <code>Redirector</code>. | ||||
| * @param redirector <code>Redirector</code>. | * @param redirector <code>Redirector</code>. | ||||
| @@ -530,6 +545,7 @@ public class RedirectorElement extends DataType { | |||||
| if (errorEncoding != null) { | if (errorEncoding != null) { | ||||
| redirector.setErrorEncoding(errorEncoding); | redirector.setErrorEncoding(errorEncoding); | ||||
| } | } | ||||
| redirector.setBinaryOutput(outputIsBinary); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -678,4 +678,33 @@ public class Hello { | |||||
| <au:assertLogDoesntContain text="Hello 20"/> | <au:assertLogDoesntContain text="Hello 20"/> | ||||
| </target> | </target> | ||||
| <target name="test-output-is-split-into-lines" if="cat.can.run" depends="setUp"> | |||||
| <echo file="${input}/redirector.in">1
2
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
2
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> | </project> | ||||