mirror of
https://github.com/denoland/deno.git
synced 2024-12-25 16:49:18 -05:00
parent
ccee2f01ba
commit
4519f9a50d
6 changed files with 69 additions and 26 deletions
|
@ -77,6 +77,8 @@ union Any {
|
||||||
Truncate,
|
Truncate,
|
||||||
HomeDir,
|
HomeDir,
|
||||||
HomeDirRes,
|
HomeDirRes,
|
||||||
|
ExecPath,
|
||||||
|
ExecPathRes,
|
||||||
Utime,
|
Utime,
|
||||||
WorkerGetMessage,
|
WorkerGetMessage,
|
||||||
WorkerGetMessageRes,
|
WorkerGetMessageRes,
|
||||||
|
@ -181,7 +183,6 @@ table StartRes {
|
||||||
cwd: string;
|
cwd: string;
|
||||||
pid: uint32;
|
pid: uint32;
|
||||||
argv: [string];
|
argv: [string];
|
||||||
exec_path: string;
|
|
||||||
main_module: string; // Absolute URL.
|
main_module: string; // Absolute URL.
|
||||||
debug_flag: bool;
|
debug_flag: bool;
|
||||||
deps_flag: bool;
|
deps_flag: bool;
|
||||||
|
@ -468,6 +469,12 @@ table HomeDirRes {
|
||||||
path: string;
|
path: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table ExecPath {}
|
||||||
|
|
||||||
|
table ExecPathRes {
|
||||||
|
path: string;
|
||||||
|
}
|
||||||
|
|
||||||
table Utime {
|
table Utime {
|
||||||
filename: string;
|
filename: string;
|
||||||
atime: uint64;
|
atime: uint64;
|
||||||
|
|
44
cli/ops.rs
44
cli/ops.rs
|
@ -212,6 +212,7 @@ pub fn op_selector_std(inner_type: msg::Any) -> Option<CliDispatchFn> {
|
||||||
msg::Any::Cwd => Some(op_cwd),
|
msg::Any::Cwd => Some(op_cwd),
|
||||||
msg::Any::Dial => Some(op_dial),
|
msg::Any::Dial => Some(op_dial),
|
||||||
msg::Any::Environ => Some(op_env),
|
msg::Any::Environ => Some(op_env),
|
||||||
|
msg::Any::ExecPath => Some(op_exec_path),
|
||||||
msg::Any::Exit => Some(op_exit),
|
msg::Any::Exit => Some(op_exit),
|
||||||
msg::Any::Fetch => Some(op_fetch),
|
msg::Any::Fetch => Some(op_fetch),
|
||||||
msg::Any::FetchSourceFile => Some(op_fetch_source_file),
|
msg::Any::FetchSourceFile => Some(op_fetch_source_file),
|
||||||
|
@ -354,18 +355,6 @@ fn op_start(
|
||||||
let cwd_off =
|
let cwd_off =
|
||||||
builder.create_string(deno_fs::normalize_path(cwd_path.as_ref()).as_ref());
|
builder.create_string(deno_fs::normalize_path(cwd_path.as_ref()).as_ref());
|
||||||
|
|
||||||
// Use permissions.allows_env() to bypass env request prompt.
|
|
||||||
let exec_path = if state.permissions.allows_env() {
|
|
||||||
let current_exe = std::env::current_exe().unwrap();
|
|
||||||
// Now apply URL parser to current exe to get fully resolved path, otherwise we might get
|
|
||||||
// `./` and `../` bits in `exec_path`
|
|
||||||
let exe_url = Url::from_file_path(current_exe).unwrap();
|
|
||||||
exe_url.to_file_path().unwrap().to_str().unwrap().to_owned()
|
|
||||||
} else {
|
|
||||||
"".to_owned()
|
|
||||||
};
|
|
||||||
let exec_path = builder.create_string(&exec_path);
|
|
||||||
|
|
||||||
let v8_version = version::v8();
|
let v8_version = version::v8();
|
||||||
let v8_version_off = builder.create_string(v8_version);
|
let v8_version_off = builder.create_string(v8_version);
|
||||||
|
|
||||||
|
@ -399,7 +388,6 @@ fn op_start(
|
||||||
v8_version: Some(v8_version_off),
|
v8_version: Some(v8_version_off),
|
||||||
deno_version: Some(deno_version_off),
|
deno_version: Some(deno_version_off),
|
||||||
no_color: !ansi::use_color(),
|
no_color: !ansi::use_color(),
|
||||||
exec_path: Some(exec_path),
|
|
||||||
xeval_delim,
|
xeval_delim,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
@ -1787,6 +1775,36 @@ fn op_home_dir(
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn op_exec_path(
|
||||||
|
state: &ThreadSafeState,
|
||||||
|
base: &msg::Base<'_>,
|
||||||
|
data: Option<PinnedBuf>,
|
||||||
|
) -> CliOpResult {
|
||||||
|
assert!(data.is_none());
|
||||||
|
let cmd_id = base.cmd_id();
|
||||||
|
|
||||||
|
state.check_env()?;
|
||||||
|
|
||||||
|
let builder = &mut FlatBufferBuilder::new();
|
||||||
|
let current_exe = std::env::current_exe().unwrap();
|
||||||
|
// Now apply URL parser to current exe to get fully resolved path, otherwise we might get
|
||||||
|
// `./` and `../` bits in `exec_path`
|
||||||
|
let exe_url = Url::from_file_path(current_exe).unwrap();
|
||||||
|
let path = exe_url.to_file_path().unwrap().to_str().unwrap().to_owned();
|
||||||
|
let path = Some(builder.create_string(&path));
|
||||||
|
let inner = msg::ExecPathRes::create(builder, &msg::ExecPathResArgs { path });
|
||||||
|
|
||||||
|
ok_buf(serialize_response(
|
||||||
|
cmd_id,
|
||||||
|
builder,
|
||||||
|
msg::BaseArgs {
|
||||||
|
inner: Some(inner.as_union_value()),
|
||||||
|
inner_type: msg::Any::ExecPathRes,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
fn op_resources(
|
fn op_resources(
|
||||||
_state: &ThreadSafeState,
|
_state: &ThreadSafeState,
|
||||||
base: &msg::Base<'_>,
|
base: &msg::Base<'_>,
|
||||||
|
|
26
js/os.ts
26
js/os.ts
|
@ -13,16 +13,10 @@ export let pid: number;
|
||||||
/** Reflects the NO_COLOR environment variable: https://no-color.org/ */
|
/** Reflects the NO_COLOR environment variable: https://no-color.org/ */
|
||||||
export let noColor: boolean;
|
export let noColor: boolean;
|
||||||
|
|
||||||
/** Path to the current deno process's executable file.
|
function setGlobals(pid_: number, noColor_: boolean): void {
|
||||||
* Requires the `--allow-env` flag, otherwise it'll be set to an empty `string`.
|
|
||||||
*/
|
|
||||||
export let execPath: string;
|
|
||||||
|
|
||||||
function setGlobals(pid_: number, noColor_: boolean, execPath_: string): void {
|
|
||||||
assert(!pid);
|
assert(!pid);
|
||||||
pid = pid_;
|
pid = pid_;
|
||||||
noColor = noColor_;
|
noColor = noColor_;
|
||||||
execPath = execPath_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check if running in terminal.
|
/** Check if running in terminal.
|
||||||
|
@ -127,7 +121,7 @@ export function start(
|
||||||
|
|
||||||
util.setLogDebug(startResMsg.debugFlag(), source);
|
util.setLogDebug(startResMsg.debugFlag(), source);
|
||||||
|
|
||||||
setGlobals(startResMsg.pid(), startResMsg.noColor(), startResMsg.execPath()!);
|
setGlobals(startResMsg.pid(), startResMsg.noColor());
|
||||||
|
|
||||||
if (preserveDenoNamespace) {
|
if (preserveDenoNamespace) {
|
||||||
util.immutableDefine(window, "Deno", window.Deno);
|
util.immutableDefine(window, "Deno", window.Deno);
|
||||||
|
@ -164,3 +158,19 @@ export function homeDir(): string {
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function execPath(): string {
|
||||||
|
const builder = flatbuffers.createBuilder();
|
||||||
|
const inner = msg.ExecPath.createExecPath(builder);
|
||||||
|
const baseRes = sendSync(builder, msg.Any.ExecPath, inner)!;
|
||||||
|
assert(msg.Any.ExecPathRes === baseRes.innerType());
|
||||||
|
const res = new msg.ExecPathRes();
|
||||||
|
assert(baseRes.inner(res) != null);
|
||||||
|
const path = res.path();
|
||||||
|
|
||||||
|
if (!path) {
|
||||||
|
throw new Error("Could not get home directory.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
|
@ -56,9 +56,17 @@ testPerm({ env: false }, function homeDirPerm(): void {
|
||||||
});
|
});
|
||||||
|
|
||||||
testPerm({ env: true }, function execPath(): void {
|
testPerm({ env: true }, function execPath(): void {
|
||||||
assertNotEquals(Deno.execPath, "");
|
assertNotEquals(Deno.execPath(), "");
|
||||||
});
|
});
|
||||||
|
|
||||||
testPerm({ env: false }, function execPathPerm(): void {
|
testPerm({ env: false }, function execPathPerm(): void {
|
||||||
assertEquals(Deno.execPath, "");
|
let caughtError = false;
|
||||||
|
try {
|
||||||
|
Deno.execPath();
|
||||||
|
} catch (err) {
|
||||||
|
caughtError = true;
|
||||||
|
assertEquals(err.kind, Deno.ErrorKind.PermissionDenied);
|
||||||
|
assertEquals(err.name, "PermissionDenied");
|
||||||
|
}
|
||||||
|
assert(caughtError);
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,7 +53,7 @@ async function main(): Promise<void> {
|
||||||
const cliPerms = permsToCliFlags(perms);
|
const cliPerms = permsToCliFlags(perms);
|
||||||
// run subsequent tests using same deno executable
|
// run subsequent tests using same deno executable
|
||||||
const args = [
|
const args = [
|
||||||
Deno.execPath,
|
Deno.execPath(),
|
||||||
"run",
|
"run",
|
||||||
"--no-prompt",
|
"--no-prompt",
|
||||||
...cliPerms,
|
...cliPerms,
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
console.log(Deno.execPath);
|
console.log(Deno.execPath());
|
||||||
|
|
Loading…
Reference in a new issue