From 47652825fca10ec1f153db9e2d2a07b2f39d4d2b Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Thu, 3 Dec 2015 17:12:27 +0100 Subject: [PATCH 1/4] added run script --- release.bat | 6 ++ script/RunScript.hx | 154 ++++++++++++++++++++++++++++++++++++++++++++ script/build.hxml | 4 ++ 3 files changed, 164 insertions(+) create mode 100644 script/RunScript.hx create mode 100644 script/build.hxml diff --git a/release.bat b/release.bat index a1ff05a..a3908d1 100644 --- a/release.bat +++ b/release.bat @@ -6,6 +6,12 @@ cd release mkdir hscript cd .. cp hscript/*.hx release/hscript +cd release +mkdir script +cp script/*.hx* release/script +cd release/script +haxe build.hxml +cd ../.. haxe -xml release/haxedoc.xml hscript.Interp hscript.Parser hscript.Bytes hscript.Macro 7z a -tzip release.zip release rm -rf release diff --git a/script/RunScript.hx b/script/RunScript.hx new file mode 100644 index 0000000..35027bd --- /dev/null +++ b/script/RunScript.hx @@ -0,0 +1,154 @@ +package; + +import haxe.*; +import hscript.*; +import sys.*; +import sys.io.*; +import sys.net.*; + +#if neko +import neko.Lib; +#end +#if cpp +import cpp.Lib; +#end + +class RunScript { + + public static function main () { + + var args = Sys.args (); + var workingDirectory = args.pop(); + + try { + Sys.setCwd(workingDirectory); + } catch (e:Dynamic) { + error("Failed to set current working directory to [" + workingDirectory + "]"); + Sys.exit(1); + } + + if (args.length == 0) { + error("Argument missing. Expected 1 got 0"); + } + + if (args[0] == "-f" || args[0] == "--file") { + if (args.length == 1) { + error("Argument missing. Expected 2 got 1"); + } + if (args.length > 2) { + error("Too many arguments. Expected 2 got " + args.length); + } + executeScriptFile(args[1]); + } + + if (args[0] == "--help") { + printHelp(); + } + + executeScript(args.join(" ")); + } + + static function executeScriptFile(scriptPath:String) { + if (!FileSystem.exists(scriptPath)) { + error("Specified file [" + scriptPath + "] not found"); + } + if (FileSystem.isDirectory(scriptPath)) { + error("Specified file [" + scriptPath + "] is a directory"); + } + var script = File.getContent(scriptPath); + executeScript(script); + } + + static function executeScript(script:String) { + var parser = new hscript.Parser(); + var program = parser.parseString(script); + var interp = new hscript.Interp(); + + // export classes of default package + interp.variables.set("Array", Array); + interp.variables.set("DateTools", DateTools); + interp.variables.set("Math", Math); + interp.variables.set("StringTools", StringTools); + interp.variables.set("Sys", Sys); + interp.variables.set("Xml", Xml); + + // export classes of sys.io package + interp.variables.set("FileSystem", FileSystem); + + // export classes of sys.io package + interp.variables.set("File", File); + + // export classes of sys.net package + interp.variables.set("Host", Host); + + // export classes of haxe package + interp.variables.set("Json", Json); + interp.variables.set("Http", Http); + interp.variables.set("Serializer", Serializer); + interp.variables.set("Unserializer", Unserializer); + + info(interp.execute(program)); + } + + static function printHelp(exit:Bool = true) { + var hscriptPath = getHaxelibPath("hscript"); + var meta:Dynamic = Json.parse(File.getContent(hscriptPath + "haxelib.json")); + info('${meta.name} v${meta.version}'); + info('${meta.description}'); + info(""); + info("usage: haxelib run hscript SCRIPT"); + info(" or: haxelib run hscript -f SCRIPTPATH"); + info(" or: haxelib run hscript --file SCRIPTPATH"); + info(""); + info("examples:"); + info(" C:\\>haxelib run hscript var x = 4; 1 + 2 * x"); + info(" 9"); + info(""); + info(" C:\\>haxelib run hscript \"5 | 6\""); + info(" 7"); + info(""); + info(" C:\\>haxelib run hscript for(i in 0...5) Sys.stdout().writeString(i + ', '); 'done'"); + info(" 0, 1, 2, 3, 4, done"); + info(""); + info(" C:\\>haxelib run hscript Host.localhost()"); + info(" mycomputer"); + info(""); + info(" C:\\>haxe build.hxml && haxelib run hscript Sys.putenv('MY_IP', new Host(''))"); + info(" 192.168.248.1"); + info(""); + info(" C:\\>for /f %i in ('haxelib run hscript \"new Host('')\"') do @set MY_IP=%i"); + info(" C:\\>echo %MY_IP%"); + info(" 192.168.248.1"); + + if(exit) + Sys.exit(0); + } + + static function info(msg:Dynamic) { + Sys.stdout().writeString("" + msg + "\n"); + } + + static function error(msg:Dynamic, exit:Bool = true) { + Sys.stderr().writeString("Error: " + msg + "!\n"); + if(exit) + Sys.exit(1); + } + + static function getHaxelibPath(libraryName:String):String { + var proc = new Process("haxelib", ["path", libraryName]); + var result = ""; + var ex:Dynamic = null; + try { + while(true) { + var line = proc.stdout.readLine(); + if (line.substr(0, 1) != "-") + result = line; + } + } catch (e:Dynamic) { + ex = e; + }; + proc.close(); + if (ex) error(ex); + return result; + } +} diff --git a/script/build.hxml b/script/build.hxml new file mode 100644 index 0000000..0b244ab --- /dev/null +++ b/script/build.hxml @@ -0,0 +1,4 @@ +-main RunScript +-neko ../run.n +-lib hscript +-dce no From 43dedeb68668747919dcfc5747a486aaab5276fc Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Thu, 3 Dec 2015 17:15:11 +0100 Subject: [PATCH 2/4] added run script --- script/RunScript.hx | 3 --- 1 file changed, 3 deletions(-) diff --git a/script/RunScript.hx b/script/RunScript.hx index 35027bd..7feca29 100644 --- a/script/RunScript.hx +++ b/script/RunScript.hx @@ -113,9 +113,6 @@ class RunScript { info(" C:\\>haxelib run hscript Host.localhost()"); info(" mycomputer"); info(""); - info(" C:\\>haxe build.hxml && haxelib run hscript Sys.putenv('MY_IP', new Host(''))"); - info(" 192.168.248.1"); - info(""); info(" C:\\>for /f %i in ('haxelib run hscript \"new Host('')\"') do @set MY_IP=%i"); info(" C:\\>echo %MY_IP%"); info(" 192.168.248.1"); From aa093db401d9951a86d9c888a475e018a2dd69a0 Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Fri, 4 Dec 2015 06:44:04 +0100 Subject: [PATCH 3/4] improved online help examples, exporting classes fully qualified --- script/RunScript.hx | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/script/RunScript.hx b/script/RunScript.hx index 7feca29..cbcc2a3 100644 --- a/script/RunScript.hx +++ b/script/RunScript.hx @@ -64,28 +64,20 @@ class RunScript { var program = parser.parseString(script); var interp = new hscript.Interp(); - // export classes of default package + // export some useful classes interp.variables.set("Array", Array); interp.variables.set("DateTools", DateTools); interp.variables.set("Math", Math); interp.variables.set("StringTools", StringTools); interp.variables.set("Sys", Sys); interp.variables.set("Xml", Xml); - - // export classes of sys.io package - interp.variables.set("FileSystem", FileSystem); - - // export classes of sys.io package - interp.variables.set("File", File); - - // export classes of sys.net package - interp.variables.set("Host", Host); - - // export classes of haxe package - interp.variables.set("Json", Json); - interp.variables.set("Http", Http); - interp.variables.set("Serializer", Serializer); - interp.variables.set("Unserializer", Unserializer); + interp.variables.set("sys.FileSystem", sys.FileSystem); + interp.variables.set("sys.io.File", sys.io.File); + interp.variables.set("sys.net.Host", sys.net.Host); + interp.variables.set("haxe.Json", haxe.Json); + interp.variables.set("haxe.Http", haxe.Http); + interp.variables.set("haxe.Serializer", haxe.Serializer); + interp.variables.set("haxe.Unserializer", haxe.Unserializer); info(interp.execute(program)); } @@ -101,22 +93,26 @@ class RunScript { info(" or: haxelib run hscript --file SCRIPTPATH"); info(""); info("examples:"); - info(" C:\\>haxelib run hscript var x = 4; 1 + 2 * x"); + info(" haxelib run hscript var x = 4; 1 + 2 * x"); info(" 9"); info(""); - info(" C:\\>haxelib run hscript \"5 | 6\""); + info(" haxelib run hscript \"5 | 6\""); info(" 7"); info(""); - info(" C:\\>haxelib run hscript for(i in 0...5) Sys.stdout().writeString(i + ', '); 'done'"); + info(" haxelib run hscript for(i in 0...5) Sys.stdout().writeString(i + ', '); 'done'"); info(" 0, 1, 2, 3, 4, done"); info(""); - info(" C:\\>haxelib run hscript Host.localhost()"); + info(" haxelib run hscript sys.net.Host.localhost()"); info(" mycomputer"); info(""); - info(" C:\\>for /f %i in ('haxelib run hscript \"new Host('')\"') do @set MY_IP=%i"); - info(" C:\\>echo %MY_IP%"); + if(Sys.systemName() == "Windows") { + info(" for /f %i in ('haxelib run hscript \"new sys.net.Host('')\"') do @set MY_IP=%i"); + info(" echo %MY_IP%"); + } else { + info(" MY_IP=$(haxelib run hscript \"new sys.net.Host('')\"')"); + info(" echo $MY_IP"); + } info(" 192.168.248.1"); - if(exit) Sys.exit(0); } From c00f8e95e96e4e628b3354e68da5b7edee4eff6f Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Fri, 4 Dec 2015 17:15:01 +0100 Subject: [PATCH 4/4] exporting classes fully qualified - 2nd attempt --- script/RunScript.hx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/script/RunScript.hx b/script/RunScript.hx index cbcc2a3..d41eb75 100644 --- a/script/RunScript.hx +++ b/script/RunScript.hx @@ -24,7 +24,6 @@ class RunScript { Sys.setCwd(workingDirectory); } catch (e:Dynamic) { error("Failed to set current working directory to [" + workingDirectory + "]"); - Sys.exit(1); } if (args.length == 0) { @@ -71,13 +70,21 @@ class RunScript { interp.variables.set("StringTools", StringTools); interp.variables.set("Sys", Sys); interp.variables.set("Xml", Xml); - interp.variables.set("sys.FileSystem", sys.FileSystem); - interp.variables.set("sys.io.File", sys.io.File); - interp.variables.set("sys.net.Host", sys.net.Host); - interp.variables.set("haxe.Json", haxe.Json); - interp.variables.set("haxe.Http", haxe.Http); - interp.variables.set("haxe.Serializer", haxe.Serializer); - interp.variables.set("haxe.Unserializer", haxe.Unserializer); + interp.variables.set("sys", { + "FileSystem": sys.FileSystem, + "io": { + "File": sys.io.File + }, + "net": { + "Host": sys.net.Host + } + }); + interp.variables.set("haxe", { + "Json": haxe.Json, + "Http": haxe.Http, + "Serializer": haxe.Serializer, + "Unserializer": haxe.Unserializer + }); info(interp.execute(program)); }