mbenson 2004/08/31 14:34:36
Modified: . WHATSNEW
docs/manual/CoreTasks move.html
src/main/org/apache/tools/ant/taskdefs Move.java
src/etc/testcases/taskdefs move.xml
src/testcases/org/apache/tools/ant/taskdefs MoveTest.java
Log:
Allow <move>'s file attribute to rename a directory.
PR: 22863
Revision Changes Path
1.654 +4 -1 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.653
retrieving revision 1.654
diff -u -r1.653 -r1.654
--- WHATSNEW 25 Aug 2004 14:56:41 -0000 1.653
+++ WHATSNEW 31 Aug 2004 21:34:35 -0000 1.654
@@ -42,7 +42,10 @@
wsdl run on mono, as well as most of the .NET WSE2.0 options. Extra
schemas (files or urls) can be named in the <schema> element.
Compilers can be selected using the compiler attribute, which defaults
- to "microsoft" on windows, and "mono" on everything else.
+ to "microsoft" on windows, and "mono" on everything else.
+
+* Allow file attribute of <move> to rename a directory.
+ Bugzilla Report 22863.
Changes from Ant 1.6.2 to current Ant 1.6 CVS version
=====================================================
1.18 +10 -2 ant/docs/manual/CoreTasks/move.html
Index: move.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/CoreTasks/move.html,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- move.html 9 Feb 2004 21:50:05 -0000 1.17
+++ move.html 31 Aug 2004 21:34:35 -0000 1.18
@@ -16,6 +16,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>
@@ -25,7 +29,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>
@@ -78,7 +82,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.
@@ -154,6 +158,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>
1.46 +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.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- Move.java 9 Mar 2004 16:48:06 -0000 1.45
+++ Move.java 31 Aug 2004 21:34:35 -0000 1.46
@@ -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);
}
1.6 +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.6
diff -u -r1.5 -r1.6
--- move.xml 19 May 2003 14:27:43 -0000 1.5
+++ move.xml 31 Aug 2004 21:34:36 -0000 1.6
@@ -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>
1.13 +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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- MoveTest.java 9 Mar 2004 16:48:57 -0000 1.12
+++ MoveTest.java 31 Aug 2004 21:34:36 -0000 1.13
@@ -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]