From dc95e3adf5b97654610b31700e556196c4e72e92 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 15 Nov 2020 13:20:31 +0800 Subject: [PATCH] feat: add :image:* :mirror:* --- Cargo.toml | 3 ++- README.md | 8 ++++++++ src/main.rs | 45 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d6f4b5c..3aea23c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "dockerbuild" -version = "0.1.0" +version = "0.1.1" authors = ["Hatter Jiang "] edition = "2018" license = "MIT" +repository = "https://git.hatter.ink/hatter/dockerbuild" description = "Build linux binary under macOS using Docker" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/README.md b/README.md index 18e0c3c..66fc4f4 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,12 @@ echo '{ Build: ```shell $ dockerbuild build --release --target-dir linux_target + +$ dockerbuild :image:i386/rust:1.47 build --release --target-dir linux_i386_target + +$ dockerbuild :image:i386/rust:1.47 :mirror:git:*** build --release --target-dir linux_i386_target ``` + +Docker official images: +https://hub.docker.com/_/rust + diff --git a/src/main.rs b/src/main.rs index f892d3c..d4e74c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,26 +12,51 @@ use rust_util::util_file; pub use docker_util::DockerCmd; fn main() { - information!("dockerbuild v0.1"); + information!("dockerbuild v0.1.1"); 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 mut args_iter = env::args().skip(1).peekable(); + let mut get_docker_image = || { + if let Some(first_arg) = args_iter.peek() { + if first_arg.starts_with(":image:") { + let image_name = first_arg[7..].to_string(); + args_iter.next(); // skip ':image:*' + return image_name; + } + } + docker_build_config.image.clone().expect("Image is not configed in config file!") + }; + let docker_image = get_docker_image(); + let mut get_crates_mirror = || { + if let Some(first_arg) = args_iter.peek() { + if first_arg.starts_with(":mirror:") { + let mirror = first_arg[8..].to_string(); + args_iter.next(); // skip ':mirror:*' + return Some(mirror); + } + } + None + }; + let crates_mirror = get_crates_mirror(); - 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"); - if let Some(mirror) = &docker_build_config.mirror { + + let mut docker_cmd = DockerCmd::new(&docker_image); + docker_cmd.add_volumn(&get_final_docker_registry(&docker_image), "/usr/local/cargo/registry"); + if let Some(mirror) = &crates_mirror.or(docker_build_config.mirror) { docker_cmd.mirror(mirror); } docker_cmd.exec(&args).unwrap(); } +fn get_final_docker_registry(docker_image: &str) -> String { + 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 !!"); + check_docker_registry_exists(&docker_registry).expect("Check docker registry exists failed!"); + docker_registry.to_string() +} + fn check_docker_registry_exists(docker_registry: &str) -> Option<()> { let p = Path::new(docker_registry); if !p.exists() {