From cb5929f7a2d7a3520c81056906269ba0f6a0bade Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 15 Nov 2020 00:27:41 +0800 Subject: [PATCH] refactor: add fn escape_arg --- src/docker_util.rs | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/docker_util.rs b/src/docker_util.rs index 19284b4..362f9c4 100644 --- a/src/docker_util.rs +++ b/src/docker_util.rs @@ -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::>().join(" ")); + sub_cmd.push_str(&sub_build_cmd.iter().map(|arg| escape_arg(arg)).collect::>().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]