diff --git a/src/main/org/apache/tools/ant/taskdefs/Sync.java b/src/main/org/apache/tools/ant/taskdefs/Sync.java
index 064f148c6..0aa9df11e 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Sync.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Sync.java
@@ -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;
+ }
}
/**
diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java
index 124cc8814..1efd0e430 100644
--- a/src/main/org/apache/tools/ant/types/AbstractFileSet.java
+++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java
@@ -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.
*
diff --git a/src/tests/antunit/taskdefs/sync-test.xml b/src/tests/antunit/taskdefs/sync-test.xml
index 7ac988bcb..821a95603 100644
--- a/src/tests/antunit/taskdefs/sync-test.xml
+++ b/src/tests/antunit/taskdefs/sync-test.xml
@@ -20,7 +20,9 @@
+
+
@@ -40,6 +42,7 @@
+
@@ -55,6 +58,7 @@
+
@@ -70,6 +74,7 @@
+
@@ -85,6 +90,7 @@
+
@@ -100,6 +106,7 @@
+
@@ -115,6 +122,7 @@
+
@@ -131,6 +139,7 @@
+