summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/msg.fbs8
-rw-r--r--cli/ops.rs29
-rw-r--r--js/deno.ts2
-rw-r--r--js/os.ts20
-rw-r--r--js/os_test.ts12
5 files changed, 69 insertions, 2 deletions
diff --git a/cli/msg.fbs b/cli/msg.fbs
index 82a3d573d..ad9fb444e 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 77cfdfa7c..56569c37a 100644
--- a/cli/ops.rs
+++ b/cli/ops.rs
@@ -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<'_>,
diff --git a/js/deno.ts b/js/deno.ts
index 3275d9353..0bc3c95c7 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 0af4098c5..558f47efd 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 d3c9e6546..766cd1c3f 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(), "");
+});