]> git.kaiwu.me - njs.git/commitdiff
Added fs.renameSync().
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 12 Aug 2019 18:04:49 +0000 (21:04 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 12 Aug 2019 18:04:49 +0000 (21:04 +0300)
This closes #198 issue on Github.

src/njs_fs.c
src/test/njs_unit_test.c
test/njs_expect_test.exp

index 8f68a33502159643a0723e00d6deedc224dd948d..924223a57109a787c814db95d94fc082887a7268 100644 (file)
@@ -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,
+    },
+
 };
 
 
index 0ee3e036f70dd7497c1806949fcc869e2ec26bc6..47dbde06f2e485042251df59e3c7989f9a39ba60 100644 (file)
@@ -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')"),
index dfb18946c1bbcb157f4a33a7dd0573c3b6e1f316..fc116a7296b888ac910278e1a23cf7de12c436c4 100644 (file)
@@ -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"} \