Hi. I've spent some time trying to fix alot of the java.util.File-related issues, and fixed some stuff. I can now locally install the rake gem, including docs without error. I think I've fixed most of the CWD error, but I'm not sure if it will work better in multi-threaded places.
Ok, what I've done is this:
Create a new class org.jruby.util.JRubyFile, which mostly mirrors
NormalizedFile, but ALWAYS demands either an absolute path or a valid
CWD as parameter when created. (This mirror Ruby conventions for files.
For example, try x = File.new("lib"), Dir.chdir ".." and then x.read,
and this will still work, so obviously File.new captures the CWD when
it's created.
I've changed most classes to use JRubyFile instead. The exceptions to
this is Glob, RbConfigLibrary and LoadService, but these places are self
contained and it was hard to find out what semantics was needed.
There is also a fix for the RubyFileStat here, not complete though. I've
added defineMethods for ALL methods it should have, but commented out
most right now, until there is time to implement. I have also made the
semantics right, so it captures the File::Stat information at creation
time and throws an exception if the File does not exist.
Take a look and see if it works out!
Regards
Ola Bini
cwd.patch
Description: Binary data
/***** BEGIN LICENSE BLOCK ***** * Version: CPL 1.0/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Common Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.eclipse.org/legal/cpl-v10.html * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * Copyright (C) 2006 Ola Bini <[EMAIL PROTECTED]> * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the CPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the CPL, the GPL or the LGPL. ***** END LICENSE BLOCK *****/ /** * $Id: $ */ package org.jruby.util; import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; import java.io.IOException; /** * <p>This file acts as an alternative to NormalizedFile, due to the problems with current working directory.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Ola Bini</a> * @version $Revision: $ */ public class JRubyFile extends File { private static final long serialVersionUID = 435364547567567L; public static JRubyFile create(final String cwd, final String pathname) { File internal = new File(pathname); if(!internal.isAbsolute()) { internal = new File(cwd,pathname); if(!internal.isAbsolute()) { throw new IllegalArgumentException("Neither current working directory ("+cwd+") nor pathname ("+pathname+") led to an absolute path"); } } return new JRubyFile(internal); } public static String getFileProperty(final String property) { final String value = System.getProperty(property); return value.replace(File.separatorChar, '/'); } private JRubyFile(final File file) { this(file.getAbsolutePath()); } private JRubyFile(final String filename) { super(filename); } public String getAbsolutePath() { return super.getAbsolutePath().replace(File.separatorChar, '/'); } public String getCanonicalPath() throws IOException { return super.getCanonicalPath().replace(File.separatorChar, '/'); } public String getPath() { return super.getPath().replace(File.separatorChar, '/'); } public String toString() { return super.toString().replace(File.separatorChar, '/'); } public File getAbsoluteFile() { return new JRubyFile(getAbsolutePath()); } public File getCanonicalFile() throws IOException { return new JRubyFile(getCanonicalPath()); } public String getParent() { return super.getParent().replace(File.separatorChar, '/'); } public File getParentFile() { return new JRubyFile(getParent()); } public static File[] listRoots() { final File[] roots = File.listRoots(); final JRubyFile[] smartRoots = new JRubyFile[roots.length]; for(int i=0,j=roots.length; i<j; i++) { smartRoots[i] = new JRubyFile(roots[i].getPath()); } return smartRoots; } public static File createTempFile(final String prefix, final String suffix, final File directory) throws IOException { return new JRubyFile(File.createTempFile(prefix, suffix,directory)); } public static File createTempFile(final String prefix, final String suffix) throws IOException { return new JRubyFile(File.createTempFile(prefix, suffix)); } public String[] list(final FilenameFilter filter) { final String[] files = super.list(filter); if (files == null) { return null; } else { final String[] smartFiles = new String[files.length]; for (int i = 0; i < files.length; i++) { smartFiles[i] = files[i].replace(File.separatorChar, '/'); } return smartFiles; } } public File[] listFiles() { final File[] files = super.listFiles(); if (files == null) { return null; } else { JRubyFile[] smartFiles = new JRubyFile[files.length]; for(int i=0,j=files.length; i<j; i++) { smartFiles[i] = create(super.getAbsolutePath(),files[i].getPath()); } return smartFiles; } } public File[] listFiles(final FileFilter filter) { final File[] files = super.listFiles(filter); if (files == null) { return null; } else { JRubyFile[] smartFiles = new JRubyFile[files.length]; for(int i=0,j=files.length; i<j; i++) { smartFiles[i] = create(super.getAbsolutePath(),files[i].getPath()); } return smartFiles; } } public File[] listFiles(final FilenameFilter filter) { final File[] files = super.listFiles(filter); if (files == null) { return null; } else { JRubyFile[] smartFiles = new JRubyFile[files.length]; for(int i=0,j=files.length; i<j; i++) { smartFiles[i] = create(super.getAbsolutePath(),files[i].getPath()); } return smartFiles; } } }// JRubyFile
