[MSHARED-64] FileSetManager.delete() does not delete empty directories if they contained symlink that was deleted
git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@694311 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
index 8043bd2..ca60886 100644
--- a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
@@ -37,6 +37,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@@ -450,7 +451,7 @@
excludes.removeAll( includedDirsAndSymlinks );
}
- excludeParentDirectoriesOfExcludedPaths( excludedDirs, includes );
+ excludeParentDirectoriesOfExcludedPaths( excludes, includes );
includes.addAll( linksForDeletion );
@@ -510,7 +511,7 @@
excludes.removeAll( includedFilesAndSymlinks );
}
- excludeParentDirectoriesOfExcludedPaths( excludedFiles, includes );
+ excludeParentDirectoriesOfExcludedPaths( excludes, includes );
includes.addAll( linksForDeletion );
@@ -526,11 +527,11 @@
* @param deletablePaths The relative paths to files/directories which are scheduled for deletion, must not be
* <code>null</code>.
*/
- private void excludeParentDirectoriesOfExcludedPaths( String excludedPaths[], Set deletablePaths )
+ private void excludeParentDirectoriesOfExcludedPaths( Collection excludedPaths, Set deletablePaths )
{
- for ( int i = 0; i < excludedPaths.length; i++ )
+ for ( Iterator it = excludedPaths.iterator(); it.hasNext(); )
{
- String path = excludedPaths[i];
+ String path = (String) it.next();
String parentPath = new File( path ).getParent();
@@ -553,7 +554,7 @@
}
}
- if ( excludedPaths.length > 0 )
+ if ( !excludedPaths.isEmpty() )
{
if ( messages != null && messages.isDebugEnabled() )
{
diff --git a/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java b/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
index 9de6001..48f8251 100644
--- a/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
+++ b/src/test/java/org/apache/maven/shared/model/fileset/util/FileSetUtilsTest.java
@@ -280,29 +280,55 @@
}
/**
- * @param from
- * @param to
+ * @throws Exception if any
+ */
+ public void testDeleteDontFollowSymlinksButDeleteThem()
+ throws Exception
+ {
+ File directory = setupTestDirectory( "testDeleteDontFollowSymlinksButDeleteThem" );
+
+ createSymlink( new File( directory, "excluded" ), new File( directory, "dir0/dirlink" ) );
+ createSymlink( new File( directory, "excluded.txt" ), new File( directory, "dir1/filelink" ) );
+
+ FileSet set = new FileSet();
+ set.setDirectory( directory.getPath() );
+ set.addExclude( "*excluded*" );
+ set.setFollowSymlinks( false );
+
+ FileSetManager fileSetManager = new FileSetManager();
+
+ fileSetManager.delete( set );
+
+ Assert.assertTrue( "excluded file has been deleted", new File( directory, "excluded.txt" ).exists() );
+ Assert.assertTrue( "excluded directory has been deleted", new File( directory, "excluded" ).exists() );
+ Assert.assertFalse( "included directory has not been deleted", new File( directory, "dir0" ).exists() );
+ Assert.assertFalse( "included directory has not been deleted", new File( directory, "dir1" ).exists() );
+ }
+
+ /**
+ * @param target The target file/directory of the symlink, must not be <code>null</code>.
+ * @param link The link to create, must not be <code>null</code>.
* @return
* @throws InterruptedException
* @throws CommandLineException
*/
- private boolean createSymlink( File from, File to )
+ private boolean createSymlink( File target, File link )
throws InterruptedException, CommandLineException
{
- if ( to.exists() )
+ if ( link.exists() )
{
- to.delete();
+ link.delete();
}
Commandline cli = new Commandline();
cli.setExecutable( "ln" );
- cli.createArg().setLine( "-s" );
- cli.createArg().setLine( from.getPath() );
- cli.createArg().setLine( to.getPath() );
+ cli.createArg().setValue( "-s" );
+ cli.createArg().setValue( target.getPath() );
+ cli.createArg().setValue( link.getPath() );
int result = cli.execute().waitFor();
- linkFiles.add( to );
+ linkFiles.add( link );
return result == 0;
}
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir0/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/dir1/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt
new file mode 100644
index 0000000..240ac76
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded.txt
@@ -0,0 +1 @@
+Serves as the target for a symlink and should not be deleted.
\ No newline at end of file
diff --git a/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt
new file mode 100644
index 0000000..b93cdcf
--- /dev/null
+++ b/src/test/resources/testDeleteDontFollowSymlinksButDeleteThem/excluded/dummy.txt
@@ -0,0 +1 @@
+The Resources Plugin won't copy empty directories...
\ No newline at end of file