Patch is attached. This allows rake to run, and more specifically "rake rails:freeze:edge" works (even though edge rails does not appear to work correctly in JRuby right now).

Changes:
- load 'filename' now only looks for filename in the load path; it does not attempt to append any extensions.
- require 'filename' looks for filename first if it ends in .rb, otherwise it goes through the extension searching.
- the list of extensions searched no longer includes "" since require WILL NOT load files without extensions.
- the builtin libraries loaded in Ruby.java now are named with .rb extensions, since they are always "require"ed and require expects an extension.

Tests:
- rubicon looks pretty good with this; no major cock-ups
- I created no unit tests for this, but it probably should have some

With Rake actually running now (as a gem) we ought to be able to start playing with it.

On 6/29/06, Charles O Nutter <[EMAIL PROTECTED]> wrote:
I have a patch for this modified behavior in the works. It seems to allow rake to run correctly installed from a gem (where it did not run at all before). There is also an additional difference in behavior I don't think we're enforcing: according to Ruby docs for Kernel#load: "In no circumstance will any local variables in the loaded file be propagated to the loading environment.". Since the original code was almost identical for load and require, I would bet we're not doing this.


On 6/29/06, Charles O Nutter <[EMAIL PROTECTED]> wrote:
Actually I think I figured it out. The gem install also has a bin dir, which is what gets loaded when you "load 'rake'". This actually kicks off the script.

I found the issue in JRuby, but I thought I'd confirm it with you:

The logic behind 'load' and 'require' in JRuby has long been identical, other than 'require' keeping a hash of loaded features. Both searched all load paths for the filename specified PLUS the filename specified followed by a series of possible extensions. It seems that the correct behavior is as follows:

- load only looks for the exact filename specified in the current load path, and does not attempt any additional extensions
- require will look for the exact filename if it has a .rb, .so, .dll, etc extension. Otherwise it will attempt to append .rb and load.

So based on this logic, given files testreq and testreq2.rb in the current dir:

- load 'testreq' will succeed
- load 'testreq2' will not succeed
- load 'testreq2.rb' will succeed
- require 'testreq' will not succeed
- require 'testreq2' will succeed
- require 'testreq2.rb' will succeed

Does this sound correct to you?


On 6/29/06, Charles O Nutter < [EMAIL PROTECTED]> wrote:
I'm trying to get Rake running well under JRuby today, and I'm having some trouble understanding how Rake actually starts up. I see the following in rake.rb:

if __FILE__ == $0 then
  Rake::Application.new.run
end

However, when running the "rake" script in Ruby or JRuby, __FILE__ and $0 never appear to be ==. Since the "rake" script itself only loads rake.rb, I'm confused how Rake actually starts running under Ruby proper. Could you tell me what I'm missing?

Under Ruby, logging __FILE__ and $0 from above:

"/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb"
"/usr/bin/rake"
<then expected Rake run output displays>

Under JRuby:

"/home/headius/workspace/jruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb"
"/home/headius/workspace/jruby/bin/rake"
<nothing happens>

--
Charles Oliver Nutter @ headius.blogspot.com
JRuby Developer @ www.jruby.org
Application Architect @ www.ventera.com



--
Charles Oliver Nutter @ headius.blogspot.com
JRuby Developer @ www.jruby.org
Application Architect @ www.ventera.com



--
Charles Oliver Nutter @ headius.blogspot.com
JRuby Developer @ www.jruby.org
Application Architect @ www.ventera.com



--
Charles Oliver Nutter @ headius.blogspot.com
JRuby Developer @ www.jruby.org
Application Architect @ www.ventera.com
Index: src/org/jruby/Ruby.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/Ruby.java,v
retrieving revision 1.125
diff -u -r1.125 Ruby.java
--- src/org/jruby/Ruby.java	17 Jun 2006 22:27:22 -0000	1.125
+++ src/org/jruby/Ruby.java	29 Jun 2006 05:57:06 -0000
@@ -410,13 +410,13 @@
         initBuiltinClasses();
         
         // Load additional definitions and hacks from etc.rb
