wip
diff --git a/src/library_workerfs.js b/src/library_workerfs.js index 9a30a14..e912769 100644 --- a/src/library_workerfs.js +++ b/src/library_workerfs.js
@@ -8,12 +8,30 @@ assert(ENVIRONMENT_IS_WORKER); if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); + var createdParents = {}; + function ensureParent(path) { + // return the parent node, creating subdirs as necessary + var parts = path.split('/'); + var parent = root; + for (var i = 0; i < parts.length-1; i++) { + var curr = parts.slice(0, i+1).join('/'); + if (!createdParents[curr]) { + createdParents[curr] = WORKERFS.createNode(parent, '/' + curr + '/', WORKERFS.DIR_MODE, 0, {}); + } + parent = createdParents[curr]; + } + return parent; + } + function base(path) { + var parts = path.split('/'); + return parts[parts.length-1]; + } // We also accept FileList here. - Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { - WORKERFS.createNode(root, file.name, WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); + (mount.opts["files"] || []).forEach(function(file) { + WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); }); (mount.opts["blobs"] || []).forEach(function(obj) { - WORKERFS.createNode(root, obj["name"], WORKERFS.FILE_MODE, 0, obj["data"]); + WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); }); return root; },
diff --git a/tests/fs/test_workerfs_package.cpp b/tests/fs/test_workerfs_package.cpp index 4ffcc49..adfcb4e 100644 --- a/tests/fs/test_workerfs_package.cpp +++ b/tests/fs/test_workerfs_package.cpp
@@ -20,16 +20,14 @@ buffer[5] = 0; assert(strcmp(buffer, "first") == 0); -/* printf("load second file\n"); FILE *f2 = fopen("files/sub/file2.txt", "r"); assert(f2); num = fread(buffer, 1, 6, f2); - assert(num == 5); + assert(num == 6); fclose(f2); buffer[6] = 0; assert(strcmp(buffer, "second") == 0); -*/ // all done printf("success\n"); @@ -54,6 +52,7 @@ Module.print('loading into filesystem'); meta = JSON.parse(meta); FS.mkdir('/files'); + FS.mkdir('/files/sub'); FS.mount(WORKERFS, { blobs: meta.files.map(function(file) { return { name: file.filename.substr(1), data: data.slice(file.start, file.end) };