Add homeDir to Deno namespace (#2578)

This commit is contained in:
Evgeniy Karagodin 2019-06-25 23:05:41 +07:00 committed by Ryan Dahl
parent c56df45355
commit d089f97978
5 changed files with 69 additions and 2 deletions

View file

@ -74,6 +74,8 @@ union Any {
StatRes,
Symlink,
Truncate,
HomeDir,
HomeDirRes,
Utime,
WorkerGetMessage,
WorkerGetMessageRes,
@ -446,6 +448,12 @@ table Truncate {
len: uint;
}
table HomeDir {}
table HomeDirRes {
path: string;
}
table Utime {
filename: string;
atime: uint64;

View file

@ -241,6 +241,7 @@ pub fn op_selector_std(inner_type: msg::Any) -> Option<CliDispatchFn> {
msg::Any::Stat => Some(op_stat),
msg::Any::Symlink => Some(op_symlink),
msg::Any::Truncate => Some(op_truncate),
msg::Any::HomeDir => Some(op_home_dir),
msg::Any::Utime => Some(op_utime),
msg::Any::Write => Some(op_write),
@ -1718,6 +1719,34 @@ fn op_metrics(
))
}
fn op_home_dir(
_state: &ThreadSafeState,
base: &msg::Base<'_>,
data: Option<PinnedBuf>,
) -> CliOpResult {
assert!(data.is_none());
let cmd_id = base.cmd_id();
let builder = &mut FlatBufferBuilder::new();
let path = dirs::home_dir()
.unwrap_or_default()
.into_os_string()
.into_string()
.unwrap_or_default();
let path = Some(builder.create_string(&path));
let inner = msg::HomeDirRes::create(builder, &msg::HomeDirResArgs { path });
ok_buf(serialize_response(
cmd_id,
builder,
msg::BaseArgs {
inner: Some(inner.as_union_value()),
inner_type: msg::Any::HomeDirRes,
..Default::default()
},
))
}
fn op_resources(
_state: &ThreadSafeState,
base: &msg::Base<'_>,

View file

@ -1,7 +1,7 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
// Public deno module.
export { noColor, pid, env, exit, isTTY, execPath } from "./os";
export { noColor, pid, env, exit, isTTY, execPath, homeDir } from "./os";
export { chdir, cwd } from "./dir";
export {
File,

View file

@ -130,3 +130,23 @@ export function start(source?: string): msg.StartRes {
return startResMsg;
}
/**
* Returns the current user's home directory.
* Does not require elevated privileges.
*/
export function homeDir(): string {
const builder = flatbuffers.createBuilder();
const inner = msg.HomeDir.createHomeDir(builder);
const baseRes = sendSync(builder, msg.Any.HomeDir, inner)!;
assert(msg.Any.HomeDirRes === baseRes.innerType());
const res = new msg.HomeDirRes();
assert(baseRes.inner(res) != null);
const path = res.path();
if (!path) {
throw new Error("Could not get home directory.");
}
return path;
}

View file

@ -1,5 +1,11 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { test, testPerm, assert, assertEquals } from "./test_util.ts";
import {
test,
testPerm,
assert,
assertEquals,
assertNotEquals
} from "./test_util.ts";
testPerm({ env: true }, function envSuccess(): void {
const env = Deno.env();
@ -32,3 +38,7 @@ test(function osPid(): void {
test(function osIsTTYSmoke(): void {
console.log(Deno.isTTY());
});
test(function homeDir(): void {
assertNotEquals(Deno.homeDir(), "");
});