0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 17:34:47 -05:00

Rename perm to mode (#4276)

There's a lot of variation in doc comments and internal code about
whether chmod/0o777-style permissions are called `mode` or `perm`. (For
example, mkdir and writeFile choose differently.)

Had proposed earlier to go consistently with `perm`, but on balance devs
prefer to go with `mode`.
This commit is contained in:
dubiousjim 2020-03-07 22:29:12 -05:00 committed by GitHub
parent 8d1ba3552f
commit 0dd131d4a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 52 additions and 51 deletions

View file

@ -19,16 +19,16 @@ use nix::unistd::{chown as unix_chown, Gid, Uid};
pub fn write_file<T: AsRef<[u8]>>( pub fn write_file<T: AsRef<[u8]>>(
filename: &Path, filename: &Path,
data: T, data: T,
perm: u32, mode: u32,
) -> std::io::Result<()> { ) -> std::io::Result<()> {
write_file_2(filename, data, true, perm, true, false) write_file_2(filename, data, true, mode, true, false)
} }
pub fn write_file_2<T: AsRef<[u8]>>( pub fn write_file_2<T: AsRef<[u8]>>(
filename: &Path, filename: &Path,
data: T, data: T,
update_perm: bool, update_mode: bool,
perm: u32, mode: u32,
is_create: bool, is_create: bool,
is_append: bool, is_append: bool,
) -> std::io::Result<()> { ) -> std::io::Result<()> {
@ -40,21 +40,21 @@ pub fn write_file_2<T: AsRef<[u8]>>(
.create(is_create) .create(is_create)
.open(filename)?; .open(filename)?;
if update_perm { if update_mode {
set_permissions(&mut file, perm)?; set_permissions(&mut file, mode)?;
} }
file.write_all(data.as_ref()) file.write_all(data.as_ref())
} }
#[cfg(unix)] #[cfg(unix)]
fn set_permissions(file: &mut File, perm: u32) -> std::io::Result<()> { fn set_permissions(file: &mut File, mode: u32) -> std::io::Result<()> {
debug!("set file perm to {}", perm); debug!("set file mode to {}", mode);
file.set_permissions(PermissionsExt::from_mode(perm & 0o777)) file.set_permissions(PermissionsExt::from_mode(mode & 0o777))
} }
#[cfg(not(unix))] #[cfg(not(unix))]
fn set_permissions(_file: &mut File, _perm: u32) -> std::io::Result<()> { fn set_permissions(_file: &mut File, _mode: u32) -> std::io::Result<()> {
// NOOP on windows // NOOP on windows
Ok(()) Ok(())
} }
@ -94,22 +94,22 @@ pub fn make_temp(
} }
} }
pub fn mkdir(path: &Path, perm: u32, recursive: bool) -> std::io::Result<()> { pub fn mkdir(path: &Path, mode: u32, recursive: bool) -> std::io::Result<()> {
debug!("mkdir -p {}", path.display()); debug!("mkdir -p {}", path.display());
let mut builder = DirBuilder::new(); let mut builder = DirBuilder::new();
builder.recursive(recursive); builder.recursive(recursive);
set_dir_permission(&mut builder, perm); set_dir_permission(&mut builder, mode);
builder.create(path) builder.create(path)
} }
#[cfg(unix)] #[cfg(unix)]
fn set_dir_permission(builder: &mut DirBuilder, perm: u32) { fn set_dir_permission(builder: &mut DirBuilder, mode: u32) {
debug!("set dir perm to {}", perm); debug!("set dir mode to {}", mode);
builder.mode(perm & 0o777); builder.mode(mode & 0o777);
} }
#[cfg(not(unix))] #[cfg(not(unix))]
fn set_dir_permission(_builder: &mut DirBuilder, _perm: u32) { fn set_dir_permission(_builder: &mut DirBuilder, _mode: u32) {
// NOOP on windows // NOOP on windows
} }

View file

