Skip to content

Commit

Permalink
Added friends functions to fs.renameSync().
Browse files Browse the repository at this point in the history
  • Loading branch information
xeioex committed May 26, 2020
1 parent 2d65a6c commit 0f28a80
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 9 deletions.
48 changes: 39 additions & 9 deletions src/njs_fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,11 +440,22 @@ njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,


static njs_int_t
njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
njs_fs_rename(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t calltype)
{
njs_int_t ret;
const char *old_path, *new_path;
njs_int_t ret;
const char *old_path, *new_path;
njs_value_t retval, *callback;

callback = NULL;

if (calltype == NJS_FS_CALLBACK) {
callback = njs_arg(args, nargs, 3);
if (!njs_is_function(callback)) {
njs_type_error(vm, "\"callback\" must be a function");
return NJS_ERROR;
}
}

ret = njs_fs_path_arg(vm, &old_path, njs_arg(args, nargs, 1),
&njs_str_value("oldPath"));
Expand All @@ -458,15 +469,18 @@ njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
return ret;
}

njs_set_undefined(&vm->retval);
njs_set_undefined(&retval);

ret = rename(old_path, new_path);
if (njs_slow_path(ret != 0)) {
ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno,
&vm->retval);
ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno, &retval);
}

if (ret == NJS_OK) {
return njs_fs_result(vm, &retval, calltype, callback, 1);
}

return ret;
return NJS_ERROR;
}


Expand Down Expand Up @@ -1261,6 +1275,14 @@ static const njs_object_prop_t njs_fs_promises_properties[] =
.configurable = 1,
},

{
.type = NJS_PROPERTY,
.name = njs_string("rename"),
.value = njs_native_function2(njs_fs_rename, 0, NJS_FS_PROMISE),
.writable = 1,
.configurable = 1,
},

{
.type = NJS_PROPERTY,
.name = njs_string("rmdir"),
Expand Down Expand Up @@ -1443,10 +1465,18 @@ static const njs_object_prop_t njs_fs_object_properties[] =
.configurable = 1,
},

{
.type = NJS_PROPERTY,
.name = njs_string("rename"),
.value = njs_native_function2(njs_fs_rename, 0, NJS_FS_CALLBACK),
.writable = 1,
.configurable = 1,
},

{
.type = NJS_PROPERTY,
.name = njs_string("renameSync"),
.value = njs_native_function(njs_fs_rename_sync, 0),
.value = njs_native_function2(njs_fs_rename, 0, NJS_FS_DIRECT),
.writable = 1,
.configurable = 1,
},
Expand Down
104 changes: 104 additions & 0 deletions test/js/fs_promises_006.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
var fs = require('fs');
var fsp = fs.promises;
var dname = './build/test/';
var fname = (d) => d + '/fs_promises_006_file';
var fname_utf8 = (d) => d + '/fs_promises_αβγ_006';

var testSync = new Promise((resolve, reject) => {
try {
try { fs.unlinkSync(fname(dname)); } catch (e) {}
try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {}

fs.writeFileSync(fname(dname), fname(dname));

fs.renameSync(fname(dname), fname_utf8(dname));

fs.accessSync(fname_utf8(dname));

try {
fs.renameSync(fname_utf8(dname), dname);

} catch (e) {
if (e.syscall != 'rename'
|| (e.code != 'ENOTDIR' && e.code != 'EISDIR'))
{
throw e;
}
}

resolve();

} catch (e) {
reject(e);
}
});

var testCallback = new Promise((resolve, reject) => {
try {
try { fs.unlinkSync(fname(dname)); } catch (e) {}
try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {}

fs.writeFileSync(fname(dname), fname(dname));

fs.rename(fname(dname), fname_utf8(dname), err => {
if (err) {
throw err;
}
});

fs.accessSync(fname_utf8(dname));

fs.rename(fname_utf8(dname), dname, err => {
if (err.syscall != 'rename'
|| (err.code != 'ENOTDIR' && err.code != 'EISDIR'))
{
throw err;
}
});

resolve();

} catch (e) {
reject(e);
}
});

Promise.resolve()
.then(() => testSync)
.then(() => {
console.log('test fs.renameSync');
})
.catch((e) => {
console.log('test fs.renameSync failed', JSON.stringify(e));
})

.then(testCallback)
.then(() => {
console.log('test fs.rename');
})
.catch((e) => {
console.log('test fs.rename failed', JSON.stringify(e));
})

.then(() => {
try { fs.unlinkSync(fname(dname)); } catch (e) {}
try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {}

fs.writeFileSync(fname(dname), fname(dname));
})
.then(() => fsp.rename(fname(dname), fname_utf8(dname)))
.then(() => fsp.access(fname_utf8(dname)))
.then(() => fsp.rename(fname_utf8(dname), dname))
.catch(e => {
if (e.syscall != 'rename'
|| (e.code != 'ENOTDIR' && e.code != 'EISDIR'))
{
throw e;
}
})
.then(() => {
console.log('test fsp.rename');
})
.catch((e) => {
console.log('test fsp.rename failed', JSON.stringify(e));
});
5 changes: 5 additions & 0 deletions test/njs_expect_test.exp
Original file line number Diff line number Diff line change
Expand Up @@ -1135,3 +1135,8 @@ njs_run {"./test/js/fs_promises_005.js"} \
"test fs.mkdirSync
test fs.mkdir
test fsp.mkdir"

njs_run {"./test/js/fs_promises_006.js"} \
"test fs.renameSync
test fs.rename
test fsp.rename"

0 comments on commit 0f28a80

Please sign in to comment.