From eca74fd3cb6c7c18b0a41f2701c900cfb5c4112e Mon Sep 17 00:00:00 2001 From: Ben Lerner Date: Thu, 28 Jun 2018 20:51:51 -0400 Subject: [PATCH] New feature: creating a directory tree --- src/js/trove/filelib.js | 24 ++++++++++++++++++++++-- src/js/trove/string-dict.js | 4 +++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/js/trove/filelib.js b/src/js/trove/filelib.js index 2175dbe51c..8203ddfc0f 100644 --- a/src/js/trove/filelib.js +++ b/src/js/trove/filelib.js @@ -1,8 +1,10 @@ ({ - requires: [], + requires: [ + { "import-type": "builtin", name: "string-dict" }, + ], provides: {}, nativeRequires: ["fs"], - theModule: function(RUNTIME, NAMESPACE, uri, fs) { + theModule: function(RUNTIME, NAMESPACE, uri, SD, fs) { function InputFile(name) { this.name = name; this.fd = fs.openSync(name, "r") @@ -12,6 +14,17 @@ this.name = name; this.fd = fs.openSync(name, (append ? "a" : "w")); } + var checkISD = RUNTIME.getField(SD, "internal").checkISD; + var isISD = RUNTIME.getField(SD, "internal").isISD; + function makeDirs(baseDir, tree) { + if (!fs.existsSync(baseDir)) fs.mkdirSync(baseDir); + if (isISD(tree)) { + RUNTIME.ffi.toArray(RUNTIME.getField(tree, "keys-list").app()).forEach(function(sub) { + var kid = RUNTIME.getColonField(tree, "get-value").full_meth(tree, sub); + makeDirs(baseDir + "/" + sub, kid); + }); + } + } var vals = { "open-input-file": RUNTIME.makeFunction(function(filename) { @@ -154,6 +167,13 @@ fs.mkdirSync(directory); return true; }, "create-dir"), + "create-dir-tree": RUNTIME.makeFunction(function(baseDir, subtree) { + RUNTIME.ffi.checkArity(2, arguments, "create-dir-tree", false); + RUNTIME.checkString(baseDir); + checkISD(subtree); + makeDirs(baseDir, subtree); + return true; + }, "create-dir-tree"), "list-files": RUNTIME.makeFunction(function(directory) { RUNTIME.ffi.checkArity(1, arguments, "list-files", false); RUNTIME.checkString(directory); diff --git a/src/js/trove/string-dict.js b/src/js/trove/string-dict.js index 38ddc2a439..2991aaddaa 100644 --- a/src/js/trove/string-dict.js +++ b/src/js/trove/string-dict.js @@ -1414,7 +1414,9 @@ }; var internal = { checkISD: jsCheckISD, - checkMSD: jsCheckMSD + checkMSD: jsCheckMSD, + isISD: isImmutableStringDict, + isMSD: isMutableStringDict }; return runtime.makeModuleReturn(vals, types, internal); }