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]