mbenson 2004/08/31 14:51:49 Modified: . Tag: ANT_16_BRANCH WHATSNEW docs/manual/CoreTasks Tag: ANT_16_BRANCH move.html src/etc/testcases/taskdefs Tag: ANT_16_BRANCH move.xml src/main/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH Move.java src/testcases/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH MoveTest.java Log: Merge PR: 22863 Revision Changes Path No revision No revision 1.503.2.131 +3 -0 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.503.2.130 retrieving revision 1.503.2.131 diff -u -r1.503.2.130 -r1.503.2.131 --- WHATSNEW 25 Aug 2004 14:58:09 -0000 1.503.2.130 +++ WHATSNEW 31 Aug 2004 21:51:49 -0000 1.503.2.131 @@ -12,6 +12,9 @@ * Javadoc fixes for Location, Project, and RuntimeConfigurable Bugzilla 30160. +* Allow file attribute of <move> to rename a directory. + Bugzilla Report 22863. + Fixed bugs: ----------- No revision No revision 1.14.2.4 +20 -2 ant/docs/manual/CoreTasks/move.html Index: move.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/move.html,v retrieving revision 1.14.2.3 retrieving revision 1.14.2.4 diff -u -r1.14.2.3 -r1.14.2.4 --- move.html 9 Feb 2004 22:12:07 -0000 1.14.2.3 +++ move.html 31 Aug 2004 21:51:49 -0000 1.14.2.4 @@ -17,6 +17,10 @@ the destination file, or when the destination file does not exist.</p> <p><a href="../CoreTypes/fileset.html">FileSet</a>s are used to select sets of files to move to the <var>todir</var> directory.</p> +<p><b>Since Ant 1.6.3</b>, the <i>file</i> attribute may be used to move +(rename) an entire directory. If <i>tofile</i> denotes an existing file, or +there is a directory by the same name in <i>todir</i>, the action will fail. +</p> <h3>Parameters</h3> <table border="1" cellpadding="2" cellspacing="0"> <tr> @@ -26,7 +30,7 @@ </tr> <tr> <td valign="top">file</td> - <td valign="top">the file to move</td> + <td valign="top">the file or directory to move</td> <td valign="top" align="center">One of <var>file</var> or at least one nested fileset element</td> </tr> @@ -79,7 +83,7 @@ </tr> <tr> <td valign="top">failonerror</td> - <td valign="top">Log a warning message, but do not stop the + <td valign="top">If false, log a warning message, but do not stop the build, when the file to copy does not exist or one of the nested filesets points to a directory that doesn't exist or an error occurs while moving. @@ -114,6 +118,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> @@ -145,6 +159,10 @@ <move todir="new/dir/to/move/to"> <fileset dir="src/dir"/> </move> +</pre> + <i>or, since Ant 1.6.3:</i> +<pre> + <move file="src/dir" tofile="new/dir/to/move/to" /> </pre> <p><b>Move a set of files to a new directory</b></p> <pre> No revision No revision 1.5.2.1 +69 -2 ant/src/etc/testcases/taskdefs/move.xml Index: move.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/move.xml,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -u -r1.5 -r1.5.2.1 --- move.xml 19 May 2003 14:27:43 -0000 1.5 +++ move.xml 31 Aug 2004 21:51:49 -0000 1.5.2.1 @@ -59,11 +59,78 @@ </move> </target> + <target name="testCompleteDirectoryMoveFileToFile"> + <mkdir dir="A"/> + <touch file="A/1"/> + <move file="A" tofile="E" /> + <fail message="E/1 not available"> + <condition> + <not> + <available file="E/1" type="file" /> + </not> + </condition> + </fail> + <fail message="A remains"> + <condition> + <available file="A" type="dir" /> + </condition> + </fail> + </target> + + <target name="testCompleteDirectoryMoveFileToDir"> + <mkdir dir="A"/> + <touch file="A/1"/> + <move file="A" todir="E" /> + <fail message="E/A/1 not available"> + <condition> + <not> + <available file="E/A/1" type="file" /> + </not> + </condition> + </fail> + <fail message="A remains"> + <condition> + <available file="A" type="dir" /> + </condition> + </fail> + </target> + + <target name="testCompleteDirectoryMoveFileToExistingFile"> + <mkdir dir="A"/> + <touch file="A/1"/> + <touch file="B"/> + <move file="A" tofile="B" /> + </target> + + <target name="testCompleteDirectoryMoveFileToExistingDir"> + <mkdir dir="A"/> + <touch file="A/1"/> + <mkdir dir="E"/> + <move file="A" tofile="E" /> + </target> + + <target name="testCompleteDirectoryMoveFileToDirWithExistingFile"> + <mkdir dir="A"/> + <touch file="A/1"/> + <mkdir dir="E"/> + <touch file="E/A"/> + <move file="A" todir="E" /> + </target> + + <target name="testCompleteDirectoryMoveFileToDirWithExistingDir"> + <mkdir dir="A"/> + <touch file="A/1"/> + <mkdir dir="E"/> + <mkdir dir="E/A"/> + <move file="A" todir="E" /> + </target> + <target name="cleanup"> <delete file="move.filterset.tmp"/> <delete file="move.filterchain.tmp"/> - <delete dir="A"/> - <delete dir="E"/> + <delete dir="A" /> + <delete file="B" /> + <delete dir="E" /> </target> </project> No revision No revision 1.41.2.5 +64 -10 ant/src/main/org/apache/tools/ant/taskdefs/Move.java Index: Move.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Move.java,v retrieving revision 1.41.2.4 retrieving revision 1.41.2.5 diff -u -r1.41.2.4 -r1.41.2.5 --- Move.java 9 Mar 2004 17:01:34 -0000 1.41.2.4 +++ Move.java 31 Aug 2004 21:51:49 -0000 1.41.2.5 @@ -61,6 +61,58 @@ setOverwrite(true); } + /** + * Performs the move operation. + */ + public void execute() throws BuildException { + if (file != null && file.isDirectory()) { + if (destFile != null && destDir != null) { + throw new BuildException("Only one of tofile and todir " + + "may be set."); + } + + if (destFile == null && destDir == null) { + throw new BuildException("One of tofile or todir must be set."); + } + + destFile = (destFile != null) + ? destFile : new File(destDir, file.getName()); + + try { + boolean renamed = false; + log("Moving directory " + file + + " to " + destFile, Project.MSG_INFO); + try { + renamed = + renameFile(file, destFile, filtering, forceOverwrite); + } catch (IOException eyeOhEx) { + throw new BuildException(eyeOhEx.getMessage()); + } + if (!renamed) { + StringBuffer buf = new StringBuffer( + "Failed to move directory ").append( + file.getAbsolutePath()); + + if ((getFilterChains() != null && getFilterChains().size() > 0) + || (getFilterSets() != null && getFilterSets().size() > 0) + || filtering) { + buf.append( + "; use a fileset to move directories with filtering"); + } + throw new BuildException(buf.append('.').toString()); + } + } catch (BuildException e) { + if (!failonerror) { + log("Warning: " + e.getMessage(), Project.MSG_ERR); + } else { + throw e; + } + } + } else { + super.execute(); + } + } + //************************************************************************ // protected and private methods //************************************************************************ @@ -325,17 +377,19 @@ } else { if (!filtering) { // ensure that parent dir of dest file exists! - // not using getParentFile method to stay 1.1 compatibility - String parentPath = destFile.getParent(); - if (parentPath != null) { - File parent = new File(parentPath); - if (!parent.exists()) { - parent.mkdirs(); - } + File parent = destFile.getParentFile(); + if (parent != null && !parent.exists()) { + parent.mkdirs(); } - if (destFile.exists() && destFile.isFile()) { - if (!destFile.delete()) { + if (destFile.exists()) { + if (sourceFile.isDirectory()) { + throw new BuildException( + new StringBuffer("Cannot replace ").append( + ((destFile.isFile()) ? "file " : "directory ")).append( + destFile).append(" with directory ").append( + sourceFile).toString()); + } else if (destFile.isFile() && !destFile.delete()) { throw new BuildException("Unable to remove existing " + "file " + destFile); } No revision No revision 1.8.2.5 +29 -0 ant/src/testcases/org/apache/tools/ant/taskdefs/MoveTest.java Index: MoveTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/MoveTest.java,v retrieving revision 1.8.2.4 retrieving revision 1.8.2.5 diff -u -r1.8.2.4 -r1.8.2.5 --- MoveTest.java 9 Mar 2004 17:02:01 -0000 1.8.2.4 +++ MoveTest.java 31 Aug 2004 21:51:49 -0000 1.8.2.5 @@ -88,4 +88,33 @@ assertTrue(!getProject().resolveFile("A/1").exists()); assertTrue(!getProject().resolveFile("A").exists()); } + + public void testCompleteDirectoryMoveFileToFile() { + executeTarget("testCompleteDirectoryMoveFileToFile"); + } + + public void testCompleteDirectoryMoveFileToDir() { + executeTarget("testCompleteDirectoryMoveFileToDir"); + } + + public void testCompleteDirectoryMoveFileToExistingFile() { + expectBuildExceptionContaining("testCompleteDirectoryMoveFileToExistingFile", + "", "Cannot replace file"); + } + + public void testCompleteDirectoryMoveFileToExistingDir() { + expectBuildExceptionContaining("testCompleteDirectoryMoveFileToExistingDir", + "", "Cannot replace directory"); + } + + public void testCompleteDirectoryMoveFileToDirWithExistingFile() { + expectBuildExceptionContaining("testCompleteDirectoryMoveFileToDirWithExistingFile", + "", "Cannot replace file"); + } + + public void testCompleteDirectoryMoveFileToDirWithExistingDir() { + expectBuildExceptionContaining("testCompleteDirectoryMoveFileToDirWithExistingDir", + "", "Cannot replace directory"); + } + }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]