stevel 2004/01/07 09:49:37 Modified: src/testcases/org/apache/tools/ant/taskdefs TouchTest.java src/main/org/apache/tools/ant/util FileUtils.java src/main/org/apache/tools/ant/taskdefs Touch.java src/etc/testcases/taskdefs touch.xml docs/manual/CoreTasks touch.html Log: <touch> to handle filelists. Forced me to add more tests for new and existing touch code, and in the process note that the granularity for unix filesystems is not 0 but 1000 milliseconds. oops. PR: 23526 Submitted by: [EMAIL PROTECTED] Revision Changes Path 1.2 +86 -1 ant/src/testcases/org/apache/tools/ant/taskdefs/TouchTest.java Index: TouchTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/TouchTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TouchTest.java 24 Jun 2003 12:46:57 -0000 1.1 +++ TouchTest.java 7 Jan 2004 17:49:37 -0000 1.2 @@ -55,9 +55,15 @@ package org.apache.tools.ant.taskdefs; import org.apache.tools.ant.BuildFileTest; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.util.FileUtils; + +import java.io.File; public class TouchTest extends BuildFileTest { + private static String touchfile="src/etc/testcases/taskdefs/touchtest"; + public TouchTest(String name) { super(name); } @@ -69,13 +75,23 @@ public void tearDown() { executeTarget("cleanup"); } - + + public long getTargetTime() { + + File file = new File(touchfile); + if(!file.exists()) { + throw new BuildException("failed to touch file "+touchfile); + } + return file.lastModified(); + } + /** * No real test, simply checks whether the dateformat without * seconds is accepted - by erroring out otherwise. */ public void testNoSeconds() { executeTarget("noSeconds"); + long time = getTargetTime(); } /** @@ -84,5 +100,74 @@ */ public void testSeconds() { executeTarget("seconds"); + long time=getTargetTime(); + } + /** + * verify that the millis test sets things up + */ + public void testMillis() { + touchFile("testMillis", 1234567); + } + + /** + * verify that the default value defaults to now + */ + public void testNow() { + long now=System.currentTimeMillis(); + executeTarget("testNow"); + long time = getTargetTime(); + assertTimesNearlyMatch(time,now,5000); + } + /** + * verify that the millis test sets things up + */ + public void test1970() { + touchFile("test1970", 0); + } + + /** + * test the file list + */ + public void testFilelist() { + touchFile("testFilelist", 100000); + } + + /** + * test the file set + */ + public void testFileset() { + touchFile("testFileset", 200000); + } + + /** + * run a target to touch the test file; verify the timestamp is as expected + * @param targetName + * @param timestamp + */ + private void touchFile(String targetName, long timestamp) { + executeTarget(targetName); + long time = getTargetTime(); + assertTimesNearlyMatch(timestamp,time); + } + + /** + * assert that two times are within the current FS granularity; + * @param timestamp + * @param time + */ + public void assertTimesNearlyMatch(long timestamp,long time) { + long granularity= FileUtils.newFileUtils().getFileTimestampGranularity(); + assertTimesNearlyMatch(timestamp, time, granularity); + } + + /** + * assert that two times are within a specified range + * @param timestamp + * @param time + * @param range + */ + private void assertTimesNearlyMatch(long timestamp, long time, long range) { + assertTrue("Time "+timestamp+" is not within "+range+" ms of "+time, + Math.abs(time-timestamp)<=range); } } 1.60 +6 -2 ant/src/main/org/apache/tools/ant/util/FileUtils.java Index: FileUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- FileUtils.java 20 Nov 2003 12:08:17 -0000 1.59 +++ FileUtils.java 7 Jan 2004 17:49:37 -0000 1.60 @@ -116,6 +116,10 @@ */ public static final long FAT_FILE_TIMESTAMP_GRANULARITY = 2000; + /** + * the granularity of timestamps under Unix + */ + public static final long UNIX_FILE_TIMESTAMP_GRANULARITY = 1000; // stolen from FilePathToURI of the Xerces-J team static { @@ -1401,7 +1405,7 @@ if (Os.isFamily("dos")) { return FAT_FILE_TIMESTAMP_GRANULARITY; } else { - return 0; + return UNIX_FILE_TIMESTAMP_GRANULARITY; } } } 1.35 +41 -26 ant/src/main/org/apache/tools/ant/taskdefs/Touch.java Index: Touch.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Touch.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- Touch.java 19 Jul 2003 11:20:13 -0000 1.34 +++ Touch.java 7 Jan 2004 17:49:37 -0000 1.35 @@ -65,11 +65,13 @@ import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.FileList; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.JavaEnvUtils; /** - * Touch a file and/or fileset(s); corresponds to the Unix touch command. + * Touch a file and/or fileset(s) and/or filelist(s); + * corresponds to the Unix touch command. * * <p>If the file to touch doesn't exist, an empty one is * created. </p> @@ -91,6 +93,7 @@ private long millis = -1; private String dateTime; private Vector filesets = new Vector(); + private Vector filelists = new Vector(); private FileUtils fileUtils; public Touch() { @@ -132,14 +135,21 @@ } /** + * Add a filelist to touch + */ + public void addFilelist(FileList list) { + filelists.addElement(list); + } + + /** * Execute the touch operation. */ public void execute() throws BuildException { long savedMillis = millis; - if (file == null && filesets.size() == 0) { + if (file == null && filesets.size() == 0 && filelists.size() == 0) { throw - new BuildException("Specify at least one source - a file or " + new BuildException("Specify at least one source - a file, filelist or " + "a fileset."); } @@ -195,26 +205,9 @@ } /** - * Does the actual work. Entry point for Untar and Expand as well. + * Does the actual work; assumes everything has been checked by now. */ protected void touch() throws BuildException { - if (file != null) { - if (!file.exists()) { - log("Creating " + file, Project.MSG_INFO); - try { - fileUtils.createNewFile(file); - } catch (IOException ioe) { - throw new BuildException("Could not create " + file, ioe, - getLocation()); - } - } - } - - if (millis >= 0 && JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - log("modification time of files cannot be set in JDK 1.1", - Project.MSG_WARN); - return; - } boolean resetMillis = false; if (millis < 0) { @@ -244,21 +237,43 @@ } } + // deal with the filelists + for (int i = 0; i < filelists.size(); i++) { + FileList fl = (FileList) filelists.elementAt(i); + File fromDir = fl.getDir(getProject()); + + String[] srcFiles = fl.getFiles(getProject()); + + for (int j = 0; j < srcFiles.length; j++) { + touch(new File(fromDir, srcFiles[j])); + } + } + if (resetMillis) { millis = -1; } } + /** + * touch a single file with the current timestamp (this.millis) + * @param file file to touch + * @throws BuildException + */ protected void touch(File file) throws BuildException { + if (!file.exists()) { + log("Creating " + file, Project.MSG_INFO); + try { + fileUtils.createNewFile(file); + } catch (IOException ioe) { + throw new BuildException("Could not create " + file, ioe, + getLocation()); + } + } + if (!file.canWrite()) { throw new BuildException("Can not change modification date of " + "read-only file " + file); } - - if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - return; - } - fileUtils.setFileLastModified(file, millis); } 1.2 +26 -0 ant/src/etc/testcases/taskdefs/touch.xml Index: touch.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/touch.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- touch.xml 24 Jun 2003 12:46:56 -0000 1.1 +++ touch.xml 7 Jan 2004 17:49:37 -0000 1.2 @@ -12,4 +12,30 @@ <target name="seconds"> <touch file="touchtest" datetime="2003/06/24 2:20:12 pm"/> </target> + + <target name="testNow"> + <touch file="touchtest" /> + </target> + + <target name="testMillis"> + <touch file="touchtest" millis="1234567" /> + </target> + + <target name="test1970"> + <touch file="touchtest" millis="0" /> + </target> + + <target name="testFilelist"> + <touch millis="100000" > + <filelist dir="." files="touchtest"/> + </touch> + </target> + + <target name="testFileset" depends="testNow"> + <touch millis="200000" > + <fileset dir="." includes="touchtest"/> + </touch> + </target> + + </project> 1.9 +3 -2 ant/docs/manual/CoreTasks/touch.html Index: touch.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/touch.html,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- touch.html 24 Jun 2003 12:46:56 -0000 1.8 +++ touch.html 7 Jan 2004 17:49:37 -0000 1.9 @@ -12,7 +12,8 @@ <p>Changes the modification time of a file and possibly creates it at the same time. In addition to working with a single file, this Task can also work a <a href="../CoreTypes/fileset.html">Fileset</a> (which -also includes directories).</p> +also includes directories) +or a <a href="../CoreTypes/filelist.html">Filelist</a> (since Ant 1.6).</p> <p>For JDK 1.1 only the creation of new files with a modification time of now works, all other cases will emit a warning.</p> <h3>Parameters</h3> @@ -26,6 +27,7 @@ <td valign="top">file</td> <td valign="top">the name of the file</td> <td valign="top" align="center">unless a nested fileset element + or a nested filelist element has been specified.</td> </tr> <tr> @@ -67,4 +69,3 @@ </body> </html> -
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]