Skip to content

Commit 9e47097

Browse files
committed
feat: support extra binary commands and wrap args in quotes
1 parent 264ff83 commit 9e47097

File tree

2 files changed

+55
-12
lines changed

2 files changed

+55
-12
lines changed

src/configs/index.rs

+3
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ pub struct Volume {
7777
pub struct Binary {
7878
pub name: String,
7979
pub path: String,
80+
pub cmd: Option<Vec<String>>,
81+
#[serde(default)]
82+
pub wrap_args: bool
8083
}
8184

8285
#[derive(Serialize, Deserialize, Debug, Clone)]

src/runner.rs

+52-12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::process::{Command, Stdio};
77
use std::thread;
88
use rand::{thread_rng, Rng};
99
use rand::distributions::Alphanumeric;
10+
use crate::configs::index::Binary;
1011

1112
pub fn pull(package: &Package) -> bool {
1213
let image = format!("{}:{}", package.index.image, package.versions.current);
@@ -23,33 +24,57 @@ pub fn run(package: &Package, binary: Option<String>, params: &Vec<String>) -> b
2324
.expect("Failed to read stdin");
2425
}
2526

26-
let mut args = vec!["run".to_string(), "--rm".to_string(), "--name".to_string(), generate_random_name(&package)];
27+
let mut args = vec!["run".to_string()];
2728
if interactive {
2829
args.push("-i".to_string());
2930
} else {
3031
args.push("-it".to_string());
3132
}
3233

34+
let binary = get_binary(package, &binary);
35+
36+
add_default_flags(package, &mut args);
3337
add_volumes(package, &mut args);
3438
add_current_directory(package, &mut args);
3539
add_environment_variables(package, &mut args);
36-
add_binary_entrypoint(package, &binary, &mut args);
37-
38-
args.push(format!(
39-
"{}:{}",
40-
package.index.image.clone(),
41-
package.versions.current
42-
));
43-
args.extend(params.iter().cloned());
40+
add_binary_entrypoint(binary, &mut args);
41+
add_container_image(package, &mut args);
42+
add_binary_cmd(binary, &mut args);
43+
44+
if should_wrap_args(binary) {
45+
debug!("Wrapping params in quotes");
46+
let escaped_params: Vec<String> = params.iter().map(|param| param.replace("\"", "\\\"")).collect();
47+
args.push(escaped_params.join(" "));
48+
} else {
49+
args.extend(params.iter().cloned());
50+
}
4451

4552
run_command_with_args("docker", &args, Some(buffer))
4653
}
4754

55+
fn should_wrap_args(binary: Option<&Binary>) -> bool {
56+
binary.map_or(false, |bin| bin.wrap_args)
57+
}
58+
4859
fn generate_random_name(package: &Package) -> String {
4960
let id: String = thread_rng().sample_iter(&Alphanumeric).take(10).map(char::from).collect();
5061
format!("hbox-{}-{}-{}", package.name, package.versions.current, id)
5162
}
5263

64+
fn add_default_flags(package: &Package, args: &mut Vec<String>) {
65+
args.push("--rm".to_string());
66+
args.push("--name".to_string());
67+
args.push(generate_random_name(&package))
68+
}
69+
70+
fn add_container_image(package: &Package, args: &mut Vec<String>) {
71+
args.push(format!(
72+
"{}:{}",
73+
package.index.image.clone(),
74+
package.versions.current
75+
));
76+
}
77+
5378
fn add_volumes(package: &Package, args: &mut Vec<String>) {
5479
if let Some(volumes) = &package.index.volumes {
5580
for volume in volumes {
@@ -81,17 +106,32 @@ fn add_environment_variables(package: &Package, args: &mut Vec<String>) {
81106
}
82107
}
83108

84-
fn add_binary_entrypoint(package: &Package, binary: &Option<String>, args: &mut Vec<String>) {
109+
fn add_binary_entrypoint(binary: Option<&Binary>, args: &mut Vec<String>) {
110+
if let Some(binary) = binary {
111+
args.push("--entrypoint".to_string());
112+
args.push(binary.path.to_string());
113+
}
114+
}
115+
116+
fn add_binary_cmd(binary: Option<&Binary>, args: &mut Vec<String>) {
117+
if let Some(binary) = binary {
118+
if let Some(cmd) = &binary.cmd {
119+
args.extend(cmd.iter().cloned());
120+
}
121+
}
122+
}
123+
124+
fn get_binary<'a>(package: &'a Package, binary: &Option<String>) -> Option<&'a Binary> {
85125
if let Some(b) = binary {
86126
if let Some(binaries) = &package.index.binaries {
87127
for binary in binaries {
88128
if binary.name == *b {
89-
args.push("--entrypoint".to_string());
90-
args.push(binary.path.to_string());
129+
return Some(binary)
91130
}
92131
}
93132
}
94133
}
134+
None
95135
}
96136

97137
fn get_stdio(config: &crate::configs::user::Root, stdin_buffer: &Option<Vec<u8>>) -> (Stdio, Stdio, Stdio) {

0 commit comments

Comments
 (0)