From 0f85db8118ded8580a6da44ca4f11c635d496f39 Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Fri, 8 Mar 2013 14:49:30 -0600 Subject: [PATCH 1/5] Fix JarMain.doStart() so that the file compiles --- ext/JarMain.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/JarMain.java b/ext/JarMain.java index 0077f5f5..fc059a22 100644 --- a/ext/JarMain.java +++ b/ext/JarMain.java @@ -185,7 +185,7 @@ public static void main(String[] args) { protected static void doStart(final JarMain main) { try { - int exit = new JarMain(args).start(); + int exit = main.start(); if(isSystemExitEnabled()) System.exit(exit); } catch (Exception e) { System.err.println("error: " + e.toString()); From e12dd00e1333fc073342365cd79908696f1be8ce Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Fri, 8 Mar 2013 14:51:05 -0600 Subject: [PATCH 2/5] First pass at finding project-local and bundler gem binaries with -S --- ext/WarMain.java | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/ext/WarMain.java b/ext/WarMain.java index 3fe2c787..19f0cbd8 100644 --- a/ext/WarMain.java +++ b/ext/WarMain.java @@ -7,6 +7,8 @@ import java.lang.reflect.Method; import java.io.InputStream; +import java.io.ByteArrayInputStream; +import java.io.SequenceInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -210,8 +212,7 @@ protected int launchJRuby(final URL[] jars) throws Exception { invokeMethod(rubyInstanceConfig, "setUpdateNativeENVEnabled", new Class[] { Boolean.TYPE }, false); - final String executablePath = (String) - invokeMethod(scriptingContainer, "runScriptlet", locateExecutableScript()); + final String executablePath = locateExecutable(scriptingContainer); if ( executablePath == null ) { throw new IllegalStateException("failed to locate gem executable: '" + executable + "'"); } @@ -219,8 +220,10 @@ protected int launchJRuby(final URL[] jars) throws Exception { invokeMethod(rubyInstanceConfig, "processArguments", (Object) arguments); - Object executableInput = invokeMethod(rubyInstanceConfig, "getScriptSource"); Object runtime = invokeMethod(scriptingContainer, "getRuntime"); + Object executableInput = + new SequenceInputStream(new ByteArrayInputStream(executableScriptEnvPrefix().getBytes()), + (InputStream) invokeMethod(rubyInstanceConfig, "getScriptSource")); debug("invoking " + executablePath + " with: " + Arrays.toString(executableArgv)); Object outcome = invokeMethod(runtime, "runFromMain", @@ -230,21 +233,47 @@ protected int launchJRuby(final URL[] jars) throws Exception { return ( outcome instanceof Number ) ? ( (Number) outcome ).intValue() : 0; } - protected String locateExecutableScript() { + protected String locateExecutable(final Object scriptingContainer) throws Exception { if ( executable == null ) { throw new IllegalStateException("no exexutable"); } + final File exec = new File(extractRoot, executable); + if ( exec.exists() ) { + return exec.getAbsolutePath(); + } + else { + final String script = locateExecutableScript(executable); + return (String) invokeMethod(scriptingContainer, "runScriptlet", script); + } + } + + protected String executableScriptEnvPrefix() { final String gemsDir = new File(extractRoot, "gems").getAbsolutePath(); final String gemfile = new File(extractRoot, "Gemfile").getAbsolutePath(); debug("setting GEM_HOME to " + gemsDir); debug("... and BUNDLE_GEMFILE to " + gemfile); - return - "ENV['GEM_HOME'] = ENV['GEM_PATH'] = '"+ gemsDir +"' \n" + + return "ENV['GEM_HOME'] = ENV['GEM_PATH'] = '"+ gemsDir +"' \n" + "ENV['BUNDLE_GEMFILE'] = '"+ gemfile +"' \n" + + + // FIXME: get this from web.xml config? + "ENV['BUNDLE_WITHOUT'] = 'assets:development:test' \n"; + } + + // TODO move this into an ERB template + protected String locateExecutableScript(final String executable) { + return executableScriptEnvPrefix() + "begin\n" + " require 'META-INF/init.rb' \n" + // locate the executable within gemspecs : " require 'rubygems' \n" + + " begin\n" + + // add bundler gems to load path: + " require 'bundler' \n" + + // TODO: environment from web.xml. Any others? + " Bundler.setup(:default, ENV.values_at('RACK_ENV', 'RAILS_ENV').compact)\n" + + " rescue LoadError\n" + + // bundler not used + " end\n" + " exec = '"+ executable +"' \n" + " spec = Gem::Specification.find { |s| s.executables.include?(exec) } \n" + " spec ? spec.bin_file(exec) : nil \n" + @@ -286,4 +315,3 @@ public static void main(String[] args) { } } - From 1ff2ec7c1efa10458e16dfcd612091ed72577efb Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Mon, 11 Mar 2013 09:42:31 -0500 Subject: [PATCH 3/5] Fix typo --- ext/WarMain.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/WarMain.java b/ext/WarMain.java index 19f0cbd8..cb236a36 100644 --- a/ext/WarMain.java +++ b/ext/WarMain.java @@ -235,7 +235,7 @@ protected int launchJRuby(final URL[] jars) throws Exception { protected String locateExecutable(final Object scriptingContainer) throws Exception { if ( executable == null ) { - throw new IllegalStateException("no exexutable"); + throw new IllegalStateException("no executable"); } final File exec = new File(extractRoot, executable); if ( exec.exists() ) { From d617414440ce39bac263b508a7afb4b4985fbd78 Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Mon, 11 Mar 2013 12:46:48 -0500 Subject: [PATCH 4/5] Set BUNDLE_WITHOUT from init.rb init.rb expects $servelet_container to be set. Luckily, it uses ||= to set those env variables. To move forward, I'm pre-setting them so that $servelet_container isn't used (since it is not set), but this could/should be done much nicer. --- ext/WarMain.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/ext/WarMain.java b/ext/WarMain.java index cb236a36..66e0f726 100644 --- a/ext/WarMain.java +++ b/ext/WarMain.java @@ -246,24 +246,20 @@ protected String locateExecutable(final Object scriptingContainer) throws Except return (String) invokeMethod(scriptingContainer, "runScriptlet", script); } } - protected String executableScriptEnvPrefix() { final String gemsDir = new File(extractRoot, "gems").getAbsolutePath(); final String gemfile = new File(extractRoot, "Gemfile").getAbsolutePath(); debug("setting GEM_HOME to " + gemsDir); debug("... and BUNDLE_GEMFILE to " + gemfile); - return "ENV['GEM_HOME'] = ENV['GEM_PATH'] = '"+ gemsDir +"' \n" + - "ENV['BUNDLE_GEMFILE'] = '"+ gemfile +"' \n" + - - // FIXME: get this from web.xml config? - "ENV['BUNDLE_WITHOUT'] = 'assets:development:test' \n"; + return "ENV['GEM_HOME'] ||= ENV['GEM_PATH'] = '"+ gemsDir +"' \n" + + "ENV['BUNDLE_GEMFILE'] ||= '"+ gemfile +"' \n" + + "require 'META-INF/init.rb' \n"; } // TODO move this into an ERB template protected String locateExecutableScript(final String executable) { return executableScriptEnvPrefix() + "begin\n" + - " require 'META-INF/init.rb' \n" + // locate the executable within gemspecs : " require 'rubygems' \n" + " begin\n" + From 3363641ec52c78ab74d990f287536a78b1ea0eda Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Mon, 11 Mar 2013 15:42:24 -0500 Subject: [PATCH 5/5] remove comment --- ext/WarMain.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/WarMain.java b/ext/WarMain.java index 66e0f726..612ea8d6 100644 --- a/ext/WarMain.java +++ b/ext/WarMain.java @@ -256,7 +256,6 @@ protected String executableScriptEnvPrefix() { "require 'META-INF/init.rb' \n"; } - // TODO move this into an ERB template protected String locateExecutableScript(final String executable) { return executableScriptEnvPrefix() + "begin\n" +