Skip to content

Commit

Permalink
Implement renameAt.
Browse files Browse the repository at this point in the history
  • Loading branch information
whitequark committed Jul 14, 2024
1 parent 8312479 commit 37da2e6
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions lib/wasi-virt.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ class Directory {
return Object.keys(this.files).length;
}

traverse(path, flags = { create: false, remove: false }) {
traverse(path, { create = null, remove = false } = {}) {
let entry = this;
let separatorAt = -1;
do {
Expand All @@ -158,18 +158,20 @@ class Directory {
const files = entry.files;
separatorAt = path.indexOf('/');
const segment = separatorAt === -1 ? path : path.substring(0, separatorAt);
if (separatorAt === -1 && flags.remove)
if (separatorAt === -1 && remove)
delete files[segment];
else if (segment === '' || segment === '.')
/* disregard */;
else if (segment === '..')
/* hack to make scandir() work */;
else if (Object.hasOwn(files, segment))
entry = files[segment];
else if (flags.create === 'directory' || flags.create === 'file' && separatorAt !== -1)
else if (create === 'directory' || (create !== null && separatorAt !== -1))
entry = files[segment] = new Directory({});
else if (flags.create === 'file')
else if (create === 'file')
entry = files[segment] = new File(new Uint8Array());
else if (create instanceof File || create instanceof Directory)
entry = files[segment] = create;
else
throw 'no-entry';
path = path.substring(separatorAt + 1);
Expand Down Expand Up @@ -262,7 +264,7 @@ class Descriptor {
openAt(_pathFlags, path, openFlags, _descriptorFlags) {
if (!(this.entry instanceof Directory))
throw 'invalid';
const openEntry = this.entry.traverse(path, { create: openFlags.create ? 'file' : false });
const openEntry = this.entry.traverse(path, openFlags.create ? { create: 'file' } : {});
if (openFlags.directory) {
if (!(openEntry instanceof Directory))
throw 'not-directory';
Expand Down Expand Up @@ -323,6 +325,16 @@ class Descriptor {
const _pathEntry = this.entry.traverse(path);
throw 'invalid';
}

renameAt(oldPath, newDescriptor, newPath) {
if (!(this.entry instanceof Directory))
throw 'not-directory';
if (!(newDescriptor.entry instanceof Directory))
throw 'not-directory';
const oldEntry = this.entry.traverse(oldPath);
this.entry.traverse(newPath, { create: oldEntry });
this.entry.traverse(oldPath, { remove: true });
}
}

class DirectoryEntryStream {
Expand Down

0 comments on commit 37da2e6

Please sign in to comment.