mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
support permission mode in mkdir (#4286)
This commit is contained in:
parent
72c408ea9d
commit
a28fa2415f
5 changed files with 28 additions and 14 deletions
|
@ -97,7 +97,6 @@ pub fn make_temp(
|
|||
}
|
||||
|
||||
pub fn mkdir(path: &Path, mode: u32, recursive: bool) -> std::io::Result<()> {
|
||||
debug!("mkdir -p {}", path.display());
|
||||
let mut builder = DirBuilder::new();
|
||||
builder.recursive(recursive);
|
||||
set_dir_permission(&mut builder, mode);
|
||||
|
@ -106,8 +105,9 @@ pub fn mkdir(path: &Path, mode: u32, recursive: bool) -> std::io::Result<()> {
|
|||
|
||||
#[cfg(unix)]
|
||||
fn set_dir_permission(builder: &mut DirBuilder, mode: u32) {
|
||||
debug!("set dir mode to {}", mode);
|
||||
builder.mode(mode & 0o777);
|
||||
let mode = mode & 0o777;
|
||||
debug!("set dir mode to {:o}", mode);
|
||||
builder.mode(mode);
|
||||
}
|
||||
|
||||
#[cfg(not(unix))]
|
||||
|
|
2
cli/js/lib.deno.ns.d.ts
vendored
2
cli/js/lib.deno.ns.d.ts
vendored
|
@ -740,7 +740,7 @@ declare namespace Deno {
|
|||
recursive?: boolean;
|
||||
/** Permissions to use when creating the directory (defaults to `0o777`,
|
||||
* before the process's umask).
|
||||
* Does nothing/raises on Windows. */
|
||||
* Ignored on Windows. */
|
||||
mode?: number;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
||||
import { sendSync, sendAsync } from "../dispatch_json.ts";
|
||||
|
||||
type MkdirArgs = { path: string; recursive: boolean; mode?: number };
|
||||
|
||||
// TODO(ry) The complexity in argument parsing is to support deprecated forms of
|
||||
// mkdir and mkdirSync.
|
||||
function mkdirArgs(
|
||||
path: string,
|
||||
optionsOrRecursive?: MkdirOptions | boolean,
|
||||
mode?: number
|
||||
): { path: string; recursive: boolean; mode: number } {
|
||||
const args = { path, recursive: false, mode: 0o777 };
|
||||
): MkdirArgs {
|
||||
const args: MkdirArgs = { path, recursive: false };
|
||||
if (typeof optionsOrRecursive == "boolean") {
|
||||
args.recursive = optionsOrRecursive;
|
||||
if (mode) {
|
||||
|
@ -34,7 +36,7 @@ export interface MkdirOptions {
|
|||
recursive?: boolean;
|
||||
/** Permissions to use when creating the directory (defaults to `0o777`,
|
||||
* before the process's umask).
|
||||
* Does nothing/raises on Windows. */
|
||||
* Ignored on Windows. */
|
||||
mode?: number;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,11 +15,10 @@ unitTest(
|
|||
{ perms: { read: true, write: true } },
|
||||
function mkdirSyncMode(): void {
|
||||
const path = Deno.makeTempDirSync() + "/dir";
|
||||
Deno.mkdirSync(path, { mode: 0o755 }); // no perm for x
|
||||
Deno.mkdirSync(path, { mode: 0o737 });
|
||||
const pathInfo = Deno.statSync(path);
|
||||
if (pathInfo.mode !== null) {
|
||||
// Skip windows
|
||||
assertEquals(pathInfo.mode & 0o777, 0o755);
|
||||
if (Deno.build.os !== "win") {
|
||||
assertEquals(pathInfo.mode! & 0o777, 0o737 & ~Deno.umask());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -45,6 +44,18 @@ unitTest(
|
|||
}
|
||||
);
|
||||
|
||||
unitTest(
|
||||
{ perms: { read: true, write: true } },
|
||||
async function mkdirMode(): Promise<void> {
|
||||
const path = Deno.makeTempDirSync() + "/dir";
|
||||
await Deno.mkdir(path, { mode: 0o737 });
|
||||
const pathInfo = Deno.statSync(path);
|
||||
if (Deno.build.os !== "win") {
|
||||
assertEquals(pathInfo.mode! & 0o777, 0o737 & ~Deno.umask());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
unitTest({ perms: { write: true } }, function mkdirErrIfExists(): void {
|
||||
let err;
|
||||
try {
|
||||
|
|
|
@ -280,7 +280,7 @@ struct MkdirArgs {
|
|||
promise_id: Option<u64>,
|
||||
path: String,
|
||||
recursive: bool,
|
||||
mode: u32,
|
||||
mode: Option<u32>,
|
||||
}
|
||||
|
||||
fn op_mkdir(
|
||||
|
@ -290,13 +290,14 @@ fn op_mkdir(
|
|||
) -> Result<JsonOp, OpError> {
|
||||
let args: MkdirArgs = serde_json::from_value(args)?;
|
||||
let path = deno_fs::resolve_from_cwd(Path::new(&args.path))?;
|
||||
let mode = args.mode.unwrap_or(0o777);
|
||||
|
||||
state.check_write(&path)?;
|
||||
|
||||
let is_sync = args.promise_id.is_none();
|
||||
blocking_json(is_sync, move || {
|
||||
debug!("op_mkdir {}", path.display());
|
||||
deno_fs::mkdir(&path, args.mode, args.recursive)?;
|
||||
debug!("op_mkdir {} {:o} {}", path.display(), mode, args.recursive);
|
||||
deno_fs::mkdir(&path, mode, args.recursive)?;
|
||||
Ok(json!({}))
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue