You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@apache.org on 2003/07/16 13:47:53 UTC
cvs commit: ant/src/main/org/apache/tools/ant DirectoryScanner.java
bodewig 2003/07/16 04:47:53
Modified: src/main/org/apache/tools/ant DirectoryScanner.java
Log:
Fix case-insensitive DirectiryScanner - I hope
Revision Changes Path
1.46 +66 -4 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.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- DirectoryScanner.java 15 Jul 2003 23:19:15 -0000 1.45
+++ DirectoryScanner.java 16 Jul 2003 11:47:52 -0000 1.46
@@ -692,7 +692,18 @@
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 @@
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 @@
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 @@
f.isDirectory());
}
+ /**
+ * From <code>base</code> 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 <code>new File(base,
+ * path)</code>.
+ *
+ * @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 <code>base</code> 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;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org