|
|
@@ -57,6 +57,9 @@ package org.apache.tools.ant; |
|
|
|
import java.io.File; |
|
|
|
import java.io.IOException; |
|
|
|
import java.util.Vector; |
|
|
|
import java.util.Hashtable; |
|
|
|
import java.util.Enumeration; |
|
|
|
|
|
|
|
import org.apache.tools.ant.types.Resource; |
|
|
|
import org.apache.tools.ant.types.ResourceFactory; |
|
|
|
import org.apache.tools.ant.types.selectors.FileSelector; |
|
|
@@ -639,9 +642,59 @@ public class DirectoryScanner |
|
|
|
} else { |
|
|
|
dirsNotIncluded.addElement(""); |
|
|
|
} |
|
|
|
scandir(basedir, "", true); |
|
|
|
checkIncludePatterns(); |
|
|
|
} |
|
|
|
/** |
|
|
|
* this routine is actually checking all the include patterns |
|
|
|
* in order to avoid scanning everything under base dir |
|
|
|
* @since ant1.6 |
|
|
|
*/ |
|
|
|
private void checkIncludePatterns() { |
|
|
|
Hashtable newroots = new Hashtable(); |
|
|
|
// put in the newroots vector the include patterns without wildcard tokens |
|
|
|
for (int icounter=0; icounter<includes.length; icounter++) { |
|
|
|
String newpattern=SelectorUtils.rtrimWildcardTokens(includes[icounter]); |
|
|
|
// check whether the candidate new pattern has a parent |
|
|
|
boolean hasParent=false; |
|
|
|
Enumeration myenum = newroots.keys(); |
|
|
|
while (myenum.hasMoreElements()) { |
|
|
|
String existingpattern=(String)myenum.nextElement(); |
|
|
|
if (existingpattern.length() <= newpattern.length()) { |
|
|
|
if (newpattern.indexOf(existingpattern)==0) { |
|
|
|
hasParent=true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if ( !hasParent) { |
|
|
|
newroots.put(newpattern,includes[icounter]); |
|
|
|
} |
|
|
|
} |
|
|
|
Enumeration enum2 = newroots.keys(); |
|
|
|
while (enum2.hasMoreElements()) { |
|
|
|
String currentelement = (String) enum2.nextElement(); |
|
|
|
File myfile=new File(basedir,currentelement); |
|
|
|
if (myfile.exists()) { |
|
|
|
if (myfile.isDirectory()) { |
|
|
|
if (isIncluded(currentelement) && currentelement.length()>0) { |
|
|
|
accountForIncludedDir(currentelement,myfile,true); |
|
|
|
} else { |
|
|
|
if (currentelement.length() > 0) { |
|
|
|
if (currentelement.charAt(currentelement.length()-1) != File.separatorChar) { |
|
|
|
currentelement = currentelement + File.separatorChar; |
|
|
|
} |
|
|
|
} |
|
|
|
scandir(myfile, currentelement, true); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
String originalpattern=(String)newroots.get(currentelement); |
|
|
|
if (originalpattern.equals(currentelement)) { |
|
|
|
accountForIncludedFile(currentelement,myfile); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Top level invocation for a slow scan. A slow scan builds up a full |
|
|
|
* list of excluded/included files/directories, whereas a fast scan |
|
|
@@ -745,27 +798,7 @@ public class DirectoryScanner |
|
|
|
File file = new File(dir, newfiles[i]); |
|
|
|
if (file.isDirectory()) { |
|
|
|
if (isIncluded(name)) { |
|
|
|
if (!isExcluded(name)) { |
|
|
|
if (isSelected(name, file)) { |
|
|
|
dirsIncluded.addElement(name); |
|
|
|
if (fast) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
dirsDeselected.addElement(name); |
|
|
|
if (fast && couldHoldIncluded(name)) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
dirsExcluded.addElement(name); |
|
|
|
if (fast && couldHoldIncluded(name)) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} |
|
|
|
accountForIncludedDir(name, file, fast); |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
dirsNotIncluded.addElement(name); |
|
|
@@ -778,17 +811,7 @@ public class DirectoryScanner |
|
|
|
} |
|
|
|
} else if (file.isFile()) { |
|
|
|
if (isIncluded(name)) { |
|
|
|
if (!isExcluded(name)) { |
|
|
|
if (isSelected(name, file)) { |
|
|
|
filesIncluded.addElement(name); |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
filesDeselected.addElement(name); |
|
|
|
} |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
filesExcluded.addElement(name); |
|
|
|
} |
|
|
|
accountForIncludedFile(name, file); |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
filesNotIncluded.addElement(name); |
|
|
@@ -796,7 +819,55 @@ public class DirectoryScanner |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/** |
|
|
|
* process included file |
|
|
|
* @param name path of the file relative to the directory of the fileset |
|
|
|
* @param file included file |
|
|
|
*/ |
|
|
|
private void accountForIncludedFile(String name, File file) { |
|
|
|
if (!isExcluded(name)) { |
|
|
|
if (isSelected(name, file)) { |
|
|
|
filesIncluded.addElement(name); |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
filesDeselected.addElement(name); |
|
|
|
} |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
filesExcluded.addElement(name); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
/** |
|
|
|
* |
|
|
|
* @param name path of the directory relative to the directory of the fileset |
|
|
|
* @param file directory as file |
|
|
|
* @param fast |
|
|
|
*/ |
|
|
|
private void accountForIncludedDir(String name, File file, boolean fast) { |
|
|
|
if (!isExcluded(name)) { |
|
|
|
if (isSelected(name, file)) { |
|
|
|
dirsIncluded.addElement(name); |
|
|
|
if (fast) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
dirsDeselected.addElement(name); |
|
|
|
if (fast && couldHoldIncluded(name)) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
everythingIncluded = false; |
|
|
|
dirsExcluded.addElement(name); |
|
|
|
if (fast && couldHoldIncluded(name)) { |
|
|
|
scandir(file, name + File.separator, fast); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
/** |
|
|
|
* Tests whether or not a name matches against at least one include |
|
|
|
* pattern. |
|
|
|