[sikuli] 208/385: added Roman's first version os JRubyScriptRunner
Gilles Filippini
pini at moszumanska.debian.org
Sun Jun 29 19:26:13 UTC 2014
This is an automated email from the git hooks/post-receive script.
pini pushed a commit to tag upstream/1.1.0_beta1
in repository sikuli.
commit 95c6dccec5a4d7d5da15e068b688627e0ad2bd67
Author: Raimund Hocke <info at its-me-raiman.de>
Date: Wed Feb 12 11:50:07 2014 +0100
added Roman's first version os JRubyScriptRunner
---
JRuby/pom.xml | 59 +-
.../org/sikuli/scriptrunner/JRubyScriptRunner.java | 612 ++++++++++++++++++---
2 files changed, 562 insertions(+), 109 deletions(-)
diff --git a/JRuby/pom.xml b/JRuby/pom.xml
index 1ea31dc..9ca8612 100755
--- a/JRuby/pom.xml
+++ b/JRuby/pom.xml
@@ -1,13 +1,13 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <!--
- * Copyright 2010-2014, Sikuli.org
- * Released under the MIT License.
- *
- * xxx, RaiMan 2014
- -->
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <!--
+ * Copyright 2010-2014, Sikuli.org
+ * Released under the MIT License.
+ *
+ * xxx, RaiMan 2014
+ -->
<parent>
<groupId>org.sikuli</groupId>
@@ -16,27 +16,32 @@
<relativePath>../</relativePath>
</parent>
- <modelVersion>4.0.0</modelVersion>
+ <modelVersion>4.0.0</modelVersion>
- <groupId>org.sikuli</groupId>
- <artifactId>SikuliX-JRuby</artifactId>
- <name>SikuliX-JRuby</name>
- <version>1.1.0</version>
+ <groupId>org.sikuli</groupId>
+ <artifactId>SikuliX-JRuby</artifactId>
+ <name>SikuliX-JRuby</name>
+ <version>1.1.0</version>
- <developers>
- <developer>
- <id>xxx</id>
- <name>yyy</name>
- <email>zzz at web.de</email>
- </developer>
- </developers>
+ <developers>
+ <developer>
+ <id>xxx</id>
+ <name>yyy</name>
+ <email>zzz at web.de</email>
+ </developer>
+ </developers>
- <dependencies>
- <dependency>
- <groupId>org.sikuli</groupId>
- <artifactId>SikuliX-Basics</artifactId>
- <version>${project.version}</version>
- </dependency>
- </dependencies>
+ <dependencies>
+ <dependency>
+ <groupId>org.sikuli</groupId>
+ <artifactId>SikuliX-Basics</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jruby</groupId>
+ <artifactId>jruby-complete</artifactId>
+ <version>1.7.10</version>
+ </dependency>
+ </dependencies>
</project>
diff --git a/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java b/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java
index 46c50a1..9597694 100644
--- a/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java
+++ b/JRuby/src/main/java/org/sikuli/scriptrunner/JRubyScriptRunner.java
@@ -6,90 +6,538 @@
*/
package org.sikuli.scriptrunner;
-import java.io.File;
+//import java.io.File;
import org.sikuli.basics.Debug;
import org.sikuli.basics.IScriptRunner;
+import java.io.File;
+//import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.List;
+//import java.io.PrintWriter;
+//import java.io.StringWriter;
+import java.io.FileReader;
+
+import org.sikuli.basics.FileManager;
+import org.sikuli.basics.Settings;
+import org.sikuli.basics.SikuliX;
+
+import org.jruby.embed.ScriptingContainer;
+import org.jruby.javasupport.JavaEmbedUtils.EvalUnit;
+import org.jruby.CompatVersion;
+import org.jruby.embed.LocalContextScope;
+import org.jruby.RubyInstanceConfig.CompileMode;
+import org.jruby.embed.PathType;
+
public class JRubyScriptRunner implements IScriptRunner {
- //<editor-fold defaultstate="collapsed" desc="new logging concept">
- private static final String me = "JRubyScriptRunner: ";
- private int lvl = 3;
-
- private void log(int level, String message, Object... args) {
- Debug.logx(level, level < 0 ? "error" : "debug",
- me + message, args);
- }
- //</editor-fold>
-
- @Override
- public void init(String[] args) {
- //TODO classpath and other path handlings
- }
-
- @Override
- public int runScript(File scriptfile, File imagedirectory, String[] scriptArgs, String[] forIDE) {
- log(-1, "not supported yet");
- return 1;
- }
-
- @Override
- public int runTest(File scriptfile, File imagedirectory, String[] scriptArgs, String[] forIDE) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public int runInteractive(String[] scriptArgs) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public String getCommandLineHelp() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public String getInteractiveHelp() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public String getName() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public String[] getFileEndings() {
- return new String[]{"rb"};
- }
-
- @Override
- public String hasFileEnding(String ending) {
- for (String suf : getFileEndings()) {
- if (suf.equals(ending.toLowerCase())) {
- return suf;
- }
- }
- return null;
- }
-
- @Override
- public void close() {
- //TODO something todo?
- }
-
- @Override
- public boolean doSomethingSpecial(String action, Object[] args) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void execBefore(String[] stmts) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void execAfter(String[] stmts) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-}
+ //<editor-fold defaultstate="collapsed" desc="new logging concept">
+ private static final String me = "JRubyScriptRunner: ";
+ private int lvl = 3;
+
+ private void log(int level, String message, Object... args) {
+ Debug.logx(level, level < 0 ? "error" : "debug",
+ me + message, args);
+ }
+ //</editor-fold>
+
+ /**
+ * The ScriptingContainer instance
+ */
+ private static ScriptingContainer interpreter = null;
+ private static int savedpathlen = 0;
+ private static final String COMPILE_ONLY = "# COMPILE ONLY";
+ /**
+ * sys.argv for the jruby script
+ */
+ private static ArrayList<String> sysargv = null;
+ /**
+ * The header commands, that are executed before every script
+ */
+ private final static String SCRIPT_HEADER
+ = "# coding: utf-8\n"
+ + "require 'java'\n"
+ + "require 'rukuli'\n"
+ + "require 'sikulix'\n"
+ + "Rukuli::Config.run do |config|\n"
+ + " config.image_path = SIKULI_IMAGE_PATH + '/'\n"
+ + " config.logging = true\n"
+ + "end\n";
+
+ private static ArrayList<String> codeBefore = null;
+ private static ArrayList<String> codeAfter = null;
+ /**
+ * CommandLine args
+ */
+ private int errorLine;
+ private int errorColumn;
+ private String errorType;
+ private String errorText;
+ private int errorClass;
+ private String errorTrace;
+
+ private static final int PY_SYNTAX = 0;
+ private static final int PY_RUNTIME = 1;
+ private static final int PY_JAVA = 2;
+ private static final int PY_UNKNOWN = -1;
+
+ private static String sikuliLibPath;
+
+ private static String timestampBuilt;
+ private static final String tsb = "##--##Fri Jan 28 13:06:44 MSD 2014##--##";
+
+ @Override
+ public void init(String[] args) {
+ //TODO classpath and other path handlings
+ sikuliLibPath = new File(SikuliX.getJarPath(), "Lib").getAbsolutePath();
+ if (!SikuliX.isRunningFromJar()
+ || !sikuliLibPath.contains("sikuli-ide")
+ || !sikuliLibPath.contains("sikuli-script")) {
+ if (System.getProperty("ruby.path") == null) {
+ System.setProperty("ruby.path", sikuliLibPath);
+ log(lvl, "init: python.path hack: \n" + System.getProperty("ruby.path"));
+ } else {
+ String currentPath = System.getProperty("ruby.path");
+ if (!FileManager.pathEquals(currentPath, sikuliLibPath)) {
+ log(-1, "init: Not running from jar and Ruby path not empty: Sikuli might not work!\n"
+ + "Current python.path: " + currentPath);
+ }
+ }
+ }
+ }
+
+ @Override
+ public int runScript(File scriptfile, File imagedirectory, String[] scriptArgs, String[] forIDE) {
+ if (null == scriptfile) {
+ //run the Ruby statements from argv (special for setup functional test)
+ fillSysArgv(null, null);
+ createScriptingContainer();
+ interpreter.put("SIKULI_IMAGE_PATH",
+ imagedirectory.getAbsolutePath());
+ executeScriptHeader(new String[0]);
+ SikuliX.displaySplash(null);
+ return runRuby(null, scriptArgs, null);
+ }
+ scriptfile = new File(scriptfile.getAbsolutePath());
+ fillSysArgv(scriptfile, scriptArgs);
+ createScriptingContainer();
+ interpreter.put("SIKULI_IMAGE_PATH",
+ imagedirectory.getAbsolutePath());
+ if (forIDE == null) {
+ executeScriptHeader(new String[]{
+ scriptfile.getParentFile().getAbsolutePath(),
+ scriptfile.getParentFile().getParentFile().getAbsolutePath()});
+ } else {
+ executeScriptHeader(new String[]{
+ forIDE[0]});
+ }
+ int exitCode = 0;
+ SikuliX.displaySplashFirstTime(null);
+ SikuliX.displaySplash(null);
+ if (forIDE == null) {
+ exitCode = runRuby(scriptfile, null,
+ new String[]{scriptfile.getParentFile().getAbsolutePath()});
+ } else {
+ exitCode = runRuby(scriptfile, null, forIDE);
+ }
+ log(lvl + 1, "runScript: at exit: path:");
+ for (Object p : interpreter.getLoadPaths()) {
+ log(lvl + 1, "runScript: " + p.toString());
+ }
+ log(lvl + 1, "runScript: at exit: --- end ---");
+ return exitCode;
+ }
+
+ @Override
+ public int runTest(File scriptfile, File imagedirectory, String[] scriptArgs, String[] forIDE) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public int runInteractive(String[] scriptArgs) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public String getCommandLineHelp() {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public String getInteractiveHelp() {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public String getName() {
+ return "jruby";
+ }
+
+ @Override
+ public String[] getFileEndings() {
+ return new String[]{"rb"};
+ }
+
+ @Override
+ public String hasFileEnding(String ending) {
+ for (String suf : getFileEndings()) {
+ if (suf.equals(ending.toLowerCase())) {
+ return suf;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void close() {
+ if (interpreter != null) {
+ interpreter.clear();
+ }
+ }
+
+ @Override
+ public boolean doSomethingSpecial(String action, Object[] args) {
+ if ("redirect".equals(action)) {
+ doRedirect((PipedInputStream[]) args);
+ return true;
+ } else if ("convertSrcToHtml".equals(action)) {
+ //convertSrcToHtml((String) args[0]);
+ return true;
+ } else if ("cleanBundle".equals(action)) {
+ //cleanBundle((String) args[0]);
+ return true;
+ } else if ("createRegionForWith".equals(action)) {
+ //args[0] = createRegionForWith(args[0]);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void execBefore(String[] stmts) {
+ if (stmts == null) {
+ codeBefore = null;
+ return;
+ }
+ if (codeBefore == null) {
+ codeBefore = new ArrayList<String>();
+ }
+ codeBefore.addAll(Arrays.asList(stmts));
+ }
+
+ @Override
+ public void execAfter(String[] stmts) {
+ if (stmts == null) {
+ codeAfter = null;
+ return;
+ }
+ if (codeAfter == null) {
+ codeAfter = new ArrayList<String>();
+ }
+ codeAfter.addAll(Arrays.asList(stmts));
+ }
+
+ private int runRuby(File ruFile, String[] stmts, String[] scriptPaths) {
+ int exitCode = 0;
+ String stmt = "";
+ boolean fromIDE = false;
+ String filename = "<script>";
+ try {
+ if (null == ruFile) {
+ log(lvl, "runRuby: running statements");
+ StringBuilder buffer = new StringBuilder();
+ for (String e : stmts) {
+ buffer.append(e);
+ }
+ interpreter.setScriptFilename(filename);
+ interpreter.runScriptlet(buffer.toString());
+ } else {
+ filename = ruFile.getAbsolutePath();
+ if (scriptPaths != null) {
+ FileReader script = new FileReader(ruFile.getAbsolutePath());
+// TODO implement compile only !!!
+ if (scriptPaths[0].toUpperCase().equals(COMPILE_ONLY)) {
+ log(lvl, "runRuby: running COMPILE_ONLY");
+ EvalUnit unit = interpreter.parse(script, filename);
+ //unit.run();
+ } else {
+ if (scriptPaths.length > 1) {
+ filename = FileManager.slashify(scriptPaths[0], true) +
+ scriptPaths[1] + ".sikuli";
+ log(lvl, "runRuby: running script from IDE: \n" + filename);
+ fromIDE = true;
+ } else {
+ filename = scriptPaths[0];
+ log(lvl, "runRuby: running script: \n" + filename);
+ }
+ interpreter.runScriptlet(script, filename);
+ }
+ } else {
+ log(-1, "runRuby: invalid arguments");
+ exitCode = -1;
+ }
+ }
+ } catch (Exception e) {
+ java.util.regex.Pattern p
+ = java.util.regex.Pattern.compile("SystemExit: ([0-9]+)");
+ Matcher matcher = p.matcher(e.toString());
+//TODO error stop I18N
+ if (matcher.find()) {
+ exitCode = Integer.parseInt(matcher.group(1));
+ Debug.info("Exit code: " + exitCode);
+ } else {
+ //log(-1,_I("msgStopped"));
+ if (null != ruFile) {
+ exitCode = findErrorSource(e, filename, scriptPaths);
+ } else {
+ Debug.error("runRuby: Ruby exception: %s with %s", e.getMessage(), stmt);
+ }
+ if (fromIDE) {
+ exitCode *= -1;
+ } else {
+ exitCode = 1;
+ }
+ }
+ }
+ return exitCode;
+ }
+
+ private int findErrorSource(Throwable thr, String filename, String[] forIDE) {
+ String err = thr.getMessage();
+
+ errorLine = -1;
+ errorColumn = -1;
+ errorClass = PY_UNKNOWN;
+ errorType = "--UnKnown--";
+ errorText = "--UnKnown--";
+
+ String msg;
+
+ if (err.startsWith("(SyntaxError)")) {
+ //org.jruby.parser.ParserSyntaxException
+ //(SyntaxError) /tmp/sikuli-3213678404470696048.rb:2: syntax error, unexpected tRCURLY
+
+ Pattern pLineS = Pattern.compile("(?<=:)(.*):(.*)");
+ java.util.regex.Matcher mLine = pLineS.matcher(err);
+ if (mLine.find()) {
+ log(lvl + 2, "SyntaxError error line: " + mLine.group(1));
+ errorText = mLine.group(2) == null ? errorText : mLine.group(2);
+ log(lvl + 2, "SyntaxError: " + errorText);
+ errorLine = Integer.parseInt(mLine.group(1));
+ errorColumn = -1;
+ errorClass = PY_SYNTAX;
+ errorType = "SyntaxError";
+ }
+ } else {
+ //if (err.startsWith("(NameError)")) {
+ // org.jruby.embed.EvalFailedException
+ //(NameError) undefined local variable or method `asdf' for main:Object
+
+ Pattern type = Pattern.compile("(?<=\\()(\\w*)");
+ java.util.regex.Matcher mLine = type.matcher(err);
+ if (mLine.find()) {
+ errorType = mLine.group(1);
+ }
+ Throwable cause = thr.getCause();
+ //cause.printStackTrace();
+ for (StackTraceElement line : cause.getStackTrace()) {
+ if (line.getFileName().equals(filename)) {
+ errorText = cause.getMessage();
+ errorColumn = -1;
+ errorLine = line.getLineNumber();
+ errorClass = PY_RUNTIME;
+ this.errorText = thr.getMessage();
+
+ if (errorType.equals("Rukuli::ImageNotFound")) {
+ errorType = "FindFailed";
+ } else if (errorType.equals("RuntimeError")) {
+ errorClass = PY_JAVA;
+ }
+ //errorType = "NameError";
+ break;
+ }
+ }
+ }
+
+ msg = "script";
+ if (forIDE != null) {
+ msg += " [ " + forIDE[1] + " ]";
+ }
+ if (errorLine != -1) {
+ //log(-1,_I("msgErrorLine", srcLine));
+ msg += " stopped with error in line " + errorLine;
+ if (errorColumn != -1) {
+ msg += " at column " + errorColumn;
+ }
+ } else {
+ msg += "] stopped with error at line --unknown--";
+ }
+
+ if (errorClass == PY_RUNTIME || errorClass == PY_SYNTAX) {
+ Debug.error(msg);
+ Debug.error(errorType + " ( " + errorText + " )");
+ if (errorClass == PY_RUNTIME) {
+ Throwable cause = thr.getCause();
+ //cause.printStackTrace();
+ StackTraceElement[] stack = cause.getStackTrace();
+ /*StringWriter writer = new StringWriter();
+ PrintWriter out = new PrintWriter(writer);
+ cause.printStackTrace(out);
+ errorTrace = writer.toString();*/
+ StringBuilder builder = new StringBuilder();
+ for (StackTraceElement line : stack) {
+ builder.append(line.getLineNumber());
+ builder.append(":\t");
+ builder.append(line.getClassName());
+ builder.append(" ( ");
+ builder.append(line.getMethodName());
+ builder.append(" )\t");
+ builder.append(line.getFileName());
+ builder.append('\n');
+ }
+ errorTrace = builder.toString();
+ if (errorTrace.length() > 0) {
+ Debug.error("--- Traceback --- error source first\n"
+ + "line: class ( method ) file \n" + errorTrace
+ + "[error] --- Traceback --- end --------------");
+ log(lvl + 2, "--- Traceback --- error source first\n"
+ + "line: class ( method ) file \n" + errorTrace
+ + "[error] --- Traceback --- end --------------");
+ }
+ }
+ } else if (errorClass == PY_JAVA) {
+ } else {
+ Debug.error(msg);
+ Debug.error("Could not evaluate error source nor reason. Analyze StackTrace!");
+ Debug.error(err);
+ }
+ return errorLine;
+ }
+
+ /**
+ * Initializes the ScriptingContainer and creates an instance.
+ */
+ private void createScriptingContainer() {
+//TODO create a specific RubyPath (sys.path)
+ if (interpreter == null) {
+ //ScriptingContainer.initialize(System.getProperties(), null, sysargv.toArray(new String[0]));
+
+ interpreter = new ScriptingContainer(
+ LocalContextScope.THREADSAFE);
+ interpreter.setCompatVersion(CompatVersion.RUBY2_0);
+ interpreter.setCompileMode(CompileMode.JIT);
+ }
+ }
+
+ public ScriptingContainer getScriptingContainer() {
+ if (interpreter == null) {
+ sysargv = new ArrayList<String>();
+ sysargv.add("--???--");
+ sysargv.addAll(Arrays.asList(Settings.getArgs()));
+ createScriptingContainer();
+ }
+ return interpreter;
+ }
+
+ /**
+ * Executes the defined header for the jython script.
+ *
+ * @param syspaths List of all syspath entries
+ */
+ private void executeScriptHeader(String[] syspaths) {
+// TODO implement compile only
+ if (syspaths.length > 0 && syspaths[0].toUpperCase().equals(COMPILE_ONLY)) {
+ return;
+ }
+ List<String> jypath = interpreter.getLoadPaths();
+ if (!FileManager.pathEquals((String) jypath.get(0), sikuliLibPath)) {
+ log(lvl, "executeScriptHeader: adding SikuliX Lib path to sys.path\n" + sikuliLibPath);
+ int jypathLength = jypath.size();
+ String[] jypathNew = new String[jypathLength + 1];
+ jypathNew[0] = sikuliLibPath;
+ for (int i = 0; i < jypathLength; i++) {
+ log(lvl + 1, "executeScriptHeader: before: %d: %s", i, jypath.get(i));
+ jypathNew[i + 1] = (String) jypath.get(i);
+ }
+ for (int i = 0; i < jypathLength; i++) {
+ jypath.set(i, jypathNew[i]);
+ }
+ jypath.add(jypathNew[jypathNew.length - 1]);
+ for (int i = 0; i < jypathNew.length; i++) {
+ log(lvl + 1, "executeScriptHeader: after: %d: %s", i, jypath.get(i));
+ }
+ }
+ if (savedpathlen == 0) {
+ savedpathlen = interpreter.getLoadPaths().size();
+ log(lvl + 1, "executeScriptHeader: saved sys.path: %d", savedpathlen);
+ }
+ while (interpreter.getLoadPaths().size() > savedpathlen) {
+ interpreter.getLoadPaths().remove(savedpathlen);
+ }
+ log(lvl + 1, "executeScriptHeader: at entry: path:");
+ for (Object p : interpreter.getLoadPaths()) {
+ log(lvl + 1, p.toString());
+ }
+ log(lvl + 1, "executeScriptHeader: at entry: --- end ---");
+ for (String syspath : syspaths) {
+ jypath.add(FileManager.slashify(syspath, false));
+ }
+
+ interpreter.runScriptlet(SCRIPT_HEADER);
+
+ if (codeBefore != null) {
+ StringBuilder buffer = new StringBuilder();
+ for (String line : codeBefore) {
+ buffer.append(line);
+ }
+ interpreter.runScriptlet(buffer.toString());
+ }
+ }
+
+ private boolean doRedirect(PipedInputStream[] pin) {
+ ScriptingContainer interpreter = getScriptingContainer();
+ try {
+ PipedOutputStream pout = new PipedOutputStream(pin[0]);
+ PrintStream ps = new PrintStream(pout, true);
+ System.setOut(ps);
+ interpreter.setOutput(ps);
+ } catch (Exception e) {
+ log(-1, "doRedirect: Couldn't redirect STDOUT\n%s", e.getMessage());
+ return false;
+ }
+ try {
+ PipedOutputStream pout = new PipedOutputStream(pin[1]);
+ PrintStream ps = new PrintStream(pout, true);
+ System.setErr(ps);
+ interpreter.setError(ps);
+ } catch (Exception e) {
+ log(-1, "doRedirect: Couldn't redirect STDERR\n%s", e.getMessage());
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Fills the sysargv list for the Ruby script
+ *
+ * @param filename The file containing the script: Has to be passed as first
+ * parameter in Ruby
+ * @param argv The parameters passed to Sikuli with --args
+ */
+ private void fillSysArgv(File filename, String[] argv) {
+ sysargv = new ArrayList<String>();
+ if (filename != null) {
+ sysargv.add(filename.getAbsolutePath());
+ }
+ if (argv != null) {
+ sysargv.addAll(Arrays.asList(argv));
+ }
+ }
+}
\ No newline at end of file
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/sikuli.git
More information about the pkg-java-commits
mailing list