diff --git a/src/etc/testcases/taskdefs/optional/unix/symlink.xml b/src/etc/testcases/taskdefs/optional/unix/symlink.xml
index 257361894..e75e7b72d 100644
--- a/src/etc/testcases/taskdefs/optional/unix/symlink.xml
+++ b/src/etc/testcases/taskdefs/optional/unix/symlink.xml
@@ -104,6 +104,8 @@
Link: ${tdir}/symtest1/symtest2/link3==>
${tdir}/symtest1/symtest2/file2
Link: ${tdir}/symtest1/dirlink==>${tdir}/symtest1/symtest3
+ Link: ${tdir}/symtest1/dirlink2==>${tdir}/symtest1/symtest3
+ Link: ${tdir}/symtest1/dirlink3==>${tdir}/symtest1/symtest3
File: ${tdir}/symtest1/recorded.links
File: ${tdir}/symtest1/symtest2/recorded.links
Deletes:
@@ -134,6 +136,12 @@
+
+
@@ -188,6 +196,11 @@
+
+
+
+
${tdir}/symtest1/symtest2/file2
Link: ${tdir}/symtest1/symtest2/link3==>
${tdir}/symtest1/symtest2/file2
- Link: ${tdir}/sumtest1/dirlink==>${tdir}/symtest1/symtest3
+ Link: ${tdir}/symtest1/dirlink==>${tdir}/symtest1/symtest3
+ Link: ${tdir}/symtest1/dirlink3==>${tdir}/symtest1/symtest3
+
+ Creates
+ Link: ${tdir}/symtest1/dirlink3==>${tdir}/symtest1/symtest2
Recreates:
Link: ${tdir}/symtest1/link1==>${tdir}/symtest1/file1
Link: ${tdir}/symtest1/link2==>${tdir}/symtest1/symtest2/file2
Link: ${tdir}/symtest1/symtest2/link3==>
${tdir}/symtest1/symtest2/file2
- Link: ${tdir}/sumtest1/dirlink==>${tdir}/symtest1/symtest3
+ Link: ${tdir}/symtest1/dirlink==>${tdir}/symtest1/symtest3
+
+ Should Change:
+ Link: ${tdir}/symtest1/dirlink3==>${tdir}/symtest1/symtest2
+ to
+ ${tdir}/symtest1/dirlink3==>${tdir}/symtest1/symtest3
+
+ Should Not Create (bug 25181):
+ Link: ${tdir}/symtest1/symtest3/dirlink2==>${tdir}/symtest1/symtest3
-->
@@ -229,6 +254,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java b/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
index 58c76617a..6b6692bf1 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java
@@ -160,7 +160,26 @@ public class Symlink extends Task {
while (keys.hasMoreElements()) {
link = (String) keys.nextElement();
resource = listOfLinks.getProperty(link);
- doLink(resource, link);
+ // handle the case where the link exists
+ // and points to a directory (bug 25181)
+ try {
+ FileUtils fu = FileUtils.newFileUtils();
+ File test = new File(link);
+ File testRes = new File(resource);
+ if (!fu.isSymbolicLink(test.getParentFile(),
+ test.getName())) {
+ doLink(resource, link);
+ } else {
+ if (!test.getCanonicalPath().
+ equals(testRes.getCanonicalPath())) {
+ Symlink.deleteSymlink(link);
+ doLink(resource,link);
+ } // else the link exists, do nothing
+ }
+ } catch (IOException ioe) {
+ handleError("IO exception while creating "
+ + "link");
+ }
}
} else if (action.equals("record")) {
Vector vectOfLinks;
@@ -735,7 +754,6 @@ public class Symlink extends Task {
keys = propTemp.keys();
propTemp.list(System.out);
// Write the contents to our master list of links
-
// This method assumes that all links are defined in
// terms of absolute paths, or paths relative to the
// working directory
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/unix/SymlinkTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/unix/SymlinkTest.java
index cfe906a10..d8a6c35d6 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/optional/unix/SymlinkTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/unix/SymlinkTest.java
@@ -47,7 +47,6 @@ public class SymlinkTest extends BuildFileTest {
private Project p;
private boolean supportsSymlinks = Os.isFamily("unix");
- private boolean testfail = false;
public SymlinkTest(String name) {
super(name);
@@ -62,7 +61,6 @@ public class SymlinkTest extends BuildFileTest {
public void testSingle() {
- testfail = true;
if (supportsSymlinks) {
executeTarget("test-single");
p = getProject();
@@ -71,11 +69,9 @@ public class SymlinkTest extends BuildFileTest {
assertNotNull("Failed to create link",
p.getProperty("test.single.link.created"));
}
- testfail = false;
}
public void testDelete() {
- testfail = true;
if (supportsSymlinks) {
executeTarget("test-delete");
p = getProject();
@@ -86,11 +82,9 @@ public class SymlinkTest extends BuildFileTest {
fail(linkDeleted);
}
}
- testfail = false;
}
public void testRecord() {
- testfail = true;
if (supportsSymlinks) {
executeTarget("test-record");
p = getProject();
@@ -128,6 +122,9 @@ public class SymlinkTest extends BuildFileTest {
assertNotNull("Failed to create dirlink",
p.getProperty("test.record.dirlink.created"));
+ assertNotNull("Failed to create dirlink2",
+ p.getProperty("test.record.dirlink2.created"));
+
assertNotNull("Couldn't record links in dir1",
p.getProperty("test.record.dir1.recorded"));
@@ -141,11 +138,9 @@ public class SymlinkTest extends BuildFileTest {
}
}
- testfail = false;
}
public void testRecreate() {
- testfail = true;
if (supportsSymlinks) {
executeTarget("test-recreate");
p = getProject();
@@ -173,14 +168,21 @@ public class SymlinkTest extends BuildFileTest {
p.getProperty("test.recreate.link3.recreated"));
assertNotNull("Failed to recreate dirlink",
p.getProperty("test.recreate.dirlink.recreated"));
+
+ String doubleRecreate = p.getProperty("test.recreate.dirlink2.recreated.twice");
+
+ if (doubleRecreate != null) {
+ fail(doubleRecreate);
+ }
+
+ assertNotNull("Failed to alter dirlink3",
+ p.getProperty("test.recreate.dirlink3.was.altered"));
+
}
- testfail = false;
}
public void tearDown() {
- if (supportsSymlinks && !testfail) {
- executeTarget("teardown");
- }
+ executeTarget("teardown");
}
}