@ -10,7 +10,7 @@ unitTest(
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
// On windows no effect, but should not crash // On windows no effect, but should not crash
Deno.chmodSync(filename, 0o777); Deno.chmodSync(filename, 0o777);
@ -36,7 +36,7 @@ unitTest(
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const symlinkName = tempDir + "/test_symlink.txt"; const symlinkName = tempDir + "/test_symlink.txt";
Deno.symlinkSync(filename, symlinkName); Deno.symlinkSync(filename, symlinkName);
@ -85,7 +85,7 @@ unitTest(
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
// On windows no effect, but should not crash // On windows no effect, but should not crash
await Deno.chmod(filename, 0o777); await Deno.chmod(filename, 0o777);
@ -112,7 +112,7 @@ unitTest(
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const symlinkName = tempDir + "/test_symlink.txt"; const symlinkName = tempDir + "/test_symlink.txt";
Deno.symlinkSync(filename, symlinkName); Deno.symlinkSync(filename, symlinkName);

View file

@ -10,7 +10,7 @@ function readFileString(filename: string): string {
function writeFileString(filename: string, s: string): void { function writeFileString(filename: string, s: string): void {
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode(s); const data = enc.encode(s);
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
} }
function assertSameContent(filename1: string, filename2: string): void { function assertSameContent(filename1: string, filename2: string): void {

View file

@ -30,9 +30,10 @@ export interface FileInfo {
* *
* _Linux/Mac OS only._ */ * _Linux/Mac OS only._ */
ino: number | null; ino: number | null;
/** The underlying raw st_mode bits that contain the standard Unix permissions /** **UNSTABLE**: Match behavior with Go on windows for `mode`.
* for this file/directory. TODO Match behavior with Go on windows for mode. *
*/ * The underlying raw `st_mode` bits that contain the standard Unix
* permissions for this file/directory. */
mode: number | null; mode: number | null;
/** Number of hard links pointing to this file. /** Number of hard links pointing to this file.
* *

View file

@ -1023,7 +1023,7 @@ declare namespace Deno {
ino: number | null; ino: number | null;
/** **UNSTABLE**: Match behavior with Go on Windows for `mode`. /** **UNSTABLE**: Match behavior with Go on Windows for `mode`.
* *
* The underlying raw `st_mod`e bits that contain the standard Linux/Mac OS * The underlying raw `st_mode` bits that contain the standard Unix
* permissions for this file/directory. */ * permissions for this file/directory. */
mode: number | null; mode: number | null;
/** Number of hard links pointing to this file. /** Number of hard links pointing to this file.
@ -1233,7 +1233,7 @@ declare namespace Deno {
* exist at the specified path (defaults to `true`). */ * exist at the specified path (defaults to `true`). */
create?: boolean; create?: boolean;
/** Permissions always applied to file. */ /** Permissions always applied to file. */
perm?: number; mode?: number;
} }
/** Synchronously write data to the given path, by default creating a new /** Synchronously write data to the given path, by default creating a new

View file

@ -34,7 +34,7 @@ unitTest(
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
const data = new Uint8Array([41, 42, 43]); const data = new Uint8Array([41, 42, 43]);
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const metrics = Deno.metrics(); const metrics = Deno.metrics();
assert(metrics.opsDispatched === metrics.opsCompleted); assert(metrics.opsDispatched === metrics.opsCompleted);
@ -48,7 +48,7 @@ unitTest(
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
const data = new Uint8Array([41, 42, 43]); const data = new Uint8Array([41, 42, 43]);
await Deno.writeFile(filename, data, { perm: 0o666 }); await Deno.writeFile(filename, data, { mode: 0o666 });
const metrics = Deno.metrics(); const metrics = Deno.metrics();
assert(metrics.opsDispatched === metrics.opsCompleted); assert(metrics.opsDispatched === metrics.opsCompleted);

View file

@ -31,7 +31,7 @@ unitTest(
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const fileInfo = Deno.statSync(filename); const fileInfo = Deno.statSync(filename);
assert(fileInfo.isFile()); // check exist first assert(fileInfo.isFile()); // check exist first
Deno.removeSync(filename); // remove Deno.removeSync(filename); // remove
@ -115,7 +115,7 @@ unitTest(
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filePath = tempDir + "/test.txt"; const filePath = tempDir + "/test.txt";
const validSymlinkPath = tempDir + "/valid_symlink"; const validSymlinkPath = tempDir + "/valid_symlink";
Deno.writeFileSync(filePath, data, { perm: 0o666 }); Deno.writeFileSync(filePath, data, { mode: 0o666 });
// TODO(#3832): Remove "Not Implemented" error checking when symlink creation is implemented for Windows // TODO(#3832): Remove "Not Implemented" error checking when symlink creation is implemented for Windows
let errOnWindows; let errOnWindows;
try { try {
@ -199,7 +199,7 @@ unitTest(
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const fileInfo = Deno.statSync(filename); const fileInfo = Deno.statSync(filename);
assert(fileInfo.isFile()); // check exist first assert(fileInfo.isFile()); // check exist first
Deno.removeSync(filename, { recursive: true }); // remove Deno.removeSync(filename, { recursive: true }); // remove
@ -268,7 +268,7 @@ unitTest(
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const fileInfo = Deno.statSync(filename); const fileInfo = Deno.statSync(filename);
assert(fileInfo.isFile()); // check exist first assert(fileInfo.isFile()); // check exist first
await Deno.remove(filename); // remove await Deno.remove(filename); // remove
@ -351,7 +351,7 @@ unitTest(
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filePath = tempDir + "/test.txt"; const filePath = tempDir + "/test.txt";
const validSymlinkPath = tempDir + "/valid_symlink"; const validSymlinkPath = tempDir + "/valid_symlink";
Deno.writeFileSync(filePath, data, { perm: 0o666 }); Deno.writeFileSync(filePath, data, { mode: 0o666 });
// TODO(#3832): Remove "Not Implemented" error checking when symlink creation is implemented for Windows // TODO(#3832): Remove "Not Implemented" error checking when symlink creation is implemented for Windows
let errOnWindows; let errOnWindows;
try { try {
@ -437,7 +437,7 @@ unitTest(
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const fileInfo = Deno.statSync(filename); const fileInfo = Deno.statSync(filename);
assert(fileInfo.isFile()); // check exist first assert(fileInfo.isFile()); // check exist first
await Deno.remove(filename, { recursive: true }); // remove await Deno.remove(filename, { recursive: true }); // remove

View file

@ -190,7 +190,7 @@ unitTest(
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
const s = Deno.statSync(filename); const s = Deno.statSync(filename);
assert(s.dev === null); assert(s.dev === null);
assert(s.ino === null); assert(s.ino === null);
@ -212,7 +212,7 @@ unitTest(
const tempDir = Deno.makeTempDirSync(); const tempDir = Deno.makeTempDirSync();
const filename = tempDir + "/test.txt"; const filename = tempDir + "/test.txt";
const filename2 = tempDir + "/test2.txt"; const filename2 = tempDir + "/test2.txt";
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
// Create a link // Create a link
Deno.linkSync(filename, filename2); Deno.linkSync(filename, filename2);
const s = Deno.statSync(filename); const s = Deno.statSync(filename);

View file

@ -105,7 +105,7 @@ unitTest(
const testDir = Deno.makeTempDirSync(); const testDir = Deno.makeTempDirSync();
const keyFilename = testDir + "/key.pem"; const keyFilename = testDir + "/key.pem";
Deno.writeFileSync(keyFilename, new Uint8Array([]), { Deno.writeFileSync(keyFilename, new Uint8Array([]), {
perm: 0o666 mode: 0o666
}); });
try { try {
@ -134,7 +134,7 @@ unitTest(
const testDir = Deno.makeTempDirSync(); const testDir = Deno.makeTempDirSync();
const certFilename = testDir + "/cert.crt"; const certFilename = testDir + "/cert.crt";
Deno.writeFileSync(certFilename, new Uint8Array([]), { Deno.writeFileSync(certFilename, new Uint8Array([]), {
perm: 0o666 mode: 0o666
}); });
try { try {

View file

@ -15,7 +15,7 @@ unitTest(
const testDir = Deno.makeTempDirSync(); const testDir = Deno.makeTempDirSync();
const filename = testDir + "/file.txt"; const filename = testDir + "/file.txt";
Deno.writeFileSync(filename, new TextEncoder().encode("hello"), { Deno.writeFileSync(filename, new TextEncoder().encode("hello"), {
perm: 0o666 mode: 0o666
}); });
const atime = 1000; const atime = 1000;
@ -115,7 +115,7 @@ unitTest(
const testDir = Deno.makeTempDirSync(); const testDir = Deno.makeTempDirSync();
const filename = testDir + "/file.txt"; const filename = testDir + "/file.txt";
Deno.writeFileSync(filename, new TextEncoder().encode("hello"), { Deno.writeFileSync(filename, new TextEncoder().encode("hello"), {
perm: 0o666 mode: 0o666
}); });
const atime = 1000; const atime = 1000;

View file

@ -13,7 +13,7 @@ export interface WriteFileOptions {
* exist at the specified path (defaults to `true`). */ * exist at the specified path (defaults to `true`). */
create?: boolean; create?: boolean;
/** Permissions always applied to file. */ /** Permissions always applied to file. */
perm?: number; mode?: number;
} }
/** Synchronously write data to the given path, by default creating a new /** Synchronously write data to the given path, by default creating a new
@ -41,8 +41,8 @@ export function writeFileSync(
const openMode = !!options.append ? "a" : "w"; const openMode = !!options.append ? "a" : "w";
const file = openSync(path, openMode); const file = openSync(path, openMode);
if (options.perm !== undefined && options.perm !== null) { if (options.mode !== undefined && options.mode !== null) {
chmodSync(path, options.perm); chmodSync(path, options.mode);
} }
writeAllSync(file, data); writeAllSync(file, data);
@ -74,8 +74,8 @@ export async function writeFile(
const openMode = !!options.append ? "a" : "w"; const openMode = !!options.append ? "a" : "w";
const file = await open(path, openMode); const file = await open(path, openMode);
if (options.perm !== undefined && options.perm !== null) { if (options.mode !== undefined && options.mode !== null) {
await chmod(path, options.perm); await chmod(path, options.mode);
} }
await writeAll(file, data); await writeAll(file, data);

View file

@ -47,14 +47,14 @@ unitTest({ perms: { write: false } }, function writeFileSyncPerm(): void {
unitTest( unitTest(
{ perms: { read: true, write: true } }, { perms: { read: true, write: true } },
function writeFileSyncUpdatePerm(): void { function writeFileSyncUpdateMode(): void {
if (Deno.build.os !== "win") { if (Deno.build.os !== "win") {
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
Deno.writeFileSync(filename, data, { perm: 0o755 }); Deno.writeFileSync(filename, data, { mode: 0o755 });
assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755); assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755);
Deno.writeFileSync(filename, data, { perm: 0o666 }); Deno.writeFileSync(filename, data, { mode: 0o666 });
assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666); assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666);
} }
} }
@ -163,14 +163,14 @@ unitTest(
unitTest( unitTest(
{ perms: { read: true, write: true } }, { perms: { read: true, write: true } },
async function writeFileUpdatePerm(): Promise<void> { async function writeFileUpdateMode(): Promise<void> {
if (Deno.build.os !== "win") { if (Deno.build.os !== "win") {
const enc = new TextEncoder(); const enc = new TextEncoder();
const data = enc.encode("Hello"); const data = enc.encode("Hello");
const filename = Deno.makeTempDirSync() + "/test.txt"; const filename = Deno.makeTempDirSync() + "/test.txt";
await Deno.writeFile(filename, data, { perm: 0o755 }); await Deno.writeFile(filename, data, { mode: 0o755 });
assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755); assertEquals(Deno.statSync(filename).mode! & 0o777, 0o755);
await Deno.writeFile(filename, data, { perm: 0o666 }); await Deno.writeFile(filename, data, { mode: 0o666 });
assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666); assertEquals(Deno.statSync(filename).mode! & 0o777, 0o666);
} }
} }