From d089f9797830a2729cbd45cb4ea6312eb43a28de Mon Sep 17 00:00:00 2001 From: Evgeniy Karagodin Date: Tue, 25 Jun 2019 23:05:41 +0700 Subject: [PATCH] Add homeDir to Deno namespace (#2578) --- cli/msg.fbs | 8 ++++++++ cli/ops.rs | 29 +++++++++++++++++++++++++++++ js/deno.ts | 2 +- js/os.ts | 20 ++++++++++++++++++++ js/os_test.ts | 12 +++++++++++- 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/cli/msg.fbs b/cli/msg.fbs index 82a3d573d1e330..ad9fb444ee9c46 100644 --- a/cli/msg.fbs +++ b/cli/msg.fbs @@ -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; diff --git a/cli/ops.rs b/cli/ops.rs index 77cfdfa7ceb4f4..56569c37a55790 100644 --- a/cli/ops.rs +++ b/cli/ops.rs @@ -241,6 +241,7 @@ pub fn op_selector_std(inner_type: msg::Any) -> Option { 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, +) -> 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<'_>, diff --git a/js/deno.ts b/js/deno.ts index 3275d93533518f..0bc3c95c7e52e4 100644 --- a/js/deno.ts +++ b/js/deno.ts @@ -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, diff --git a/js/os.ts b/js/os.ts index 0af4098c5f4fd8..558f47efd7cade 100644 --- a/js/os.ts +++ b/js/os.ts @@ -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; +} diff --git a/js/os_test.ts b/js/os_test.ts index d3c9e65462c64a..766cd1c3fae990 100644 --- a/js/os_test.ts +++ b/js/os_test.ts @@ -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(), ""); +});