refactor: add fn escape_arg

This commit is contained in:
2020-11-15 00:27:41 +08:00
parent 1b28ec7f8e
commit cb5929f7a2

View File

@@ -1,3 +1,4 @@
use std::fs;
use std::process::Command;
use rust_util::XResult;
use rust_util::util_cmd;
@@ -5,6 +6,8 @@ use crate::build_util;
use crate::build_util::Builder;
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)" \
// -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),
));
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 {
cmd.arg("-v");
cmd.arg(&format!("{}:{}", outer_vol, docker_vol));
}
cmd.arg("-w");
cmd.arg("/usr/src/app");
cmd.args(vec!["-w", DOCKER_WORK_DIR]);
cmd.arg(&self.docker_name);
let builder = Builder::from(&self.docker_current_dir)?;
@@ -101,29 +103,33 @@ impl DockerCmd {
sub_cmd.push_str(&builder_cmd);
sub_cmd.push(' ');
sub_cmd.push_str(&sub_build_cmd.iter().map(|cmd| {
let mut r = String::new();
r.push('\'');
for c in cmd.chars() {
if c == '\'' {
r.push('\\');
}
r.push(c);
}
r.push('\'');
r
}).collect::<Vec<_>>().join(" "));
sub_cmd.push_str(&sub_build_cmd.iter().map(|arg| escape_arg(arg)).collect::<Vec<_>>().join(" "));
std::fs::write("temp_sub_cmd", &sub_cmd).ok();
fs::write(DCOLER_TEMP_CMD, &sub_cmd).ok();
cmd.args(vec!["bash", "temp_sub_cmd"]);
cmd.args(vec!["bash", DCOLER_TEMP_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())
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();
r.push('\'');
for c in arg.chars() {
if c == '\'' {
r.push('\\');
}
r.push(c);
}
r.push('\'');
r
}
fn make_cmd(mirror: &str) -> String {
let mut s = String::new();
s.push_str(&format!(r#"echo '[source.crates-io]