diff options
Diffstat (limited to 'devtools/client/projecteditor/lib/helpers/readdir.js')
-rw-r--r-- | devtools/client/projecteditor/lib/helpers/readdir.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/devtools/client/projecteditor/lib/helpers/readdir.js b/devtools/client/projecteditor/lib/helpers/readdir.js new file mode 100644 index 000000000..054730faf --- /dev/null +++ b/devtools/client/projecteditor/lib/helpers/readdir.js @@ -0,0 +1,89 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +importScripts("resource://gre/modules/osfile.jsm"); + +/** + * This file is meant to be loaded in a worker using: + * new ChromeWorker("chrome://devtools/content/projecteditor/lib/helpers/readdir.js"); + * + * Read a local directory inside of a web woker + * + * @param {string} path + * window to inspect + * @param {RegExp|string} ignore + * A pattern to ignore certain files. This is + * called with file.name.match(ignore). + * @param {Number} maxDepth + * How many directories to recurse before stopping. + * Directories with depth > maxDepth will be ignored. + */ +function readDir(path, ignore, maxDepth = Infinity) { + let ret = {}; + + let set = new Set(); + + let info = OS.File.stat(path); + set.add({ + path: path, + name: info.name, + isDir: info.isDir, + isSymLink: info.isSymLink, + depth: 0 + }); + + for (let info of set) { + let children = []; + + if (info.isDir && !info.isSymLink) { + if (info.depth > maxDepth) { + continue; + } + + let iterator = new OS.File.DirectoryIterator(info.path); + try { + for (let child in iterator) { + if (ignore && child.name.match(ignore)) { + continue; + } + + children.push(child.path); + set.add({ + path: child.path, + name: child.name, + isDir: child.isDir, + isSymLink: child.isSymLink, + depth: info.depth + 1 + }); + } + } finally { + iterator.close(); + } + } + + ret[info.path] = { + name: info.name, + isDir: info.isDir, + isSymLink: info.isSymLink, + depth: info.depth, + children: children, + }; + } + + return ret; +} + +onmessage = function (event) { + try { + let {path, ignore, depth} = event.data; + let message = readDir(path, ignore, depth); + postMessage(message); + } catch (ex) { + console.log(ex); + } +}; + + |