From 10f8a113acf483132b5e6379298ed1b627a984c2 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 19 Dec 2008 11:09:02 +0000 Subject: [PATCH] now that slowScan is fixed, I realized that Sync cannot use it. Full implementation of PR 43159. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@728003 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/taskdefs/Sync.java | 29 ++++++++++++++++--- .../tools/ant/types/AbstractFileSet.java | 10 +++++++ src/tests/antunit/taskdefs/sync-test.xml | 9 ++++++ 3 files changed, 44 insertions(+), 4 deletions(-) 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 @@ +