-        getLoadService().load("builtin/etc.rb");
+        getLoadService().smartLoad("builtin/etc.rb");
     }
 
     private void initLibraries() {
         loadService = new LoadService(this);
-        loadService.registerBuiltin("java", new BuiltinScript("javasupport"));
-        loadService.registerBuiltin("socket", new SocketLibrary());
+        loadService.registerBuiltin("java.rb", new BuiltinScript("javasupport"));
+        loadService.registerBuiltin("socket.rb", new SocketLibrary());
         loadService.registerBuiltin("rbconfig.rb", new RbConfigLibrary());
 
         for (int i=0; i<BUILTIN_LIBRARIES.length; i++) {
@@ -424,9 +424,9 @@
         }
         
         
-        loadService.registerBuiltin("jruby", new JRubyLibrary());
-        loadService.registerBuiltin("stringio", new StringIOLibrary());
-        loadService.registerBuiltin("zlib", new ZlibLibrary());
+        loadService.registerBuiltin("jruby.rb", new JRubyLibrary());
+        loadService.registerBuiltin("stringio.rb", new StringIOLibrary());
+        loadService.registerBuiltin("zlib.rb", new ZlibLibrary());
     }
 
     private void initCoreClasses() {
Index: src/org/jruby/runtime/load/LoadService.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/runtime/load/LoadService.java,v
retrieving revision 1.11
diff -u -r1.11 LoadService.java
--- src/org/jruby/runtime/load/LoadService.java	21 Mar 2006 22:37:05 -0000	1.11
+++ src/org/jruby/runtime/load/LoadService.java	29 Jun 2006 05:57:07 -0000
@@ -60,7 +60,7 @@
 public class LoadService {
     private static final String JRUBY_BUILTIN_SUFFIX = ".jrb";
 
-	private static final String[] suffixes = { JRUBY_BUILTIN_SUFFIX, ".ast.ser", ".rb.ast.ser", ".rb",  "", ".jar" };
+	private static final String[] suffixes = { JRUBY_BUILTIN_SUFFIX, ".ast.ser", ".rb.ast.ser", ".rb", ".jar" };
 
     private final List loadPath = new ArrayList();
     private final Set loadedFeatures = Collections.synchronizedSet(new HashSet());
@@ -112,19 +112,44 @@
 
     public void load(String file) {
         Library library = null;
-        for (int i = 0; i < suffixes.length; i++) {
-            library = findLibrary(file + suffixes[i]);
-            if (library != null) {
-                break;
+        
+        library = findLibrary(file);
+
+        if (library == null) {
+            throw runtime.newLoadError("No such file to load -- " + file);
+        }
+        try {
+            library.load(runtime);
+        } catch (IOException e) {
+            throw runtime.newLoadError("IO error -- " + file);
+        }
+    }
+
+    public void smartLoad(String file) {
+        Library library = null;
+        
+        if (file.endsWith(".rb")) {
+            // .rb specified, try without suffixes
+            library = findLibrary(file);
+        }
+        
+        if (library == null) {
+            // nothing yet, try suffixes
+            for (int i = 0; i < suffixes.length; i++) {
+                library = findLibrary(file + suffixes[i]);
+                if (library != null) {
+                    break;
+                }
             }
         }
+
         if (library == null) {
             throw runtime.newLoadError("No such file to load -- " + file);
         }
         try {
-        	library.load(runtime);
+            library.load(runtime);
         } catch (IOException e) {
-        	throw runtime.newLoadError("IO error -- " + file);
+            throw runtime.newLoadError("IO error -- " + file);
         }
     }
 
@@ -155,7 +180,7 @@
         loadedFeatures.add(name);
         
         try {
-	        load(file);
+	        smartLoad(file);
 	        return true;
         } catch (RuntimeException e) {
             loadedFeatures.remove(name);
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Jruby-devel mailing list
Jruby-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jruby-devel

Reply via email to