Skip to content

Commit

Permalink
support permission mode in mkdir (#4286)
Browse files Browse the repository at this point in the history
  • Loading branch information
dubiousjim authored Mar 11, 2020
1 parent 72c408e commit a28fa24
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 14 deletions.
6 changes: 3 additions & 3 deletions cli/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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))]
Expand Down
2 changes: 1 addition & 1 deletion cli/js/lib.deno.ns.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
8 changes: 5 additions & 3 deletions cli/js/ops/fs/mkdir.ts
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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;
}

Expand Down
19 changes: 15 additions & 4 deletions cli/js/tests/mkdir_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
);
Expand All @@ -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 {
Expand Down
7 changes: 4 additions & 3 deletions cli/ops/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ struct MkdirArgs {
promise_id: Option<u64>,
path: String,
recursive: bool,
mode: u32,
mode: Option<u32>,
}

fn op_mkdir(
Expand All @@ -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!({}))
})
}
Expand Down

0 comments on commit a28fa24

Please sign in to comment.