antoine 2003/08/05 15:23:57 Modified: src/main/org/apache/tools/ant DirectoryScanner.java src/main/org/apache/tools/ant/taskdefs/optional/net FTP.java Log: Make the FTP.FTPDirectoryScanner behave like the DirectoryScanner in terms of following symbolic links which are directories. This will make a change of behavior in comparison with ant 1.5.3 where the behavior of the ftp task was to never follow symbolic links. Also select symbolic links which are files PR: 14063 Revision Changes Path 1.62 +12 -1 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.61 retrieving revision 1.62 diff -u -r1.61 -r1.62 --- DirectoryScanner.java 29 Jul 2003 19:47:16 -0000 1.61 +++ DirectoryScanner.java 5 Aug 2003 22:23:57 -0000 1.62 @@ -514,6 +514,17 @@ } /** + * gets whether or not a DirectoryScanner follows symbolic links + * + * @return flag indicating whether symbolic links should be followed + * + * @since ant 1.6 + */ + public boolean isFollowSymlinks() { + return followSymlinks; + } + + /** * Sets whether or not symbolic links should be followed. * * @param followSymlinks whether or not symbolic links should be followed @@ -1005,7 +1016,7 @@ */ private boolean isMorePowerfulThanExcludes(String name, String includepattern) { String soughtexclude = name + File.separator + "**"; - for (int counter=0; counter <excludes.length; counter++) { + for (int counter = 0; counter < excludes.length; counter++) { if (excludes[counter].equals(soughtexclude)) { return false; } 1.41 +82 -8 ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java Index: FTP.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java,v retrieving revision 1.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- FTP.java 5 Aug 2003 16:44:43 -0000 1.40 +++ FTP.java 5 Aug 2003 22:23:57 -0000 1.41 @@ -258,16 +258,24 @@ for (int i = 0; i < newfiles.length; i++) { FTPFile file = newfiles[i]; - if (!file.getName().equals(".") && !file.getName().equals("..")) { - if (file.isDirectory()) { + if (isFunctioningAsDirectory(ftp, dir, file)) { String name = vpath + file.getName(); - if (isIncluded(name)) { + boolean slowScanAllowed = true; + if (!isFollowSymlinks() && file.isSymbolicLink()) { + dirsExcluded.addElement(name); + slowScanAllowed = false; + } else if (isIncluded(name)) { if (!isExcluded(name)) { if (fast) { - scandir(file.getName(), + if (file.isSymbolicLink()) { + scandir(file.getLink(), name + File.separator, fast); + } else { + scandir(file.getName(), + name + File.separator, fast); + } } dirsIncluded.addElement(name); } else { @@ -284,12 +292,12 @@ name + File.separator, fast); } } - if (!fast) { + if (!fast && slowScanAllowed) { scandir(file.getName(), name + File.separator, fast); } } else { - if (file.isFile()) { + if (isFunctioningAsFile(ftp, dir, file)) { String name = vpath + file.getName(); if (isIncluded(name)) { @@ -312,8 +320,74 @@ } } } - - + /** + * check FTPFiles to check whether they function as directories too + * the FTPFile API seem to make directory and symbolic links incompatible + * we want to find out if we can cd to a symbolic link + * @param dir the parent directory of the file to test + * @param file the file to test + * @return true if it is possible to cd to this directory + * @since ant 1.6 + */ + private boolean isFunctioningAsDirectory(FTPClient ftp, String dir, FTPFile file) { + String testDirectory = dir + remoteFileSep + file.getName(); + boolean result = false; + String currentWorkingDir = null; + if (file.isDirectory()) { + return true; + } else if (file.isFile()) { + return false; + } + try { + currentWorkingDir = ftp.printWorkingDirectory(); + } catch (IOException ioe) { + getProject().log("could not find current working directory " + dir + + " while checking a symlink", + Project.MSG_DEBUG); + } + if (currentWorkingDir != null) { + try { + result = ftp.changeWorkingDirectory(file.getLink()); + } catch (IOException ioe) { + getProject().log("could not cd to " + file.getLink() + " while checking a symlink", + Project.MSG_DEBUG); + } + if (result) { + boolean comeback = false; + try { + comeback = ftp.changeWorkingDirectory(currentWorkingDir); + } catch (IOException ioe) { + getProject().log("could not cd back to " + dir + " while checking a symlink", + Project.MSG_ERR); + } finally { + if (!comeback) { + throw new BuildException("could not cd back to " + dir + + " while checking a symlink"); + } + } + } + } + return result; + } + /** + * check FTPFiles to check whether they function as directories too + * the FTPFile API seem to make directory and symbolic links incompatible + * we want to find out if we can cd to a symbolic link + * @param dir the parent directory of the file to test + * @param file the file to test + * @return true if it is possible to cd to this directory + * @since ant 1.6 + */ + private boolean isFunctioningAsFile(FTPClient ftp, String dir, FTPFile file) { + String testDirectory = dir + remoteFileSep + file.getName(); + System.out.println("checking dir entry " + testDirectory); + if (file.isDirectory()) { + return false; + } else if (file.isFile()) { + return true; + } + return !isFunctioningAsDirectory(ftp, dir, file); + } /** * Sets the remote directory where files will be placed. This may be a * relative or absolute path, and must be in the path syntax expected by
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]