From 9e89cec932a798d958cf6bb310936d9a00c09a9d Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 23 Jul 2003 07:50:25 +0000 Subject: [PATCH] Avoid double scanning of directories git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274898 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/tools/ant/DirectoryScanner.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java index 4f1edd203..4c761899e 100644 --- a/src/main/org/apache/tools/ant/DirectoryScanner.java +++ b/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -58,8 +58,10 @@ import java.io.File; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.Hashtable; import java.util.Map; +import java.util.Set; import java.util.Vector; import org.apache.tools.ant.types.Resource; @@ -777,7 +779,7 @@ public class DirectoryScanner } } } - fileListMap.clear(); + clearCaches(); } /** @@ -837,6 +839,11 @@ public class DirectoryScanner * @see #slowScan */ protected void scandir(File dir, String vpath, boolean fast) { + // avoid double scanning of directories, can only happen in fast mode + if (fast && hasBeenScanned(vpath)) { + return; + } + String[] newfiles = dir.list(); if (newfiles == null) { @@ -1355,4 +1362,33 @@ public class DirectoryScanner } return false; } + + /** + * List of all scanned directories. + * + * @since Ant 1.6 + */ + private Set scannedDirs = new HashSet(); + + /** + * Has the directorty with the given path relative to the base + * directory allready been scanned? + * + *

Registers the given directory as scanned as a side effect.

+ * + * @since Ant 1.6 + */ + private boolean hasBeenScanned(String vpath) { + return !scannedDirs.add(vpath); + } + + /** + * Clear internal caches. + * + * @since Ant 1.6 + */ + private void clearCaches() { + fileListMap.clear(); + scannedDirs.clear(); + } }