Browse Source

Don't add new Date comments each time the file is written. PR 48558

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@902004 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 15 years ago
parent
commit
127dbbc943
4 changed files with 94 additions and 10 deletions
  1. +2
    -2
      WHATSNEW
  2. +16
    -0
      src/main/org/apache/tools/ant/util/DateUtils.java
  3. +26
    -8
      src/main/org/apache/tools/ant/util/LayoutPreservingProperties.java
  4. +50
    -0
      src/tests/antunit/taskdefs/optional/propertyfilelayout-test.xml

+ 2
- 2
WHATSNEW View File

@@ -20,8 +20,8 @@ Fixed bugs:
* <scp> task didn't report build file location when a remote operation failed
Bugzilla Report 48578.

* <propertyfile> would add the same comment each time it updated an
existing property file.
* <propertyfile> would add the same comment and a date line each time
it updated an existing property file.
Bugzilla Report 48558.

Other changes:


+ 16
- 0
src/main/org/apache/tools/ant/util/DateUtils.java View File

@@ -232,6 +232,22 @@ public final class DateUtils {
}
}

/**
* Parses the string in a format suitable for a SMTP date header.
*
* @param datestr string to be parsed
*
* @return a java.util.Date object as parsed by the format.
* @exception ParseException if the supplied string cannot be parsed by
* this pattern.
* @since Ant 1.8.0
*/
public static Date parseDateFromHeader(String datestr) throws ParseException {
synchronized (DATE_HEADER_FORMAT_INT) {
return DATE_HEADER_FORMAT_INT.parse(datestr);
}
}

/**
* Parse a string as a datetime using the ISO8601_DATETIME format which is
* <code>yyyy-MM-dd'T'HH:mm:ss</code>


+ 26
- 8
src/main/org/apache/tools/ant/util/LayoutPreservingProperties.java View File

@@ -253,20 +253,38 @@ public class LayoutPreservingProperties extends Properties {
public void store(OutputStream out, String header) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(out, "ISO-8859-1");

int skipLines = 0;
int totalLines = logicalLines.size();

if (header != null) {
osw.write("#" + header + LS);
if (totalLines > 0
&& logicalLines.get(0) instanceof Comment
&& header.equals(logicalLines.get(0).toString().substring(1))) {
skipLines = 1;
}
}
osw.write("#" + (new Date()).toString() + LS);

// we may be updatiung a file written by this class, replace
// the date comment instead of adding a new one and preserving
// the one written last time
if (totalLines > skipLines
&& logicalLines.get(skipLines) instanceof Comment) {
try {
DateUtils.parseDateFromHeader(logicalLines
.get(skipLines)
.toString().substring(1));
skipLines++;
} catch (java.text.ParseException pe) {
// not an existing date comment
}
}
osw.write("#" + DateUtils.getDateForHeader() + LS);

boolean writtenSep = false;
boolean maySkipComment = header != null;
for (Iterator i = logicalLines.iterator(); i.hasNext();
maySkipComment = false) {
for (Iterator i = logicalLines.subList(skipLines, totalLines).iterator();
i.hasNext(); ) {
LogicalLine line = (LogicalLine) i.next();
if (maySkipComment && line instanceof Comment &&
header.equals(line.toString().substring(1))) {
continue;
}
if (line instanceof Pair) {
if (((Pair)line).isNew()) {
if (!writtenSep) {


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

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

<target name="testRepeatedUpdateWithoutComment" depends="-updateSetUp">
<pf/>
<pf/>
<local name="head.in"/>
<local name="head.out"/>
<loadfile srcfile="${input}/initial.properties" property="head.in"/>
<!-- skip date -->
<loadfile srcfile="${output}/created.properties" property="head.out">
<filterchain>
<headfilter skip="1"/>
</filterchain>
</loadfile>
<au:assertPropertyEquals name="head.out" value="${head.in}"/>
</target>

<target name="testRepeatedUpdateWithSameComment" depends="-updateSetUp">
<pf comment="my comment"/>
<pf comment="my comment"/>
<local name="head.in"/>
<local name="head.out"/>
<local name="tail.in"/>
<local name="tail.out"/>
<!-- just comment -->
<loadfile srcfile="${input}/initial.properties" property="head.in">
<filterchain>
<headfilter lines="1"/>
</filterchain>
</loadfile>
<!-- just comment -->
<loadfile srcfile="${output}/created.properties" property="head.out">
<filterchain>
<headfilter lines="1"/>
</filterchain>
</loadfile>
<!-- skip comment -->
<loadfile srcfile="${input}/initial.properties" property="tail.in">
<filterchain>
<headfilter skip="1"/>
</filterchain>
</loadfile>
<!-- skip comment and date -->
<loadfile srcfile="${output}/created.properties" property="tail.out">
<filterchain>
<headfilter skip="2"/>
</filterchain>
</loadfile>
<au:assertPropertyEquals name="head.out" value="${head.in}"/>
<au:assertPropertyEquals name="tail.out" value="${tail.in}"/>
</target>

</project>

Loading…
Cancel
Save