bodewig 2003/09/23 06:16:05 Modified: docs/manual/CoreTasks copy.html move.html sync.html src/main/org/apache/tools/ant/taskdefs Copy.java Sync.java src/main/org/apache/tools/ant/util ResourceUtils.java SourceFileScanner.java Log: Add a granularity attribute to <copy>, <move> and <sync> that works the same way as the attribute of the <depend> selector. PR: 22150 Revision Changes Path 1.20 +10 -0 ant/docs/manual/CoreTasks/copy.html Index: copy.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/copy.html,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- copy.html 24 Jul 2003 13:14:20 -0000 1.19 +++ copy.html 23 Sep 2003 13:16:04 -0000 1.20 @@ -135,6 +135,16 @@ <em>since Ant 1.6</em>.</td> <td align="center">No - defaults to false.</td> </tr> + <tr> + <td valign="top">granularity</td> + <td valign="top">The number of milliseconds leeway to give before + deciding a file is out of date. This is needed because not every + file system supports tracking the last modified time to the + millisecond level. Default is 0 milliseconds, or 2 seconds on DOS + systems. This can also be useful if source and target files live + on separate machines with clocks being out of sync. <em>since Ant + 1.6</em>.</td> + </tr> </table> <h3>Parameters specified as nested elements</h3> 1.15 +10 -0 ant/docs/manual/CoreTasks/move.html Index: move.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/move.html,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- move.html 24 Jul 2003 13:14:20 -0000 1.14 +++ move.html 23 Sep 2003 13:16:04 -0000 1.15 @@ -113,6 +113,16 @@ <em>since Ant 1.6</em>.</td> <td align="center">No - defaults to false.</td> </tr> + <tr> + <td valign="top">granularity</td> + <td valign="top">The number of milliseconds leeway to give before + deciding a file is out of date. This is needed because not every + file system supports tracking the last modified time to the + millisecond level. Default is 0 milliseconds, or 2 seconds on DOS + systems. This can also be useful if source and target files live + on separate machines with clocks being out of sync. <em>since Ant + 1.6</em>.</td> + </tr> </table> <h3>Parameters specified as nested elements</h3> <h4>mapper</h4> 1.4 +10 -0 ant/docs/manual/CoreTasks/sync.html Index: sync.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/sync.html,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- sync.html 14 May 2003 11:58:18 -0000 1.3 +++ sync.html 23 Sep 2003 13:16:04 -0000 1.4 @@ -51,6 +51,16 @@ <td valign="top">Log the files that are being copied.</td> <td valign="top" align="center">No; defaults to false.</td> </tr> + <tr> + <td valign="top">granularity</td> + <td valign="top">The number of milliseconds leeway to give before + deciding a file is out of date. This is needed because not every + file system supports tracking the last modified time to the + millisecond level. Default is 0 milliseconds, or 2 seconds on DOS + systems. This can also be useful if source and target files live + on separate machines with clocks being out of sync. <em>since Ant + 1.6</em>.</td> + </tr> </table> <h3>Parameters specified as nested elements</h3> 1.67 +18 -3 ant/src/main/org/apache/tools/ant/taskdefs/Copy.java Index: Copy.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Copy.java,v retrieving revision 1.66 retrieving revision 1.67 diff -u -r1.66 -r1.67 --- Copy.java 16 Sep 2003 09:08:55 -0000 1.66 +++ Copy.java 23 Sep 2003 13:16:04 -0000 1.67 @@ -121,12 +121,14 @@ private FileUtils fileUtils; private String inputEncoding = null; private String outputEncoding = null; + private long granularity = 0; /** * Copy task constructor. */ public Copy() { fileUtils = FileUtils.newFileUtils(); + granularity = fileUtils.getFileTimestampGranularity(); } /** @@ -371,6 +373,18 @@ } /** + * The number of milliseconds leeway to give before deciding a + * target is out of date. + * + * <p>Default is 0 milliseconds, or 2 seconds on DOS systems.</p> + * + * @since Ant 1.6 + */ + public void setGranularity(long granularity) { + this.granularity = granularity; + } + + /** * Performs the copy operation. * @exception BuildException if an error occurs */ @@ -397,7 +411,8 @@ } if (forceOverwrite || !destFile.exists() - || (file.lastModified() > destFile.lastModified())) { + || (file.lastModified() - granularity + > destFile.lastModified())) { fileCopyMap.put(file.getAbsolutePath(), new String[] {destFile.getAbsolutePath()}); } else { @@ -583,7 +598,7 @@ v.copyInto(toCopy); } else { SourceFileScanner ds = new SourceFileScanner(this); - toCopy = ds.restrict(names, fromDir, toDir, mapper); + toCopy = ds.restrict(names, fromDir, toDir, mapper, granularity); } for (int i = 0; i < toCopy.length; i++) { 1.8 +13 -1 ant/src/main/org/apache/tools/ant/taskdefs/Sync.java Index: Sync.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Sync.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Sync.java 16 Sep 2003 09:08:55 -0000 1.7 +++ Sync.java 23 Sep 2003 13:16:04 -0000 1.8 @@ -323,6 +323,18 @@ } /** + * The number of milliseconds leeway to give before deciding a + * target is out of date. + * + * <p>Default is 0 milliseconds, or 2 seconds on DOS systems.</p> + * + * @since Ant 1.6 + */ + public void setGranularity(long granularity) { + _copy.setGranularity(granularity); + } + + /** * Subclass Copy in order to access it's file/dir maps. */ public static class MyCopy extends Copy { 1.5 +33 -15 ant/src/main/org/apache/tools/ant/util/ResourceUtils.java Index: ResourceUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/ResourceUtils.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ResourceUtils.java 19 Jul 2003 08:11:08 -0000 1.4 +++ ResourceUtils.java 23 Sep 2003 13:16:04 -0000 1.5 @@ -58,6 +58,7 @@ import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.ResourceFactory; +import org.apache.tools.ant.types.selectors.SelectorUtils; import java.io.File; import java.util.Vector; @@ -70,7 +71,7 @@ */ public class ResourceUtils { - /** { + /** * tells which source files should be reprocessed based on the * last modification date of target files * @param logTo where to send (more or less) interesting output @@ -88,19 +89,34 @@ Resource[] source, FileNameMapper mapper, ResourceFactory targets) { - long now = (new java.util.Date()).getTime(); + return selectOutOfDateSources(logTo, source, mapper, targets, + FileUtils.newFileUtils() + .getFileTimestampGranularity()); + } - /* - If we're on Windows, we have to munge the time up to 2 secs to - be able to check file modification times. - (Windows has a max resolution of two secs for modification times) - Actually this is a feature of the FAT file system, NTFS does - not have it, so if we could reliably passively test for an NTFS - file systems we could turn this off... - */ - if (Os.isFamily("windows")) { - now += 2000; - } + /** + * tells which source files should be reprocessed based on the + * last modification date of target files + * @param logTo where to send (more or less) interesting output + * @param source array of resources bearing relative path and last + * modification date + * @param mapper filename mapper indicating how to find the target + * files + * @param targets object able to map as a resource a relative path + * at <b>destination</b> + * @param granularity The number of milliseconds leeway to give + * before deciding a target is out of date. + * @return array containing the source files which need to be + * copied or processed, because the targets are out of date or do + * not exist + * @since Ant 1.6 + */ + public static Resource[] selectOutOfDateSources(ProjectComponent logTo, + Resource[] source, + FileNameMapper mapper, + ResourceFactory targets, + long granularity) { + long now = (new java.util.Date()).getTime() + granularity; Vector vresult = new Vector(); for (int counter = 0; counter < source.length; counter++) { @@ -130,8 +146,10 @@ + " doesn\'t exist.", Project.MSG_VERBOSE); vresult.addElement(source[counter]); added = true; - } else if (!atarget.isDirectory() && atarget.getLastModified() - < source[counter].getLastModified()) { + } else if (!atarget.isDirectory() && + SelectorUtils.isOutOfDate(source[counter], + atarget, + (int) granularity)) { logTo.log(source[counter].getName() + " added as " + atarget.getName() + " is outdated.", Project.MSG_VERBOSE); 1.22 +36 -2 ant/src/main/org/apache/tools/ant/util/SourceFileScanner.java Index: SourceFileScanner.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/SourceFileScanner.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- SourceFileScanner.java 19 Jul 2003 08:11:08 -0000 1.21 +++ SourceFileScanner.java 23 Sep 2003 13:16:04 -0000 1.22 @@ -99,6 +99,27 @@ */ public String[] restrict(String[] files, File srcDir, File destDir, FileNameMapper mapper) { + return restrict(files, srcDir, destDir, mapper, + fileUtils.getFileTimestampGranularity()); + } + + /** + * Restrict the given set of files to those that are newer than + * their corresponding target files. + * + * @param files the original set of files + * @param srcDir all files are relative to this directory + * @param destDir target files live here. if null file names + * returned by the mapper are assumed to be absolute. + * @param mapper knows how to construct a target file names from + * source file names. + * @param granularity The number of milliseconds leeway to give + * before deciding a target is out of date. + * + * @since Ant 1.6 + */ + public String[] restrict(String[] files, File srcDir, File destDir, + FileNameMapper mapper, long granularity) { // record destdir for later use in getResource this.destDir = destDir; Vector v = new Vector(); @@ -114,7 +135,7 @@ // respect to the target Resource[] outofdate = ResourceUtils.selectOutOfDateSources(task, sourceresources, - mapper, this); + mapper, this, granularity); String[] result = new String[outofdate.length]; for (int counter = 0; counter < outofdate.length; counter++) { result[counter] = outofdate[counter].getName(); @@ -129,7 +150,20 @@ */ public File[] restrictAsFiles(String[] files, File srcDir, File destDir, FileNameMapper mapper) { - String[] res = restrict(files, srcDir, destDir, mapper); + return restrictAsFiles(files, srcDir, destDir, mapper, + fileUtils.getFileTimestampGranularity()); + } + + /** + * Convinience layer on top of restrict that returns the source + * files as File objects (containing absolute paths if srcDir is + * absolute). + * + * @since Ant 1.6 + */ + public File[] restrictAsFiles(String[] files, File srcDir, File destDir, + FileNameMapper mapper, long granularity) { + String[] res = restrict(files, srcDir, destDir, mapper, granularity); File[] result = new File[res.length]; for (int i = 0; i < res.length; i++) { result[i] = new File(srcDir, res[i]);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]