git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@728003 13f79535-47bb-0310-9956-ffa450edef68master
@@ -20,6 +20,7 @@ package org.apache.tools.ant.taskdefs; | |||
import java.io.File; | |||
import java.util.Enumeration; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.LinkedHashSet; | |||
@@ -189,10 +190,8 @@ public class Sync extends Task { | |||
DirectoryScanner ds = null; | |||
if (syncTarget != null) { | |||
FileSet fs = new FileSet(); | |||
FileSet fs = syncTarget.toFileSet(false); | |||
fs.setDir(toDir); | |||
fs.setCaseSensitive(syncTarget.isCaseSensitive()); | |||
fs.setFollowSymlinks(syncTarget.isFollowSymlinks()); | |||
// preserveInTarget would find all files we want to keep, | |||
// but we need to find all that we want to delete - so the | |||
@@ -245,7 +244,10 @@ public class Sync extends Task { | |||
Boolean ped = getExplicitPreserveEmptyDirs(); | |||
if (ped != null && ped.booleanValue() != myCopy.getIncludeEmptyDirs()) { | |||
String[] preservedDirs = ds.getExcludedDirectories(); | |||
FileSet fs = syncTarget.toFileSet(true); | |||
fs.setDir(toDir); | |||
String[] preservedDirs = | |||
fs.getDirectoryScanner(getProject()).getIncludedDirectories(); | |||
for (int i = preservedDirs.length - 1; i >= 0; --i) { | |||
preservedDirectories.add(new File(toDir, preservedDirs[i])); | |||
} | |||
@@ -552,6 +554,25 @@ public class Sync extends Task { | |||
public Boolean getPreserveEmptyDirs() { | |||
return preserveEmptyDirs; | |||
} | |||
private FileSet toFileSet(boolean withPatterns) { | |||
FileSet fs = new FileSet(); | |||
fs.setCaseSensitive(isCaseSensitive()); | |||
fs.setFollowSymlinks(isFollowSymlinks()); | |||
fs.setMaxLevelsOfSymlinks(getMaxLevelsOfSymlinks()); | |||
fs.setProject(getProject()); | |||
if (withPatterns) { | |||
PatternSet ps = mergePatterns(getProject()); | |||
fs.appendIncludes(ps.getIncludePatterns(getProject())); | |||
fs.appendExcludes(ps.getExcludePatterns(getProject())); | |||
for (Enumeration e = selectorElements(); e.hasMoreElements(); ) { | |||
fs.appendSelector((FileSelector) e.nextElement()); | |||
} | |||
fs.setDefaultexcludes(getDefaultexcludes()); | |||
} | |||
return fs; | |||
} | |||
} | |||
/** | |||
@@ -423,6 +423,16 @@ public abstract class AbstractFileSet extends DataType | |||
maxLevelsOfSymlinks = max; | |||
} | |||
/** | |||
* The maximum number of times a symbolic link may be followed | |||
* during a scan. | |||
* | |||
* @since Ant 1.8.0 | |||
*/ | |||
public int getMaxLevelsOfSymlinks() { | |||
return maxLevelsOfSymlinks; | |||
} | |||
/** | |||
* Sets whether an error is thrown if a directory does not exist. | |||
* | |||
@@ -20,7 +20,9 @@ | |||
<target name="setUp"> | |||
<mkdir dir="${input}/a"/> | |||
<mkdir dir="${input}/d"/> | |||
<mkdir dir="${output}/a"/> | |||
<mkdir dir="${output}/d"/> | |||
<mkdir dir="${output}/b/c"/> | |||
<touch file="${input}/a/foo.txt"/> | |||
<touch file="${output}/a/bar.txt"/> | |||
@@ -40,6 +42,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileExists file="${output}/b/c"/> | |||
<au:assertFileExists file="${output}/d"/> | |||
</target> | |||
<target name="testDefaultDoesntPreserveEmptyDirs" depends="setUp"> | |||
@@ -55,6 +58,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileDoesntExist file="${output}/b/c"/> | |||
<au:assertFileDoesntExist file="${output}/d"/> | |||
</target> | |||
<target name="testPreserveEmptyOverridesDefault" depends="setUp"> | |||
@@ -70,6 +74,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileExists file="${output}/b/c"/> | |||
<au:assertFileDoesntExist file="${output}/d"/> | |||
</target> | |||
<target name="testPreserveEmptyOverrulesIncludeEmpty" depends="setUp"> | |||
@@ -85,6 +90,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileDoesntExist file="${output}/b/c"/> | |||
<au:assertFileExists file="${output}/d"/> | |||
</target> | |||
<target name="testPreserveEmptyAndIncludeEmptyFalse" depends="setUp"> | |||
@@ -100,6 +106,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileDoesntExist file="${output}/b/c"/> | |||
<au:assertFileDoesntExist file="${output}/d"/> | |||
</target> | |||
<target name="testPreserveEmptyAndIncludeEmptyTrue" depends="setUp"> | |||
@@ -115,6 +122,7 @@ | |||
<au:assertFileExists file="${output}/a/foo.txt"/> | |||
<au:assertFileExists file="${output}/b/baz.txt"/> | |||
<au:assertFileExists file="${output}/b/c"/> | |||
<au:assertFileExists file="${output}/d"/> | |||
</target> | |||
<target name="testPreserveEmptyDirsWithNonRecursiveExclude" depends="setUp"> | |||
@@ -131,6 +139,7 @@ | |||
<au:assertFileExists file="${output}/b"/> | |||
<au:assertFileDoesntExist file="${output}/b/baz.txt"/> | |||
<au:assertFileDoesntExist file="${output}/b/c"/> | |||
<au:assertFileDoesntExist file="${output}/d"/> | |||
</target> | |||
</project> |