Browse Source

preserve linefeed-style in propertyfile task. PR 50049

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1027179 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 14 years ago
parent
commit
9f471a747b
4 changed files with 100 additions and 4 deletions
  1. +4
    -0
      WHATSNEW
  2. +6
    -1
      docs/manual/Tasks/propertyfile.html
  3. +45
    -3
      src/main/org/apache/tools/ant/util/LayoutPreservingProperties.java
  4. +45
    -0
      src/tests/antunit/taskdefs/optional/propertyfilelayout-test.xml

+ 4
- 0
WHATSNEW View File

@@ -183,6 +183,10 @@ Fixed bugs:
wrong.
Bugzilla Report 45227.

* <propertyfile> didn't preserve the original linefeed style when
updating a file.
Bugzilla Report 50049.

Other changes:
--------------



+ 6
- 1
docs/manual/Tasks/propertyfile.html View File

@@ -32,9 +32,14 @@ very useful when wanting to make unattended modifications to
configuration files for application servers and
applications. Currently, the task maintains a working property file
with the ability to add properties or make changes to existing
ones. Since Ant 1.8.0 comments and layout of the original properties
ones. <em>Since Ant 1.8.0</em> comments and layout of the original properties
file are preserved.</p>

<p><em>Since Ant 1.8.2</em> the linefeed-style of the original file
will be preserved as well, as long as style used to be consistent.
In general, linefeeds of the updated file will be the same as the
first linefeed found when reading it.</p>

<hr>
<h2><a name="proptask">PropertyFile Task</a></h2>
<h3>Parameters</h3>


+ 45
- 3
src/main/org/apache/tools/ant/util/LayoutPreservingProperties.java View File

@@ -27,6 +27,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PushbackReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -78,7 +79,7 @@ import java.util.Properties;
* although the key-value pair <code>beta=two</code> is removed.</p>
*/
public class LayoutPreservingProperties extends Properties {
private static final String LS = System.getProperty("line.separator");
private String LS = StringUtils.LINE_SEP;

/**
* Logical lines have escaping and line continuation taken care
@@ -310,14 +311,15 @@ public class LayoutPreservingProperties extends Properties {
*/
private String readLines(InputStream is) throws IOException {
InputStreamReader isr = new InputStreamReader(is, ResourceUtils.ISO_8859_1);
BufferedReader br = new BufferedReader(isr);
PushbackReader pbr = new PushbackReader(isr, 1);

if (logicalLines.size() > 0) {
// we add a blank line for spacing
logicalLines.add(new Blank());
}

String s = br.readLine();
String s = readFirstLine(pbr);
BufferedReader br = new BufferedReader(pbr);

boolean continuation = false;
boolean comment = false;
@@ -366,6 +368,46 @@ public class LayoutPreservingProperties extends Properties {
return fileBuffer.toString();
}

/**
* Reads the first line and determines the EOL-style of the file
* (relies on the style to be consistent, of course).
*
* <p>Sets LS as a side-effect.</p>
*
* @return the first line without any line separator, leaves the
* reader positioned after the first line separator
*
* @since Ant 1.8.2
*/
private String readFirstLine(PushbackReader r) throws IOException {
StringBuffer sb = new StringBuffer(80);
int ch = r.read();
boolean hasCR = false;
// when reaching EOF before the first EOL, assume native line
// feeds
LS = StringUtils.LINE_SEP;

while (ch >= 0) {
if (hasCR && ch != '\n') {
// line feed is sole CR
r.unread(ch);
break;
}

if (ch == '\r') {
LS = "\r";
hasCR = true;
} else if (ch == '\n') {
LS = hasCR ? "\r\n" : "\n";
break;
} else {
sb.append((char) ch);
}
ch = r.read();
}
return sb.toString();
}

/**
* Returns <code>true</code> if the line represented by
* <code>s</code> is to be continued on the next line of the file,


+ 45
- 0
src/tests/antunit/taskdefs/optional/propertyfilelayout-test.xml View File

@@ -241,4 +241,49 @@ x=1
<au:assertPropertyEquals name="tail.out" value="${tail.in}"/>
</target>


<target name="testPreservesDosLineEnds" depends="setUp"
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=50049">
<property name="test.txt" location="${output}/test.txt"/>
<echo file="${test.txt}"><![CDATA[
bbb=val2
aaa=val1
]]></echo>
<fixcrlf eol="dos" file="${test.txt}"/>
<propertyfile file="${test.txt}" comment="${header}"/>
<copy file="${test.txt}" tofile="${test.txt}.expected"/>
<fixcrlf eol="dos" file="${test.txt}.expected"/>
<au:assertFilesMatch expected="${test.txt}.expected"
actual="${test.txt}"/>
</target>

<target name="testPreservesUnixLineEnds" depends="setUp"
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=50049">
<property name="test.txt" location="${output}/test.txt"/>
<echo file="${test.txt}"><![CDATA[
bbb=val2
aaa=val1
]]></echo>
<fixcrlf eol="unix" file="${test.txt}"/>
<propertyfile file="${test.txt}" comment="${header}"/>
<copy file="${test.txt}" tofile="${test.txt}.expected"/>
<fixcrlf eol="unix" file="${test.txt}.expected"/>
<au:assertFilesMatch expected="${test.txt}.expected"
actual="${test.txt}"/>
</target>

<target name="testPreservesMacLineEnds" depends="setUp"
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=50049">
<property name="test.txt" location="${output}/test.txt"/>
<echo file="${test.txt}"><![CDATA[
bbb=val2
aaa=val1
]]></echo>
<fixcrlf eol="mac" file="${test.txt}"/>
<propertyfile file="${test.txt}" comment="${header}"/>
<copy file="${test.txt}" tofile="${test.txt}.expected"/>
<fixcrlf eol="mac" file="${test.txt}.expected"/>
<au:assertFilesMatch expected="${test.txt}.expected"
actual="${test.txt}"/>
</target>
</project>

Loading…
Cancel
Save