git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@571970 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -21,6 +21,10 @@ Changes that could break older environments: | |||||
| in Ant 1.7.0 has been removed. | in Ant 1.7.0 has been removed. | ||||
| Bugzilla report 40511. | Bugzilla report 40511. | ||||
| * In the <touch> task when a <mapper> is used, the millis and datetime | |||||
| attributes now override the time of the source resource if provisioned. | |||||
| Bugzilla report 43235. | |||||
| Fixed bugs: | Fixed bugs: | ||||
| ----------- | ----------- | ||||
| @@ -56,7 +56,9 @@ resource collections (which also includes directories). Prior to Ant | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">datetime</td> | <td valign="top">datetime</td> | ||||
| <td valign="top">Specifies the new modification time of the file.</td> | |||||
| <td valign="top">Specifies the new modification time of the file. The | |||||
| special value "now" indicates the current time | |||||
| (now supported since Ant 1.8).</td> | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">pattern</td> | <td valign="top">pattern</td> | ||||
| @@ -99,9 +101,12 @@ collection.</p> | |||||
| mapper</a> can be specified. Files specified via nested | mapper</a> can be specified. Files specified via nested | ||||
| <code>fileset</code>s, <code>filelist</code>s, or the <code>file</code> | <code>fileset</code>s, <code>filelist</code>s, or the <code>file</code> | ||||
| attribute are mapped using the specified mapper. For each file mapped, | attribute are mapped using the specified mapper. For each file mapped, | ||||
| the resulting files are touched. If the original file exists its | |||||
| timestamp will be used. Otherwise the task settings (<code>millis</code>, | |||||
| <code>datetime</code>) take effect.</p> | |||||
| the resulting files are touched. If no time has been specified and | |||||
| the original file exists its timestamp will be used. | |||||
| If no time has been specified and the original file does not exist the | |||||
| current time is used. Since Ant 1.8 the task settings (<code>millis</code>, | |||||
| and <code>datetime</code>) have priority over the timestamp of the original | |||||
| file.</p> | |||||
| <h3>Examples</h3> | <h3>Examples</h3> | ||||
| <pre> <touch file="myfile"/></pre> | <pre> <touch file="myfile"/></pre> | ||||
| <p>creates <code>myfile</code> if it doesn't exist and changes the | <p>creates <code>myfile</code> if it doesn't exist and changes the | ||||
| @@ -127,6 +132,14 @@ time close to it otherwise.</p> | |||||
| <p>creates <code>bar</code> if it doesn't exist and changes the | <p>creates <code>bar</code> if it doesn't exist and changes the | ||||
| modification time to that of <code>foo</code>.</p> | modification time to that of <code>foo</code>.</p> | ||||
| <pre> <touch file="foo" datetime="now"> | |||||
| <mapper type="regexp" from="^src(.*)\.java" to="shadow\1.empty" /> | |||||
| </touch> | |||||
| </pre> | |||||
| <p>creates files in the <code>shadow</code> directory for every java file in the | |||||
| <code>src</code> directory if it doesn't exist and changes the modification | |||||
| time of those files to the current time.</p> | |||||
| </body> | </body> | ||||
| </html> | </html> | ||||
| @@ -231,44 +231,48 @@ public class Touch extends Task { | |||||
| } | } | ||||
| if (dateTime != null && !dateTimeConfigured) { | if (dateTime != null && !dateTimeConfigured) { | ||||
| long workmillis = millis; | long workmillis = millis; | ||||
| DateFormat df = dfFactory.getPrimaryFormat(); | |||||
| ParseException pe = null; | |||||
| try { | |||||
| workmillis = df.parse(dateTime).getTime(); | |||||
| } catch (ParseException peOne) { | |||||
| df = dfFactory.getFallbackFormat(); | |||||
| if (df == null) { | |||||
| pe = peOne; | |||||
| } else { | |||||
| try { | |||||
| workmillis = df.parse(dateTime).getTime(); | |||||
| } catch (ParseException peTwo) { | |||||
| pe = peTwo; | |||||
| if ("now".equalsIgnoreCase(dateTime)) { | |||||
| workmillis = System.currentTimeMillis(); | |||||
| } else { | |||||
| DateFormat df = dfFactory.getPrimaryFormat(); | |||||
| ParseException pe = null; | |||||
| try { | |||||
| workmillis = df.parse(dateTime).getTime(); | |||||
| } catch (ParseException peOne) { | |||||
| df = dfFactory.getFallbackFormat(); | |||||
| if (df == null) { | |||||
| pe = peOne; | |||||
| } else { | |||||
| try { | |||||
| workmillis = df.parse(dateTime).getTime(); | |||||
| } catch (ParseException peTwo) { | |||||
| pe = peTwo; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| if (pe != null) { | |||||
| throw new BuildException(pe.getMessage(), pe, getLocation()); | |||||
| } | |||||
| if (workmillis < 0) { | |||||
| throw new BuildException("Date of " + dateTime | |||||
| + " results in negative " | |||||
| + "milliseconds value " | |||||
| + "relative to epoch " | |||||
| + "(January 1, 1970, " | |||||
| + "00:00:00 GMT)."); | |||||
| if (pe != null) { | |||||
| throw new BuildException(pe.getMessage(), pe, getLocation()); | |||||
| } | |||||
| if (workmillis < 0) { | |||||
| throw new BuildException("Date of " + dateTime | |||||
| + " results in negative " + "milliseconds value " | |||||
| + "relative to epoch " + "(January 1, 1970, " | |||||
| + "00:00:00 GMT)."); | |||||
| } | |||||
| } | } | ||||
| log("Setting millis to " + workmillis + " from datetime attribute", | log("Setting millis to " + workmillis + " from datetime attribute", | ||||
| ((millis < 0) ? Project.MSG_DEBUG : Project.MSG_VERBOSE)); | |||||
| ((millis < 0) ? Project.MSG_DEBUG : Project.MSG_VERBOSE)); | |||||
| setMillis(workmillis); | setMillis(workmillis); | ||||
| //only set if successful to this point: | |||||
| // only set if successful to this point: | |||||
| dateTimeConfigured = true; | dateTimeConfigured = true; | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Execute the touch operation. | * Execute the touch operation. | ||||
| * @throws BuildException if an error occurs. | |||||
| * | |||||
| * @throws BuildException | |||||
| * if an error occurs. | |||||
| */ | */ | ||||
| public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
| checkConfiguration(); | checkConfiguration(); | ||||
| @@ -339,8 +343,10 @@ public class Touch extends Task { | |||||
| } else { | } else { | ||||
| String[] mapped = fileNameMapper.mapFileName(r.getName()); | String[] mapped = fileNameMapper.mapFileName(r.getName()); | ||||
| if (mapped != null && mapped.length > 0) { | if (mapped != null && mapped.length > 0) { | ||||
| long modTime = (r.isExists()) ? r.getLastModified() | |||||
| : defaultTimestamp; | |||||
| long modTime = defaultTimestamp; | |||||
| if (millis < 0 && r.isExists()){ | |||||
| modTime = r.getLastModified(); | |||||
| } | |||||
| for (int i = 0; i < mapped.length; i++) { | for (int i = 0; i < mapped.length; i++) { | ||||
| touch(getProject().resolveFile(mapped[i]), modTime); | touch(getProject().resolveFile(mapped[i]), modTime); | ||||
| } | } | ||||