diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java index e23a097d5..27bf61f3a 100644 --- a/src/main/org/apache/tools/ant/DirectoryScanner.java +++ b/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -692,7 +692,18 @@ public class DirectoryScanner Enumeration enum2 = newroots.keys(); while (enum2.hasMoreElements()) { String currentelement = (String) enum2.nextElement(); + String originalpattern = (String) newroots.get(currentelement); File myfile = new File(basedir, currentelement); + if (!myfile.exists() && !isCaseSensitive) { + File f = findFileCaseInsensitive(basedir, currentelement); + if (f.exists()) { + // adapt currentelement to the case we've actually found + currentelement = fileUtils.removeLeadingPath(basedir, + f); + myfile = f; + } + } + if (myfile.exists()) { if (myfile.isDirectory()) { if (isIncluded(currentelement) @@ -700,7 +711,8 @@ public class DirectoryScanner 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; @@ -709,9 +721,11 @@ public class DirectoryScanner scandir(myfile, currentelement, true); } } else { - String originalpattern = - (String) newroots.get(currentelement); - if (originalpattern.equals(currentelement)) { + if (isCaseSensitive + && originalpattern.equals(currentelement)) { + accountForIncludedFile(currentelement, myfile); + } else if (!isCaseSensitive + && originalpattern.equalsIgnoreCase(currentelement)) { accountForIncludedFile(currentelement, myfile); } } @@ -1130,4 +1144,52 @@ public class DirectoryScanner f.isDirectory()); } + /** + * From base traverse the filesystem in a case + * insensitive manner in order to find a file that matches the + * given name. + * + * @return File object that points to the file in question. if it + * hasn't been found it will simply be new File(base, + * path). + * + * @since Ant 1.6 + */ + private File findFileCaseInsensitive(File base, String path) { + File f = findFileCaseInsensitive(base, + SelectorUtils.tokenizePath(path)); + return f == null ? new File(base, path) : f; + } + + /** + * From base traverse the filesystem in a case + * insensitive manner in order to find a file that matches the + * given stack of names. + * + * @return File object that points to the file in question or null. + * + * @since Ant 1.6 + */ + private File findFileCaseInsensitive(File base, Vector pathElements) { + if (pathElements.size() == 0) { + return base; + } else { + if (!base.isDirectory()) { + return null; + } + String[] files = base.list(); + if (files == null) { + throw new BuildException("IO error scanning directory " + + base.getAbsolutePath()); + } + String current = (String) pathElements.remove(0); + for (int i = 0; i < files.length; i++) { + if (files[i].equalsIgnoreCase(current)) { + base = new File(base, files[i]); + return findFileCaseInsensitive(base, pathElements); + } + } + } + return null; + } }