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"); } }