Add missing node os.release() implementation (#4065)

This commit is contained in:
ecyrbe 2020-02-24 14:35:45 +01:00 committed by GitHub
parent fe9ac35a65
commit fb08cf7005
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 66 additions and 11 deletions

View file

@ -85,7 +85,16 @@ export {
ShutdownMode,
shutdown
} from "./net.ts";
export { dir, env, exit, isTTY, execPath, hostname, loadavg } from "./os.ts";
export {
dir,
env,
exit,
isTTY,
execPath,
hostname,
loadavg,
osRelease
} from "./os.ts";
export {
permissions,
PermissionName,

View file

@ -81,6 +81,7 @@ export let OP_SIGNAL_BIND: number;
export let OP_SIGNAL_UNBIND: number;
export let OP_SIGNAL_POLL: number;
export let OP_LOADAVG: number;
export let OP_OS_RELEASE: number;
const PLUGIN_ASYNC_HANDLER_MAP: Map<number, AsyncHandler> = new Map();

View file

@ -52,6 +52,12 @@ declare namespace Deno {
*/
export function hostname(): string;
/** Get the OS release. Requires the `--allow-env` flag.
*
* console.log(Deno.osRelease());
*/
export function osRelease(): string;
/** Exit the Deno process with optional exit code. */
export function exit(code?: number): never;

View file

@ -29,6 +29,15 @@ export function hostname(): string {
return sendSync(dispatch.OP_HOSTNAME);
}
/** Get OS release.
* Requires the `--allow-env` flag.
*
* console.log(Deno.osRelease());
*/
export function osRelease(): string {
return sendSync(dispatch.OP_OS_RELEASE);
}
/** Exit the Deno process with optional exit code. */
export function exit(code = 0): never {
sendSync(dispatch.OP_EXIT, { code });

View file

@ -315,3 +315,19 @@ testPerm({ env: false }, function hostnamePerm(): void {
}
assert(caughtError);
});
testPerm({ env: true }, function releaseDir(): void {
assertNotEquals(Deno.osRelease(), "");
});
testPerm({ env: false }, function releasePerm(): void {
let caughtError = false;
try {
Deno.osRelease();
} catch (err) {
caughtError = true;
assert(err instanceof Deno.Err.PermissionDenied);
assertEquals(err.name, "PermissionDenied");
}
assert(caughtError);
});

View file

@ -21,6 +21,10 @@ pub fn init(i: &mut Isolate, s: &State) {
i.register_op("get_dir", s.core_op(json_op(s.stateful_op(op_get_dir))));
i.register_op("hostname", s.core_op(json_op(s.stateful_op(op_hostname))));
i.register_op("loadavg", s.core_op(json_op(s.stateful_op(op_loadavg))));
i.register_op(
"os_release",
s.core_op(json_op(s.stateful_op(op_os_release))),
);
}
#[derive(Deserialize)]
@ -185,6 +189,16 @@ fn op_hostname(
_zero_copy: Option<ZeroCopyBuf>,
) -> Result<JsonOp, OpError> {
state.check_env()?;
let hostname = sys_info::hostname().unwrap_or_else(|_| "".to_owned());
let hostname = sys_info::hostname().unwrap_or_else(|_| "".to_string());
Ok(JsonOp::Sync(json!(hostname)))
}
fn op_os_release(
state: &State,
_args: Value,
_zero_copy: Option<ZeroCopyBuf>,
) -> Result<JsonOp, OpError> {
state.check_env()?;
let release = sys_info::os_release().unwrap_or_else(|_| "".to_string());
Ok(JsonOp::Sync(json!(release)))
}

View file

@ -161,9 +161,9 @@ export function platform(): string {
return process.platform;
}
/** Not yet implemented */
/** Returns the operating system as a string */
export function release(): string {
notImplemented(SEE_GITHUB_ISSUE);
return Deno.osRelease();
}
/** Not yet implemented */

View file

@ -30,6 +30,13 @@ test({
}
});
test({
name: "release is a string",
fn() {
assertEquals(typeof os.release(), "string");
}
});
test({
name: "getPriority(): PID must be a 32 bit integer",
fn() {
@ -216,13 +223,6 @@ test({
Error,
"Not implemented"
);
assertThrows(
() => {
os.release();
},
Error,
"Not implemented"
);
assertThrows(
() => {
os.setPriority(0);