forked from denoland/deno
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add chmod/chmodSync on unix (and fix Cargo.toml) (denoland#1088)
Initial implementation by Srijan Reddy (@srijanreddy98, denoland#672).
- Loading branch information
1 parent
fe97217
commit a99aaf5
Showing
8 changed files
with
213 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,3 +23,4 @@ ring = "0.13.2" | |
tempfile = "3" | ||
tokio = "0.1.11" | ||
url = "1.7.1" | ||
getopts = "0.2.18" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Copyright 2018 the Deno authors. All rights reserved. MIT license. | ||
import * as msg from "gen/msg_generated"; | ||
import * as flatbuffers from "./flatbuffers"; | ||
import * as dispatch from "./dispatch"; | ||
|
||
/** Changes the permission of a specific file/directory of specified path | ||
* synchronously. | ||
* | ||
* import { chmodSync } from "deno"; | ||
* chmodSync("/path/to/file", 0o666); | ||
*/ | ||
export function chmodSync(path: string, mode: number): void { | ||
dispatch.sendSync(...req(path, mode)); | ||
} | ||
|
||
/** Changes the permission of a specific file/directory of specified path. | ||
* | ||
* import { chmod } from "deno"; | ||
* await chmod("/path/to/file", 0o666); | ||
*/ | ||
export async function chmod(path: string, mode: number): Promise<void> { | ||
await dispatch.sendAsync(...req(path, mode)); | ||
} | ||
|
||
function req( | ||
path: string, | ||
mode: number | ||
): [flatbuffers.Builder, msg.Any, flatbuffers.Offset] { | ||
const builder = flatbuffers.createBuilder(); | ||
const path_ = builder.createString(path); | ||
msg.Chmod.startChmod(builder); | ||
msg.Chmod.addPath(builder, path_); | ||
msg.Chmod.addMode(builder, mode); | ||
const inner = msg.Chmod.endChmod(builder); | ||
return [builder, msg.Any.Chmod, inner]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
// Copyright 2018 the Deno authors. All rights reserved. MIT license. | ||
import { testPerm, assertEqual } from "./test_util.ts"; | ||
import * as deno from "deno"; | ||
|
||
const isNotWindows = deno.platform.os !== "win"; | ||
|
||
testPerm({ write: true }, function chmodSyncSuccess() { | ||
const enc = new TextEncoder(); | ||
const data = enc.encode("Hello"); | ||
const tempDir = deno.makeTempDirSync(); | ||
const filename = tempDir + "/test.txt"; | ||
deno.writeFileSync(filename, data, 0o666); | ||
|
||
// On windows no effect, but should not crash | ||
deno.chmodSync(filename, 0o777); | ||
|
||
// Check success when not on windows | ||
if (isNotWindows) { | ||
const fileInfo = deno.statSync(filename); | ||
assertEqual(fileInfo.mode & 0o777, 0o777); | ||
} | ||
}); | ||
|
||
// Check symlink when not on windows | ||
if (isNotWindows) { | ||
testPerm({ write: true }, function chmodSyncSymlinkSuccess() { | ||
const enc = new TextEncoder(); | ||
const data = enc.encode("Hello"); | ||
const tempDir = deno.makeTempDirSync(); | ||
|
||
const filename = tempDir + "/test.txt"; | ||
deno.writeFileSync(filename, data, 0o666); | ||
const symlinkName = tempDir + "/test_symlink.txt"; | ||
deno.symlink(filename, symlinkName); | ||
|
||
let symlinkInfo = deno.lstatSync(symlinkName); | ||
const symlinkMode = symlinkInfo.mode & 0o777; // plaform dependent | ||
|
||
deno.chmodSync(symlinkName, 0o777); | ||
|
||
// Change actual file mode, not symlink | ||
const fileInfo = deno.statSync(filename); | ||
assertEqual(fileInfo.mode & 0o777, 0o777); | ||
symlinkInfo = deno.lstatSync(symlinkName); | ||
assertEqual(symlinkInfo.mode & 0o777, symlinkMode); | ||
}); | ||
} | ||
|
||
testPerm({ write: true }, function chmodSyncFailure() { | ||
let err; | ||
try { | ||
const filename = "/badfile.txt"; | ||
deno.chmodSync(filename, 0o777); | ||
} catch (e) { | ||
err = e; | ||
} | ||
assertEqual(err.kind, deno.ErrorKind.NotFound); | ||
assertEqual(err.name, "NotFound"); | ||
}); | ||
|
||
testPerm({ write: false }, function chmodSyncPerm() { | ||
let err; | ||
try { | ||
deno.chmodSync("/somefile.txt", 0o777); | ||
} catch (e) { | ||
err = e; | ||
} | ||
assertEqual(err.kind, deno.ErrorKind.PermissionDenied); | ||
assertEqual(err.name, "PermissionDenied"); | ||
}); | ||
|
||
testPerm({ write: true }, async function chmodSuccess() { | ||
const enc = new TextEncoder(); | ||
const data = enc.encode("Hello"); | ||
const tempDir = deno.makeTempDirSync(); | ||
const filename = tempDir + "/test.txt"; | ||
deno.writeFileSync(filename, data, 0o666); | ||
|
||
// On windows no effect, but should not crash | ||
await deno.chmod(filename, 0o777); | ||
|
||
// Check success when not on windows | ||
if (isNotWindows) { | ||
const fileInfo = deno.statSync(filename); | ||
assertEqual(fileInfo.mode & 0o777, 0o777); | ||
} | ||
}); | ||
|
||
// Check symlink when not on windows | ||
if (isNotWindows) { | ||
testPerm({ write: true }, async function chmodSymlinkSuccess() { | ||
const enc = new TextEncoder(); | ||
const data = enc.encode("Hello"); | ||
const tempDir = deno.makeTempDirSync(); | ||
|
||
const filename = tempDir + "/test.txt"; | ||
deno.writeFileSync(filename, data, 0o666); | ||
const symlinkName = tempDir + "/test_symlink.txt"; | ||
deno.symlink(filename, symlinkName); | ||
|
||
let symlinkInfo = deno.lstatSync(symlinkName); | ||
const symlinkMode = symlinkInfo.mode & 0o777; // plaform dependent | ||
|
||
await deno.chmod(symlinkName, 0o777); | ||
|
||
// Just change actual file mode, not symlink | ||
const fileInfo = deno.statSync(filename); | ||
assertEqual(fileInfo.mode & 0o777, 0o777); | ||
symlinkInfo = deno.lstatSync(symlinkName); | ||
assertEqual(symlinkInfo.mode & 0o777, symlinkMode); | ||
}); | ||
} | ||
|
||
testPerm({ write: true }, async function chmodFailure() { | ||
let err; | ||
try { | ||
const filename = "/badfile.txt"; | ||
await deno.chmod(filename, 0o777); | ||
} catch (e) { | ||
err = e; | ||
} | ||
assertEqual(err.kind, deno.ErrorKind.NotFound); | ||
assertEqual(err.name, "NotFound"); | ||
}); | ||
|
||
testPerm({ write: false }, async function chmodPerm() { | ||
let err; | ||
try { | ||
await deno.chmod("/somefile.txt", 0o777); | ||
} catch (e) { | ||
err = e; | ||
} | ||
assertEqual(err.kind, deno.ErrorKind.PermissionDenied); | ||
assertEqual(err.name, "PermissionDenied"); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters