mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 12:19:12 +00:00
Tweaks to arg_hacks and add v8-flags to repl (#3409)
This commit is contained in:
parent
866dba8aa1
commit
3451c5fb55
3 changed files with 97 additions and 41 deletions
|
@ -23,6 +23,11 @@ pub struct DenoError {
|
||||||
msg: String,
|
msg: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn print_msg_and_exit(msg: &str) {
|
||||||
|
eprintln!("{}", msg);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn print_err_and_exit(err: ErrBox) {
|
pub fn print_err_and_exit(err: ErrBox) {
|
||||||
eprintln!("{}", err.to_string());
|
eprintln!("{}", err.to_string());
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
|
|
125
cli/flags.rs
125
cli/flags.rs
|
@ -5,11 +5,20 @@ use clap::Arg;
|
||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
use clap::SubCommand;
|
use clap::SubCommand;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
/// Creates vector of strings, Vec<String>
|
/// Creates vector of strings, Vec<String>
|
||||||
macro_rules! svec {
|
macro_rules! svec {
|
||||||
($($x:expr),*) => (vec![$($x.to_string()),*]);
|
($($x:expr),*) => (vec![$($x.to_string()),*]);
|
||||||
}
|
}
|
||||||
|
/// Creates HashSet<String> from string literals
|
||||||
|
macro_rules! sset {
|
||||||
|
($($x:expr),*) => {{
|
||||||
|
let _v = svec![$($x.to_string()),*];
|
||||||
|
let hash_set: HashSet<String> = _v.iter().cloned().collect();
|
||||||
|
hash_set
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! std_url {
|
macro_rules! std_url {
|
||||||
($x:expr) => {
|
($x:expr) => {
|
||||||
|
@ -348,7 +357,8 @@ fn xeval_parse(flags: &mut DenoFlags, matches: &clap::ArgMatches) {
|
||||||
flags.argv.push(code.to_string());
|
flags.argv.push(code.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn repl_parse(flags: &mut DenoFlags, _matches: &clap::ArgMatches) {
|
fn repl_parse(flags: &mut DenoFlags, matches: &clap::ArgMatches) {
|
||||||
|
v8_flags_arg_parse(flags, matches);
|
||||||
flags.subcommand = DenoSubcommand::Repl;
|
flags.subcommand = DenoSubcommand::Repl;
|
||||||
flags.allow_net = true;
|
flags.allow_net = true;
|
||||||
flags.allow_env = true;
|
flags.allow_env = true;
|
||||||
|
@ -404,6 +414,7 @@ fn run_test_args_parse(flags: &mut DenoFlags, matches: &clap::ArgMatches) {
|
||||||
lock_args_parse(flags, matches);
|
lock_args_parse(flags, matches);
|
||||||
importmap_arg_parse(flags, matches);
|
importmap_arg_parse(flags, matches);
|
||||||
config_arg_parse(flags, matches);
|
config_arg_parse(flags, matches);
|
||||||
|
v8_flags_arg_parse(flags, matches);
|
||||||
|
|
||||||
if matches.is_present("allow-read") {
|
if matches.is_present("allow-read") {
|
||||||
if matches.value_of("allow-read").is_some() {
|
if matches.value_of("allow-read").is_some() {
|
||||||
|
@ -464,11 +475,6 @@ fn run_test_args_parse(flags: &mut DenoFlags, matches: &clap::ArgMatches) {
|
||||||
flags.current_thread = true;
|
flags.current_thread = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(v8_flags) = matches.values_of("v8-flags") {
|
|
||||||
let s: Vec<String> = v8_flags.map(String::from).collect();
|
|
||||||
flags.v8_flags = Some(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
if matches.is_present("seed") {
|
if matches.is_present("seed") {
|
||||||
let seed_string = matches.value_of("seed").unwrap();
|
let seed_string = matches.value_of("seed").unwrap();
|
||||||
let seed = seed_string.parse::<u64>().unwrap();
|
let seed = seed_string.parse::<u64>().unwrap();
|
||||||
|
@ -696,7 +702,9 @@ instead of being alone on the next line (does not apply to self closing elements
|
||||||
}
|
}
|
||||||
|
|
||||||
fn repl_subcommand<'a, 'b>() -> App<'a, 'b> {
|
fn repl_subcommand<'a, 'b>() -> App<'a, 'b> {
|
||||||
SubCommand::with_name("repl").about("Read Eval Print Loop")
|
SubCommand::with_name("repl")
|
||||||
|
.about("Read Eval Print Loop")
|
||||||
|
.arg(v8_flags_arg())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn install_subcommand<'a, 'b>() -> App<'a, 'b> {
|
fn install_subcommand<'a, 'b>() -> App<'a, 'b> {
|
||||||
|
@ -884,6 +892,7 @@ fn run_test_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
|
||||||
.arg(config_arg())
|
.arg(config_arg())
|
||||||
.arg(lock_arg())
|
.arg(lock_arg())
|
||||||
.arg(lock_write_arg())
|
.arg(lock_write_arg())
|
||||||
|
.arg(v8_flags_arg())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("allow-read")
|
Arg::with_name("allow-read")
|
||||||
.long("allow-read")
|
.long("allow-read")
|
||||||
|
@ -953,14 +962,6 @@ fn run_test_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
|
||||||
Err(_) => Err("Seed should be a number".to_string()),
|
Err(_) => Err("Seed should be a number".to_string()),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.arg(
|
|
||||||
Arg::with_name("v8-flags")
|
|
||||||
.long("v8-flags")
|
|
||||||
.takes_value(true)
|
|
||||||
.use_delimiter(true)
|
|
||||||
.require_equals(true)
|
|
||||||
.help("Set V8 command line options. For help: --v8-flags=--help"),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_subcommand<'a, 'b>() -> App<'a, 'b> {
|
fn run_subcommand<'a, 'b>() -> App<'a, 'b> {
|
||||||
|
@ -1126,6 +1127,22 @@ fn importmap_arg_parse(flags: &mut DenoFlags, matches: &clap::ArgMatches) {
|
||||||
flags.import_map_path = matches.value_of("importmap").map(ToOwned::to_owned);
|
flags.import_map_path = matches.value_of("importmap").map(ToOwned::to_owned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn v8_flags_arg<'a, 'b>() -> Arg<'a, 'b> {
|
||||||
|
Arg::with_name("v8-flags")
|
||||||
|
.long("v8-flags")
|
||||||
|
.takes_value(true)
|
||||||
|
.use_delimiter(true)
|
||||||
|
.require_equals(true)
|
||||||
|
.help("Set V8 command line options. For help: --v8-flags=--help")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn v8_flags_arg_parse(flags: &mut DenoFlags, matches: &ArgMatches) {
|
||||||
|
if let Some(v8_flags) = matches.values_of("v8-flags") {
|
||||||
|
let s: Vec<String> = v8_flags.map(String::from).collect();
|
||||||
|
flags.v8_flags = Some(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(ry) move this to utility module and add test.
|
// TODO(ry) move this to utility module and add test.
|
||||||
/// Strips fragment part of URL. Panics on bad URL.
|
/// Strips fragment part of URL. Panics on bad URL.
|
||||||
pub fn resolve_urls(urls: Vec<String>) -> Vec<String> {
|
pub fn resolve_urls(urls: Vec<String>) -> Vec<String> {
|
||||||
|
@ -1189,34 +1206,50 @@ fn arg_hacks(mut args: Vec<String>) -> Vec<String> {
|
||||||
// to do "deno script.js" instead of "deno run script.js".
|
// to do "deno script.js" instead of "deno run script.js".
|
||||||
// This function insert the "run" into the second position of the args.
|
// This function insert the "run" into the second position of the args.
|
||||||
assert!(!args.is_empty());
|
assert!(!args.is_empty());
|
||||||
|
// Rational:
|
||||||
|
// deno -> deno repl
|
||||||
if args.len() == 1 {
|
if args.len() == 1 {
|
||||||
// Default to Repl subcommand.
|
|
||||||
args.insert(1, "repl".to_string());
|
args.insert(1, "repl".to_string());
|
||||||
} else {
|
return args;
|
||||||
// TODO don't have another list of subcommands here to maintain....
|
}
|
||||||
if args[1] != "bundle"
|
let subcommands = sset![
|
||||||
&& args[1] != "completions"
|
"bundle",
|
||||||
&& args[1] != "eval"
|
"completions",
|
||||||
&& args[1] != "fetch"
|
"eval",
|
||||||
&& args[1] != "fmt"
|
"fetch",
|
||||||
&& args[1] != "test"
|
"fmt",
|
||||||
&& args[1] != "info"
|
"test",
|
||||||
&& args[1] != "repl"
|
"info",
|
||||||
&& args[1] != "run"
|
"repl",
|
||||||
&& args[1] != "types"
|
"run",
|
||||||
&& args[1] != "install"
|
"types",
|
||||||
&& args[1] != "help"
|
"install",
|
||||||
&& args[1] != "version"
|
"help",
|
||||||
&& args[1] != "xeval"
|
"version",
|
||||||
&& args[1] != "-h"
|
"xeval"
|
||||||
&& args[1] != "--help"
|
];
|
||||||
&& args[1] != "-V"
|
let modifier_flags = sset!["-h", "--help", "-V", "--version"];
|
||||||
&& args[1] != "--version"
|
// deno [subcommand|behavior modifier flags] -> do nothing
|
||||||
{
|
if subcommands.contains(&args[1]) || modifier_flags.contains(&args[1]) {
|
||||||
args.insert(1, "run".to_string());
|
return args;
|
||||||
|
}
|
||||||
|
// This is not perfect either, since originally we should also
|
||||||
|
// support e.g. `-L debug` which `debug` would be treated as main module.
|
||||||
|
// Instead `-L=debug` must be used
|
||||||
|
let mut has_main_module = false;
|
||||||
|
for arg in args.iter().skip(1) {
|
||||||
|
if !arg.starts_with('-') {
|
||||||
|
has_main_module = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if has_main_module {
|
||||||
|
// deno ...-[flags] NAME ... -> deno run ...-[flags] NAME ...
|
||||||
|
args.insert(1, "run".to_string());
|
||||||
|
} else {
|
||||||
|
// deno ...-[flags] -> deno repl ...-[flags]
|
||||||
|
args.insert(1, "repl".to_string());
|
||||||
|
}
|
||||||
args
|
args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1224,6 +1257,20 @@ fn arg_hacks(mut args: Vec<String>) -> Vec<String> {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn arg_hacks_test() {
|
||||||
|
let args0 = arg_hacks(svec!["deno", "--version"]);
|
||||||
|
assert_eq!(args0, ["deno", "--version"]);
|
||||||
|
let args1 = arg_hacks(svec!["deno"]);
|
||||||
|
assert_eq!(args1, ["deno", "repl"]);
|
||||||
|
let args2 = arg_hacks(svec!["deno", "-L=debug", "-h"]);
|
||||||
|
assert_eq!(args2, ["deno", "repl", "-L=debug", "-h"]);
|
||||||
|
let args3 = arg_hacks(svec!["deno", "script.js"]);
|
||||||
|
assert_eq!(args3, ["deno", "run", "script.js"]);
|
||||||
|
let args4 = arg_hacks(svec!["deno", "-A", "script.js", "-L=info"]);
|
||||||
|
assert_eq!(args4, ["deno", "run", "-A", "script.js", "-L=info"]);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn version() {
|
fn version() {
|
||||||
let r = flags_from_vec_safe(svec!["deno", "--version"]);
|
let r = flags_from_vec_safe(svec!["deno", "--version"]);
|
||||||
|
|
|
@ -53,7 +53,7 @@ pub mod version;
|
||||||
pub mod worker;
|
pub mod worker;
|
||||||
|
|
||||||
use crate::deno_error::js_check;
|
use crate::deno_error::js_check;
|
||||||
use crate::deno_error::print_err_and_exit;
|
use crate::deno_error::{print_err_and_exit, print_msg_and_exit};
|
||||||
use crate::global_state::ThreadSafeGlobalState;
|
use crate::global_state::ThreadSafeGlobalState;
|
||||||
use crate::ops::io::get_stdio;
|
use crate::ops::io::get_stdio;
|
||||||
use crate::progress::Progress;
|
use crate::progress::Progress;
|
||||||
|
@ -365,7 +365,11 @@ fn run_script(flags: DenoFlags) {
|
||||||
let use_current_thread = flags.current_thread;
|
let use_current_thread = flags.current_thread;
|
||||||
let (mut worker, state) = create_worker_and_state(flags);
|
let (mut worker, state) = create_worker_and_state(flags);
|
||||||
|
|
||||||
let main_module = state.main_module.as_ref().unwrap().clone();
|
let maybe_main_module = state.main_module.as_ref();
|
||||||
|
if maybe_main_module.is_none() {
|
||||||
|
print_msg_and_exit("Please provide a name to the main script to run.");
|
||||||
|
}
|
||||||
|
let main_module = maybe_main_module.unwrap().clone();
|
||||||
// Normal situation of executing a module.
|
// Normal situation of executing a module.
|
||||||
|
|
||||||
// Setup runtime.
|
// Setup runtime.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue