refactor: add fn escape_arg
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
use std::fs;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use rust_util::XResult;
|
use rust_util::XResult;
|
||||||
use rust_util::util_cmd;
|
use rust_util::util_cmd;
|
||||||
@@ -5,6 +6,8 @@ use crate::build_util;
|
|||||||
use crate::build_util::Builder;
|
use crate::build_util::Builder;
|
||||||
|
|
||||||
const DOCKER_CMD: &str = "docker";
|
const DOCKER_CMD: &str = "docker";
|
||||||
|
const DCOLER_TEMP_CMD: &str = "temp_sub_cmd";
|
||||||
|
const DOCKER_WORK_DIR: &str = "/usr/src/app";
|
||||||
|
|
||||||
// $ docker run --rm --user "$(id -u)":"$(id -g)" \
|
// $ docker run --rm --user "$(id -u)":"$(id -g)" \
|
||||||
// -v "$PWD":/usr/src/app -w /usr/src/app rust:1.47 \
|
// -v "$PWD":/usr/src/app -w /usr/src/app rust:1.47 \
|
||||||
@@ -62,13 +65,12 @@ impl DockerCmd {
|
|||||||
self.docker_run_gid.unwrap_or_else(|| users::get_current_gid() as u32),
|
self.docker_run_gid.unwrap_or_else(|| users::get_current_gid() as u32),
|
||||||
));
|
));
|
||||||
cmd.arg("-v");
|
cmd.arg("-v");
|
||||||
cmd.arg(&format!("{}:/usr/src/app", build_util::get_work_dir(&self.docker_current_dir)?));
|
cmd.arg(&format!("{}:{}", build_util::get_work_dir(&self.docker_current_dir)?, DOCKER_WORK_DIR));
|
||||||
for (outer_vol, docker_vol) in self.volumns {
|
for (outer_vol, docker_vol) in self.volumns {
|
||||||
cmd.arg("-v");
|
cmd.arg("-v");
|
||||||
cmd.arg(&format!("{}:{}", outer_vol, docker_vol));
|
cmd.arg(&format!("{}:{}", outer_vol, docker_vol));
|
||||||
}
|
}
|
||||||
cmd.arg("-w");
|
cmd.args(vec!["-w", DOCKER_WORK_DIR]);
|
||||||
cmd.arg("/usr/src/app");
|
|
||||||
cmd.arg(&self.docker_name);
|
cmd.arg(&self.docker_name);
|
||||||
|
|
||||||
let builder = Builder::from(&self.docker_current_dir)?;
|
let builder = Builder::from(&self.docker_current_dir)?;
|
||||||
@@ -101,10 +103,24 @@ impl DockerCmd {
|
|||||||
|
|
||||||
sub_cmd.push_str(&builder_cmd);
|
sub_cmd.push_str(&builder_cmd);
|
||||||
sub_cmd.push(' ');
|
sub_cmd.push(' ');
|
||||||
sub_cmd.push_str(&sub_build_cmd.iter().map(|cmd| {
|
sub_cmd.push_str(&sub_build_cmd.iter().map(|arg| escape_arg(arg)).collect::<Vec<_>>().join(" "));
|
||||||
|
|
||||||
|
fs::write(DCOLER_TEMP_CMD, &sub_cmd).ok();
|
||||||
|
|
||||||
|
cmd.args(vec!["bash", DCOLER_TEMP_CMD]);
|
||||||
|
|
||||||
|
success!("Docker cmd exec: {:?}", cmd);
|
||||||
|
success!("Docker temp sub cmd: {}", sub_cmd);
|
||||||
|
let r = util_cmd::run_command_and_wait(&mut cmd).map_err(|e| e.into());
|
||||||
|
fs::remove_file(DCOLER_TEMP_CMD).ok();
|
||||||
|
r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn escape_arg(arg: &str) -> String {
|
||||||
let mut r = String::new();
|
let mut r = String::new();
|
||||||
r.push('\'');
|
r.push('\'');
|
||||||
for c in cmd.chars() {
|
for c in arg.chars() {
|
||||||
if c == '\'' {
|
if c == '\'' {
|
||||||
r.push('\\');
|
r.push('\\');
|
||||||
}
|
}
|
||||||
@@ -112,16 +128,6 @@ impl DockerCmd {
|
|||||||
}
|
}
|
||||||
r.push('\'');
|
r.push('\'');
|
||||||
r
|
r
|
||||||
}).collect::<Vec<_>>().join(" "));
|
|
||||||
|
|
||||||
std::fs::write("temp_sub_cmd", &sub_cmd).ok();
|
|
||||||
|
|
||||||
cmd.args(vec!["bash", "temp_sub_cmd"]);
|
|
||||||
|
|
||||||
information!("Docker cmd exec: {:?}", cmd);
|
|
||||||
information!("Docker temp sub cmd: {}", sub_cmd);
|
|
||||||
util_cmd::run_command_and_wait(&mut cmd).map_err(|e| e.into())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_cmd(mirror: &str) -> String {
|
fn make_cmd(mirror: &str) -> String {
|
||||||
|
|||||||
Reference in New Issue
Block a user