You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2008/09/04 16:57:06 UTC
svn commit: r692081 - in /ant/core/trunk: WHATSNEW
src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
src/tests/antunit/core/dirscanner-symlinks-test.xml
src/tests/antunit/taskdefs/optional/unix/symlink-test.xml
Author: bodewig
Date: Thu Sep 4 07:57:04 2008
New Revision: 692081
URL: http://svn.apache.org/viewvc?rev=692081&view=rev
Log:
symlink delete now works if the link points to a parent directory as well. PR 45743.
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
ant/core/trunk/src/tests/antunit/core/dirscanner-symlinks-test.xml
ant/core/trunk/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml
Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=692081&r1=692080&r2=692081&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Thu Sep 4 07:57:04 2008
@@ -196,6 +196,10 @@
contained line feeds some excess output ended up in Ant's log.
Bugzilla Report 45411.
+ * <symlink action="delete"> failed to delete a link that pointed to
+ a parent directory.
+ Bugzilla Report 45743.
+
Other changes:
--------------
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java?rev=692081&r1=692080&r2=692081&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java Thu Sep 4 07:57:04 2008
@@ -386,13 +386,19 @@
* <p>This is a utility method that removes a unix symlink without removing
* the resource that the symlink points to. If it is accidentally invoked
* on a real file, the real file will not be harmed, but an exception
- * will be thrown when the deletion is attempted. This method works by
+ * will be thrown when the deletion is attempted.</p>
+ *
+ * <p>Normaly this method works by
* getting the canonical path of the link, using the canonical path to
* rename the resource (breaking the link) and then deleting the link.
* The resource is then returned to its original name inside a finally
* block to ensure that the resource is unharmed even in the event of
* an exception.</p>
*
+ * <p>There may be cases where the algorithm described above doesn't work,
+ * in that case the method tries to use the native "rm" command on
+ * the symlink instead.</p>
+ *
* <p>Since Ant 1.8.0 this method will try to delete the File object if
* it reports it wouldn't exist (as symlinks pointing nowhere usually do).
* Prior version would throw a FileNotFoundException in that case.</p>
@@ -410,12 +416,22 @@
linkfil.delete();
return;
}
+
// find the resource of the existing link:
File canfil = linkfil.getCanonicalFile();
// rename the resource, thus breaking the link:
File temp = FILE_UTILS.createTempFile("symlink", ".tmp",
- canfil.getParentFile(), false, false);
+ canfil.getParentFile(), false,
+ false);
+
+ if (FILE_UTILS.isLeadingPath(canfil, linkfil)) {
+ // link points to a parent directory, renaming the parent
+ // will rename the file
+ linkfil = new File(temp,
+ FILE_UTILS.removeLeadingPath(canfil, linkfil));
+ }
+
try {
try {
FILE_UTILS.rename(canfil, temp);
Modified: ant/core/trunk/src/tests/antunit/core/dirscanner-symlinks-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/core/dirscanner-symlinks-test.xml?rev=692081&r1=692080&r2=692081&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/core/dirscanner-symlinks-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/core/dirscanner-symlinks-test.xml Thu Sep 4 07:57:04 2008
@@ -81,9 +81,7 @@
<copy todir="${output}">
<fileset dir="${base}" followsymlinks="true"/>
</copy>
- <exec executable="rm">
- <arg file="${base}/A"/>
- </exec>
+ <symlink action="delete" link="${base}/A"/>
<au:assertFileExists file="${output}/A/B/file.txt"/>
</target>
@@ -95,9 +93,7 @@
<include name="A/B/*"/>
</fileset>
</copy>
- <exec executable="rm">
- <arg file="${base}/A"/>
- </exec>
+ <symlink action="delete" link="${base}/A"/>
<au:assertFileExists file="${output}/A/B/file.txt"/>
</target>
@@ -110,9 +106,7 @@
<include name="A/base/A/B/*"/>
</fileset>
</copy>
- <exec executable="rm">
- <arg file="${base}/A"/>
- </exec>
+ <symlink action="delete" link="${base}/A"/>
<au:assertFileExists file="${output}/A/base/A/B/file.txt"/>
</target>
@@ -122,9 +116,7 @@
<copy todir="${output}">
<fileset dir="${base}" followsymlinks="false"/>
</copy>
- <exec executable="rm">
- <arg file="${base}/A"/>
- </exec>
+ <symlink action="delete" link="${base}/A"/>
<au:assertFileDoesntExist file="${output}/A/B/file.txt"/>
</target>
@@ -134,9 +126,7 @@
<copy todir="${output}">
<fileset dir="${base}" followsymlinks="true"/>
</copy>
- <exec executable="rm">
- <arg file="${base}"/>
- </exec>
+ <symlink action="delete" link="${base}"/>
<assertDirIsEmpty/>
</target>
@@ -146,9 +136,7 @@
<copy todir="${output}">
<fileset dir="${base}" followsymlinks="false"/>
</copy>
- <exec executable="rm">
- <arg file="${base}"/>
- </exec>
+ <symlink action="delete" link="${base}"/>
<assertDirIsEmpty/>
</target>
Modified: ant/core/trunk/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml?rev=692081&r1=692080&r2=692081&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml Thu Sep 4 07:57:04 2008
@@ -69,4 +69,10 @@
<au:assertFileDoesntExist file="${output}/link"/>
</target>
+ <target name="testDeleteLinkToParent" depends="init" if="unix">
+ <symlink link="${output}/link" resource="${output}"/>
+ <symlink link="${output}/link" action="delete"/>
+ <au:assertFileDoesntExist file="${output}/link"/>
+ </target>
+
</project>