From: Dmitry Volyntsev Date: Tue, 26 May 2020 16:34:45 +0000 (+0000) Subject: Added friends functions to fs.renameSync(). X-Git-Tag: 0.4.2~58 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=0f28a80e9a80b9c7429090e767bf57f19003aed2;p=njs.git Added friends functions to fs.renameSync(). --- diff --git a/src/njs_fs.c b/src/njs_fs.c index 1f5fcaad..4b95c95c 100644 --- a/src/njs_fs.c +++ b/src/njs_fs.c @@ -440,11 +440,22 @@ done: 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")); @@ -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; } @@ -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"), @@ -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, }, diff --git a/test/js/fs_promises_006.js b/test/js/fs_promises_006.js new file mode 100644 index 00000000..a5794f92 --- /dev/null +++ b/test/js/fs_promises_006.js @@ -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)); +}); diff --git a/test/njs_expect_test.exp b/test/njs_expect_test.exp index 73614b45..f7091a9a 100644 --- a/test/njs_expect_test.exp +++ b/test/njs_expect_test.exp @@ -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"