diff options
author | Mani Maghsoudlou <manidlou@gmail.com> | 2018-09-03 17:22:30 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-09-04 11:57:04 -0400 |
commit | 641e3d404dfeb8f70ae0eb6c59b898b9f44742a1 (patch) | |
tree | 7611e133745846dbef3cd11437bad5d3f06a7e52 | |
parent | b2b4299e3b499c50bd11059854e3dcb4df2e2891 (diff) |
Implement renameSync
-rw-r--r-- | js/deno.ts | 1 | ||||
-rw-r--r-- | js/os.ts | 26 | ||||
-rw-r--r-- | js/os_test.ts | 38 | ||||
-rw-r--r-- | src/handlers.rs | 23 | ||||
-rw-r--r-- | src/msg.fbs | 6 |
5 files changed, 94 insertions, 0 deletions
diff --git a/js/deno.ts b/js/deno.ts index d121b3183..0eca6f0ac 100644 --- a/js/deno.ts +++ b/js/deno.ts @@ -8,6 +8,7 @@ export { makeTempDirSync, mkdirSync, readFileSync, + renameSync, statSync, lStatSync, writeFileSync @@ -336,3 +336,29 @@ export function writeFileSync( const msg = fbs.WriteFileSync.endWriteFileSync(builder); send(builder, fbs.Any.WriteFileSync, msg); } + +/** + * Renames (moves) oldpath to newpath. + * import { renameSync } from "deno"; + * const oldpath = 'from/path'; + * const newpath = 'to/path'; + * + * renameSync(oldpath, newpath); + */ +export function renameSync(oldpath: string, newpath: string): void { + /* Ideally we could write: + const res = send({ + command: fbs.Command.RENAME_SYNC, + renameOldPath: oldpath, + renameNewPath: newpath + }); + */ + const builder = new flatbuffers.Builder(); + const _oldpath = builder.createString(oldpath); + const _newpath = builder.createString(newpath); + fbs.RenameSync.startRenameSync(builder); + fbs.RenameSync.addOldpath(builder, _oldpath); + fbs.RenameSync.addNewpath(builder, _newpath); + const msg = fbs.RenameSync.endRenameSync(builder); + send(builder, fbs.Any.RenameSync, msg); +} diff --git a/js/os_test.ts b/js/os_test.ts index 8142956eb..2954b377c 100644 --- a/js/os_test.ts +++ b/js/os_test.ts @@ -204,3 +204,41 @@ testPerm({ write: false }, function mkdDirSyncPerm() { assertEqual(err.name, "deno.PermissionDenied"); }); +testPerm({ write: true }, function renameSync() { + const testDir = deno.makeTempDirSync() + "/test-rename"; + const oldpath = testDir + "/oldpath" + const newpath = testDir + "/newpath" + deno.mkdirSync(oldpath); + deno.renameSync(oldpath, newpath); + const newPathInfo = deno.statSync(newpath); + assert(newPathInfo.isDirectory()); + + let caughtErr = false; + let oldPathInfo; + + try { + oldPathInfo = deno.statSync(oldpath); + } catch (err) { + caughtErr = true; + // TODO assert(err instanceof deno.NotFound). + assert(err); + assertEqual(err.name, "deno.NotFound"); + } + + assert(caughtErr); + assertEqual(oldPathInfo, undefined); +}); + +test(function renameSyncPerm() { + let err; + try { + const oldpath = "/oldbaddir"; + const newpath = "/newbaddir"; + deno.renameSync(oldpath, newpath); + } catch (err_) { + err = err_; + } + // TODO assert(err instanceof deno.PermissionDenied). + assert(err); + assertEqual(err.name, "deno.PermissionDenied"); +}); diff --git a/src/handlers.rs b/src/handlers.rs index df77df26a..fe82c1c03 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -40,6 +40,7 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { msg::Any::MakeTempDir => handle_make_temp_dir, msg::Any::MkdirSync => handle_mkdir_sync, msg::Any::ReadFileSync => handle_read_file_sync, + msg::Any::RenameSync => handle_rename_sync, msg::Any::SetEnv => handle_set_env, msg::Any::StatSync => handle_stat_sync, msg::Any::WriteFileSync => handle_write_file_sync, @@ -673,3 +674,25 @@ fn handle_timer_clear( remove_timer(d, msg.id()); Ok(null_buf()) } + +fn handle_rename_sync( + d: *const DenoC, + base: msg::Base, + _builder: &mut FlatBufferBuilder, +) -> HandlerResult { + let msg = base.msg_as_rename_sync().unwrap(); + let oldpath = msg.oldpath().unwrap(); + let newpath = msg.newpath().unwrap(); + let deno = from_c(d); + + debug!("handle_rename_sync {} {}", oldpath, newpath); + if !deno.flags.allow_write { + let err = std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "allow_write is off.", + ); + return Err(err.into()); + } + fs::rename(Path::new(oldpath), Path::new(newpath))?; + Ok(null_buf()) +} diff --git a/src/msg.fbs b/src/msg.fbs index ebb4077f7..be9b07af7 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -19,6 +19,7 @@ union Any { MkdirSync, ReadFileSync, ReadFileSyncRes, + RenameSync, StatSync, StatSyncRes, SetEnv, @@ -181,6 +182,11 @@ table ReadFileSyncRes { data: [ubyte]; } +table RenameSync { + oldpath: string; + newpath: string; +} + table StatSync { filename: string; lstat: bool; |