From dc69b03339cc75af1daa70700d1283fa33c22c3b Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Thu, 3 Jun 2021 22:14:37 +0800 Subject: [PATCH] feat(runtime): support URL overloads for Deno.rename/Deno.renameSync (#10512) --- cli/dts/lib.deno.ns.d.ts | 10 +++++++-- cli/tests/unit/rename_test.ts | 40 ++++++++++++++++++++++++++++++++++- runtime/js/30_fs.js | 10 +++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/cli/dts/lib.deno.ns.d.ts b/cli/dts/lib.deno.ns.d.ts index c8b4b60a05..34f8c2ad51 100644 --- a/cli/dts/lib.deno.ns.d.ts +++ b/cli/dts/lib.deno.ns.d.ts @@ -1322,7 +1322,10 @@ declare namespace Deno { * they are. It's always an error to rename anything to a non-empty directory. * * Requires `allow-read` and `allow-write` permissions. */ - export function renameSync(oldpath: string, newpath: string): void; + export function renameSync( + oldpath: string | URL, + newpath: string | URL, + ): void; /** Renames (moves) `oldpath` to `newpath`. Paths may be files or directories. * If `newpath` already exists and is not a directory, `rename()` replaces it. @@ -1339,7 +1342,10 @@ declare namespace Deno { * they are. It's always an error to rename anything to a non-empty directory. * * Requires `allow-read` and `allow-write` permission. */ - export function rename(oldpath: string, newpath: string): Promise; + export function rename( + oldpath: string | URL, + newpath: string | URL, + ): Promise; /** Synchronously reads and returns the entire contents of a file as utf8 * encoded string. Reading a directory throws an error. diff --git a/cli/tests/unit/rename_test.ts b/cli/tests/unit/rename_test.ts index 09633aed71..711b63aa73 100644 --- a/cli/tests/unit/rename_test.ts +++ b/cli/tests/unit/rename_test.ts @@ -1,5 +1,11 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. -import { assert, assertEquals, assertThrows, unitTest } from "./test_util.ts"; +import { + assert, + assertEquals, + assertThrows, + pathToAbsoluteFileUrl, + unitTest, +} from "./test_util.ts"; function assertMissing(path: string): void { let caughtErr = false; @@ -40,6 +46,22 @@ unitTest( }, ); +unitTest( + { perms: { read: true, write: true } }, + function renameSyncWithURL(): void { + const testDir = Deno.makeTempDirSync(); + const oldpath = testDir + "/oldpath"; + const newpath = testDir + "/newpath"; + Deno.mkdirSync(oldpath); + Deno.renameSync( + pathToAbsoluteFileUrl(oldpath), + pathToAbsoluteFileUrl(newpath), + ); + assertDirectory(newpath); + assertMissing(oldpath); + }, +); + unitTest( { perms: { read: false, write: true } }, function renameSyncReadPerm(): void { @@ -75,6 +97,22 @@ unitTest( }, ); +unitTest( + { perms: { read: true, write: true } }, + async function renameWithURL(): Promise { + const testDir = Deno.makeTempDirSync(); + const oldpath = testDir + "/oldpath"; + const newpath = testDir + "/newpath"; + Deno.mkdirSync(oldpath); + await Deno.rename( + pathToAbsoluteFileUrl(oldpath), + pathToAbsoluteFileUrl(newpath), + ); + assertDirectory(newpath); + assertMissing(oldpath); + }, +); + function readFileString(filename: string): string { const dataRead = Deno.readFileSync(filename); const dec = new TextDecoder("utf-8"); diff --git a/runtime/js/30_fs.js b/runtime/js/30_fs.js index 11e9b32ef2..c9daddacb6 100644 --- a/runtime/js/30_fs.js +++ b/runtime/js/30_fs.js @@ -156,11 +156,17 @@ } function renameSync(oldpath, newpath) { - core.opSync("op_rename_sync", { oldpath, newpath }); + core.opSync("op_rename_sync", { + oldpath: pathFromURL(oldpath), + newpath: pathFromURL(newpath), + }); } async function rename(oldpath, newpath) { - await core.opAsync("op_rename_async", { oldpath, newpath }); + await core.opAsync("op_rename_async", { + oldpath: pathFromURL(oldpath), + newpath: pathFromURL(newpath), + }); } function parseFileInfo(response) {