diff --git a/README.md b/README.md index 4f14485..390a774 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # dockerbuild -Docker build tool, build software using docker \ No newline at end of file +Docker build tool, build software using docker + + +Config file: +* `~/.dockerbuild.json` +* `/etc/dockerbuild.json` + +```json +echo '{ + "image": "rust:1.47", + "mirror": "git://mirrors.ustc.edu.cn/crates.io-index" +}' > ~/.dockerbuild.json +``` diff --git a/src/build_util.rs b/src/build_util.rs index 9a54d26..8c9c034 100644 --- a/src/build_util.rs +++ b/src/build_util.rs @@ -4,9 +4,9 @@ use rust_util::XResult; pub enum Builder { Cargo, - Maven, - Gradle, - Buildj, + // Maven, + // Gradle, + // Buildj, Unknown, } @@ -18,9 +18,9 @@ impl Builder { pub fn get_name(&self) -> Option { match self { Builder::Cargo => Some("cargo".into()), - Builder::Maven => Some("mvn".into()), - Builder::Gradle => Some("gradle".into()), - Builder::Buildj => Some("buildj".into()), + // Builder::Maven => Some("mvn".into()), + // Builder::Gradle => Some("gradle".into()), + // Builder::Buildj => Some("buildj".into()), Builder::Unknown => None, } } @@ -39,15 +39,15 @@ fn inner_get_builder(opt_current_dir: &Option) -> XResult { if check_files_exists("Cargo.toml") { return Ok(Builder::Cargo); } - if check_files_exists("pom.xml") { - return Ok(Builder::Maven); - } - if check_files_exists("build.gradle") { - return Ok(Builder::Gradle); - } - if check_files_exists("build.json") { - return Ok(Builder::Buildj); - } + // if check_files_exists("pom.xml") { + // return Ok(Builder::Maven); + // } + // if check_files_exists("build.gradle") { + // return Ok(Builder::Gradle); + // } + // if check_files_exists("build.json") { + // return Ok(Builder::Buildj); + // } Ok(Builder::Unknown) } diff --git a/src/config.rs b/src/config.rs index 7c04ee7..2d83355 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,31 @@ +use std::fs; +use std::path::PathBuf; use serde::{Serialize, Deserialize}; +use rust_util::util_file; #[derive(Serialize, Deserialize)] pub struct DockerBuildConfig { - image: Option, + pub image: Option, + pub mirror: Option, +} + +pub fn load_docker_build_config() -> Option { + let config = find_docker_build_config_file()?; + success!("Find config file: {:?}", config); + let config_content = fs::read_to_string(&config).map_err(|e| { + failure!("Read config file: {:?}, failed: {}", config, e); + e + }).ok()?; + serde_json::from_str(&config_content).map_err(|e| { + failure!("Parse config file: {:?}, failed: {}", config, e); + e + }).ok() +} + +fn find_docker_build_config_file() -> Option { + util_file::read_config(None, &vec![ + // "dockerbuild.json".into(), + "~/.dockerbuild.json".into(), + "/etc/dockerbuild.json".into(), + ]) } \ No newline at end of file diff --git a/src/docker_util.rs b/src/docker_util.rs index 92a3b79..a0c7d85 100644 --- a/src/docker_util.rs +++ b/src/docker_util.rs @@ -24,6 +24,7 @@ pub struct DockerCmd { impl DockerCmd { pub fn new(docker_name: &str) -> Self { + success!("Docker image: {}", docker_name); Self { docker_name: docker_name.into(), ..Default::default() @@ -128,7 +129,7 @@ fn escape_arg(arg: &str) -> String { let mut r = String::with_capacity(arg.len() + 10); r.push('\''); for c in arg.chars() { - if c == '\'' { + if c == '\'' || c == '\\' { r.push('\\'); } r.push(c); diff --git a/src/main.rs b/src/main.rs index 75cc24d..f892d3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,32 +11,38 @@ use std::path::{Path, PathBuf}; use rust_util::util_file; pub use docker_util::DockerCmd; -const MIRROR_USTC: &str = "git://mirrors.ustc.edu.cn/crates.io-index"; - fn main() { information!("dockerbuild v0.1"); - let docker_image = "rust:1.47"; + let docker_build_config = config::load_docker_build_config().expect("Read config failed, not found or parse error!"); + let docker_image = &docker_build_config.image.expect("Image is not configed in config file!"); let docker_registry_path_buf =get_resolved_docker_registry(docker_image).expect("Cannot find $HOME !"); let docker_registry = docker_registry_path_buf.to_str().expect("Cannot find $HOME !!"); - let p = Path::new(&docker_registry); - if !p.exists() { - if let Err(e) = fs::create_dir_all(&docker_registry) { - failure!("Create dir failed: {:?}, error: {}", p, e); - return; - } - } + check_docker_registry_exists(&docker_registry).expect("Check docker registry exists failed!"); let args_iter = env::args().skip(1); let args = args_iter.map(|a| a.to_owned()).collect::>(); let mut docker_cmd = DockerCmd::new(docker_image); - docker_cmd.add_volumn(docker_registry, "/usr/local/cargo/registry") - .mirror(MIRROR_USTC); + docker_cmd.add_volumn(docker_registry, "/usr/local/cargo/registry"); + if let Some(mirror) = &docker_build_config.mirror { + docker_cmd.mirror(mirror); + } docker_cmd.exec(&args).unwrap(); } +fn check_docker_registry_exists(docker_registry: &str) -> Option<()> { + let p = Path::new(docker_registry); + if !p.exists() { + if let Err(e) = fs::create_dir_all(&docker_registry) { + failure!("Create dir failed: {:?}, error: {}", p, e); + return None; + } + } + Some(()) +} + fn get_resolved_docker_registry(image: &str) -> Option { util_file::get_absolute_path(&get_docker_registry(image)) }