feat: v1.1.4, fix runts shebang issue
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -1221,7 +1221,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "runrs"
|
name = "runrs"
|
||||||
version = "1.1.3"
|
version = "1.1.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"argh",
|
"argh",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "runrs"
|
name = "runrs"
|
||||||
version = "1.1.3"
|
version = "1.1.4"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "A Tool for Run Rust Scripts"
|
description = "A Tool for Run Rust Scripts"
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ use crate::{util, verify, RunScriptArgs};
|
|||||||
use rust_util::util_env::is_env_on;
|
use rust_util::util_env::is_env_on;
|
||||||
use rust_util::util_os::get_user_home;
|
use rust_util::util_os::get_user_home;
|
||||||
|
|
||||||
pub fn do_run_script(rs_args: &RunScriptArgs) {
|
pub fn do_run_script(args: &RunScriptArgs) {
|
||||||
if rs_args.arguments.is_empty() {
|
if args.arguments.is_empty() {
|
||||||
failure_and_exit!("Must assign a script file name");
|
failure_and_exit!("Must assign a script file name");
|
||||||
}
|
}
|
||||||
let script_file = &rs_args.arguments[0];
|
let script_file = &args.arguments[0];
|
||||||
verify::verify_script(script_file, is_env_on("RUNRS_SKIP_VERIFY"));
|
verify::verify_script(script_file, is_env_on("RUNRS_SKIP_VERIFY"));
|
||||||
|
|
||||||
let (_, script_sha256) = util::read_file_and_digest(script_file);
|
let (_, script_sha256) = util::read_file_and_digest(script_file);
|
||||||
@@ -21,7 +21,7 @@ pub fn do_run_script(rs_args: &RunScriptArgs) {
|
|||||||
&script_sha256,
|
&script_sha256,
|
||||||
&cache_script_bin_name,
|
&cache_script_bin_name,
|
||||||
);
|
);
|
||||||
for arg in rs_args.arguments.iter().skip(1) {
|
for arg in args.arguments.iter().skip(1) {
|
||||||
run_script_cmd.arg(arg);
|
run_script_cmd.arg(arg);
|
||||||
}
|
}
|
||||||
util::run_script_command(script_file, &cache_script_bin_name, &mut run_script_cmd)
|
util::run_script_command(script_file, &cache_script_bin_name, &mut run_script_cmd)
|
||||||
|
|||||||
@@ -1,26 +1,36 @@
|
|||||||
use crate::{verify, RunScriptArgs};
|
use crate::{verify, RunScriptArgs};
|
||||||
use rust_util::util_cmd;
|
use rust_util::util_cmd;
|
||||||
use rust_util::util_env::is_env_on;
|
use rust_util::util_env::is_env_on;
|
||||||
|
use std::fs;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
pub fn do_run_script(ts_args: &RunScriptArgs) {
|
pub fn do_run_script(args: &RunScriptArgs) {
|
||||||
if ts_args.arguments.is_empty() {
|
if args.arguments.is_empty() {
|
||||||
failure_and_exit!("Must assign a script file name");
|
failure_and_exit!("Must assign a script file name");
|
||||||
}
|
}
|
||||||
debugging!("Run ts args: {:?}", ts_args.arguments);
|
debugging!("Run ts args: {:?}", args.arguments);
|
||||||
let script_file = (|| {
|
let (script_file, first_arg) = (|| {
|
||||||
for arg in &ts_args.arguments {
|
for (i, arg) in args.arguments.iter().enumerate() {
|
||||||
if !arg.starts_with("--") {
|
if !arg.starts_with("--") {
|
||||||
return arg;
|
return (arg, i == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&ts_args.arguments[ts_args.arguments.len() - 1]
|
(&args.arguments[args.arguments.len() - 1], false)
|
||||||
})();
|
})();
|
||||||
verify::verify_script(script_file, is_env_on("RUNTS_SKIP_VERIFY"));
|
verify::verify_script(script_file, is_env_on("RUNTS_SKIP_VERIFY"));
|
||||||
|
|
||||||
let mut cmd = Command::new("/usr/bin/env");
|
let mut cmd = Command::new("/usr/bin/env");
|
||||||
cmd.args(["-S", "deno", "run"]);
|
cmd.args(["-S", "deno", "run"]);
|
||||||
for arg in &ts_args.arguments {
|
if first_arg {
|
||||||
|
let first_line_args = read_first_line_parse_args(script_file);
|
||||||
|
let left_first_line_args = first_line_args
|
||||||
|
.iter()
|
||||||
|
.skip_while(|arg| *arg != "--" && *arg != "run")
|
||||||
|
.skip(1)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
cmd.args(left_first_line_args);
|
||||||
|
}
|
||||||
|
for arg in &args.arguments {
|
||||||
cmd.arg(arg);
|
cmd.arg(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,3 +39,74 @@ pub fn do_run_script(ts_args: &RunScriptArgs) {
|
|||||||
failure_and_exit!("Run deno: {script_file} failed: {e}");
|
failure_and_exit!("Run deno: {script_file} failed: {e}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn read_first_line_parse_args(script_file: &str) -> Vec<String> {
|
||||||
|
if let Ok(script_content) = fs::read_to_string(script_file) {
|
||||||
|
if let Some(first_line) = script_content.lines().next() {
|
||||||
|
if first_line.starts_with("#!") {
|
||||||
|
return parse_args_line(&first_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_args_line(line: &str) -> Vec<String> {
|
||||||
|
let mut args = vec![];
|
||||||
|
|
||||||
|
let mut ln = String::new();
|
||||||
|
let mut in_quota = false;
|
||||||
|
let mut single_quota = false;
|
||||||
|
let chars = line.chars().collect::<Vec<_>>();
|
||||||
|
let mut i = 0;
|
||||||
|
while i < chars.len() {
|
||||||
|
let c = chars[i];
|
||||||
|
if in_quota {
|
||||||
|
if (single_quota && c == '\'') || (!single_quota && c == '"') {
|
||||||
|
in_quota = false;
|
||||||
|
} else if c == '\\' {
|
||||||
|
if i + 1 < chars.len() {
|
||||||
|
i += 1;
|
||||||
|
let nc = chars[i];
|
||||||
|
ln.push(nc);
|
||||||
|
} else {
|
||||||
|
ln.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ln.push(c);
|
||||||
|
}
|
||||||
|
} else if c == ' ' || c == '\t' {
|
||||||
|
if !ln.is_empty() {
|
||||||
|
args.push(ln.clone());
|
||||||
|
ln.clear();
|
||||||
|
}
|
||||||
|
} else if c == '\'' {
|
||||||
|
in_quota = true;
|
||||||
|
single_quota = true;
|
||||||
|
} else if c == '"' {
|
||||||
|
in_quota = true;
|
||||||
|
single_quota = false;
|
||||||
|
} else {
|
||||||
|
ln.push(c);
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
if !ln.is_empty() {
|
||||||
|
args.push(ln);
|
||||||
|
}
|
||||||
|
args
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_args_line() {
|
||||||
|
assert!(parse_args_line("").is_empty());
|
||||||
|
assert_eq!(vec!["a".to_string()], parse_args_line("a"));
|
||||||
|
assert_eq!(
|
||||||
|
vec!["a".to_string(), "aaaa'bbb".to_string()],
|
||||||
|
parse_args_line("a 'aaaa\\'bbb'")
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vec!["--allow-a".to_string(), "--allow-b".to_string()],
|
||||||
|
parse_args_line(" --allow-a --allow-b")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user