antoine 2003/07/15 16:19:15
Modified: src/main/org/apache/tools/ant DirectoryScanner.java
src/testcases/org/apache/tools/ant DirectoryScannerTest.java
Log:
Fix the following (remark of Stefan Bodewig on July 15th 2003 on the dev list)
* You go a long way to avoid redundantly adding patterns in
DirectoryScanner#checkIncludePatterns (the parent check). If the
patterns come in reversed, you'll still have duplicate roots, no? Say
a/b/c is added before a/b is. You may avoid this by sorting the
include patterns first.
Revision Changes Path
1.45 +28 -13 ant/src/main/org/apache/tools/ant/DirectoryScanner.java
Index: DirectoryScanner.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- DirectoryScanner.java 15 Jul 2003 14:18:07 -0000 1.44
+++ DirectoryScanner.java 15 Jul 2003 23:19:15 -0000 1.45
@@ -658,34 +658,49 @@
String newpattern =
SelectorUtils.rtrimWildcardTokens(includes[icounter]);
// check whether the candidate new pattern has a parent
- boolean hasParent=false;
+ boolean hasParent = false;
Enumeration myenum = newroots.keys();
+ // logically, there should be at most one child pattern present
+ // let's use a vector though to be sure
+ Vector vdelete = new Vector();
while (myenum.hasMoreElements()) {
- String existingpattern= (String) myenum.nextElement();
+ String existingpattern = (String) myenum.nextElement();
+ // check whether the existing pattern is a child of the new
pattern
+ if (existingpattern.length() >= newpattern.length()) {
+ if (existingpattern.indexOf(newpattern) == 0) {
+ vdelete.add(existingpattern);
+ }
+ }
+ // check whether the new pattern is a child of the existing
pattern
if (existingpattern.length() <= newpattern.length()) {
- if (newpattern.indexOf(existingpattern)==0) {
- hasParent=true;
+ if (newpattern.indexOf(existingpattern) == 0) {
+ hasParent = true;
+ break;
}
}
}
+ // add the new pattern if does not have parents
if (!hasParent) {
- newroots.put(newpattern,includes[icounter]);
+ newroots.put(newpattern, includes[icounter]);
+ // remove child patterns
+ for (int icounter2 = 0; icounter2 < vdelete.size();
icounter2++) {
+ newroots.remove(vdelete.elementAt(icounter2));
+ }
}
}
Enumeration enum2 = newroots.keys();
while (enum2.hasMoreElements()) {
String currentelement = (String) enum2.nextElement();
- File myfile=new File(basedir, currentelement);
+ File myfile = new File(basedir, currentelement);
if (myfile.exists()) {
if (myfile.isDirectory()) {
- if (isIncluded(currentelement)
- && currentelement.length()>0) {
- accountForIncludedDir(currentelement,myfile,true);
+ if (isIncluded(currentelement)
+ && currentelement.length() > 0) {
+ accountForIncludedDir(currentelement, myfile, true);
} else {
if (currentelement.length() > 0) {
- if (currentelement.charAt(currentelement.length()
- -1 )
+ if
(currentelement.charAt(currentelement.length()-1)
!= File.separatorChar) {
currentelement =
currentelement + File.separatorChar;
@@ -694,10 +709,10 @@
scandir(myfile, currentelement, true);
}
} else {
- String originalpattern=
+ String originalpattern =
(String) newroots.get(currentelement);
if (originalpattern.equals(currentelement)) {
- accountForIncludedFile(currentelement,myfile);
+ accountForIncludedFile(currentelement, myfile);
}
}
}
1.12 +16 -0
ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java
Index: DirectoryScannerTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- DirectoryScannerTest.java 11 Jul 2003 12:59:29 -0000 1.11
+++ DirectoryScannerTest.java 15 Jul 2003 23:19:15 -0000 1.12
@@ -133,6 +133,22 @@
ds.scan();
compareFiles(ds, new String[] {"alpha/beta/beta.xml",
"alpha/beta/gamma/gamma.xml"} ,new String[] {"", "alpha", "alpha/beta",
"alpha/beta/gamma"});
}
+ // father and child pattern test
+ public void testOrderOfIncludePatternsIrrelevant() {
+ String [] expectedFiles = {"alpha/beta/beta.xml",
"alpha/beta/gamma/gamma.xml"};
+ String [] expectedDirectories = {"alpha/beta", "alpha/beta/gamma" };
+ DirectoryScanner ds = new DirectoryScanner();
+ ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
+ ds.setIncludes(new String[] {"alpha/be?a/**", "alpha/beta/gamma/"});
+ ds.scan();
+ compareFiles(ds, expectedFiles, expectedDirectories);
+ // redo the test, but the 2 include patterns are inverted
+ ds = new DirectoryScanner();
+ ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
+ ds.setIncludes(new String[] {"alpha/beta/gamma/", "alpha/be?a/**"});
+ ds.scan();
+ compareFiles(ds, expectedFiles, expectedDirectories);
+ }
public void tearDown() {
getProject().executeTarget("cleanup");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]