From: Dmitry Volyntsev Date: Mon, 12 Aug 2019 18:04:49 +0000 (+0300) Subject: Added fs.renameSync(). X-Git-Tag: 0.3.4~5 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=56e2f5c4a63d5fd0b5531d560ef6ef0bd47f4662;p=njs.git Added fs.renameSync(). This closes #198 issue on Github. --- diff --git a/src/njs_fs.c b/src/njs_fs.c index 8f68a335..924223a5 100644 --- a/src/njs_fs.c +++ b/src/njs_fs.c @@ -30,6 +30,8 @@ static njs_int_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, int default_flags); static njs_int_t njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, int default_flags); +static njs_int_t njs_fs_rename_sync(njs_vm_t *vm, njs_value_t *args, + njs_uint_t nargs, njs_index_t unused); static njs_int_t njs_fs_fd_read(njs_vm_t *vm, njs_value_t *path, int fd, njs_str_t *data); @@ -904,6 +906,46 @@ 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) +{ + int ret; + const char *old_path, *new_path; + + if (njs_slow_path(!njs_is_string(njs_arg(args, nargs, 1)))) { + njs_type_error(vm, "oldPath must be a string"); + return NJS_ERROR; + } + + if (njs_slow_path(!njs_is_string(njs_arg(args, nargs, 2)))) { + njs_type_error(vm, "newPath must be a string"); + return NJS_ERROR; + } + + old_path = (const char *) njs_string_to_c_string(vm, njs_argument(args, 1)); + if (njs_slow_path(old_path == NULL)) { + return NJS_ERROR; + } + + new_path = (const char *) njs_string_to_c_string(vm, njs_argument(args, 2)); + if (njs_slow_path(new_path == NULL)) { + return NJS_ERROR; + } + + ret = rename(old_path, new_path); + if (njs_slow_path(ret != 0)) { + ret = njs_fs_error(vm, "rename", strerror(errno), NULL, errno, + &vm->retval); + return NJS_ERROR; + } + + njs_set_undefined(&vm->retval); + + return NJS_OK; +} + + static njs_int_t njs_fs_fd_read(njs_vm_t *vm, njs_value_t *path, int fd, njs_str_t *data) { @@ -1159,6 +1201,15 @@ static const njs_object_prop_t njs_fs_object_properties[] = .configurable = 1, }, + { + .type = NJS_PROPERTY, + .name = njs_string("renameSync"), + .value = njs_native_function(njs_fs_rename_sync, NJS_STRING_ARG, + NJS_STRING_ARG, 0), + .writable = 1, + .configurable = 1, + }, + }; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 0ee3e036..47dbde06 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -13156,6 +13156,16 @@ static njs_unit_test_t njs_test[] = "fs.writeFileSync('/njs_unknown_path', '', true)"), njs_str("TypeError: Unknown options type (a string or object required)") }, + /* require('fs').writeFileSync() */ + + { njs_str("var fs = require('fs');" + "fs.renameSync()"), + njs_str("TypeError: oldPath must be a string") }, + + { njs_str("var fs = require('fs');" + "fs.renameSync({toString(){return '/path/1'}})"), + njs_str("TypeError: newPath must be a string") }, + /* require('crypto').createHash() */ { njs_str("require('crypto').createHash('sha1')"), diff --git a/test/njs_expect_test.exp b/test/njs_expect_test.exp index dfb18946..fc116a72 100644 --- a/test/njs_expect_test.exp +++ b/test/njs_expect_test.exp @@ -646,6 +646,28 @@ njs_test { "'ABCABC'\r\n>> "} } +# require('fs').renameSync() + +njs_test { + {"var fs = require('fs'), mktemp = ()=> `/tmp/njs_${Math.round(Math.random() * 1000000)}`\r\n" + "undefined\r\n>> "} + {"var fn1 = mktemp(), fn2 = mktemp();\r\n" + "undefined\r\n>> "} + {"fs.writeFileSync(fn1, 'ABC')\r\n" + "undefined\r\n>> "} + {"fs.renameSync(fn1, fn2)\r\n" + "undefined\r\n>> "} + {"fs.readFileSync(fn2)\r\n" + "'ABC'\r\n>> "} +} + +njs_test { + {"var fs = require('fs')\r\n" + "undefined\r\n>> "} + {"fs.renameSync('build/test/file2', 'test/fs/')\r\n" + "Error: Not a directory*"} +} + # Modules njs_run {"-p" "test/module/libs" "./test/module/normal.js"} \