| use std::path::{Path, PathBuf}; |
| |
| use crate::config::ConfigInfo; |
| use crate::utils::{git_clone, run_command_with_output}; |
| |
| fn show_usage() { |
| println!( |
| r#" |
| `clone-gcc` command help: |
| |
| --out-path : Location where the GCC repository will be cloned (default: `./gcc`)"# |
| ); |
| ConfigInfo::show_usage(); |
| println!(" --help : Show this help"); |
| } |
| |
| #[derive(Default)] |
| struct Args { |
| out_path: PathBuf, |
| config_info: ConfigInfo, |
| } |
| |
| impl Args { |
| fn new() -> Result<Option<Self>, String> { |
| let mut command_args = Self::default(); |
| |
| let mut out_path = None; |
| |
| // We skip binary name and the `clone-gcc` command. |
| let mut args = std::env::args().skip(2); |
| |
| while let Some(arg) = args.next() { |
| match arg.as_str() { |
| "--out-path" => match args.next() { |
| Some(path) if !path.is_empty() => out_path = Some(path), |
| _ => { |
| return Err("Expected an argument after `--out-path`, found nothing".into()); |
| } |
| }, |
| "--help" => { |
| show_usage(); |
| return Ok(None); |
| } |
| arg => { |
| if !command_args.config_info.parse_argument(arg, &mut args)? { |
| return Err(format!("Unknown option {arg}")); |
| } |
| } |
| } |
| } |
| command_args.out_path = match out_path { |
| Some(p) => p.into(), |
| None => PathBuf::from("./gcc"), |
| }; |
| Ok(Some(command_args)) |
| } |
| } |
| |
| pub fn run() -> Result<(), String> { |
| let Some(args) = Args::new()? else { |
| return Ok(()); |
| }; |
| |
| let result = git_clone("https://github.com/rust-lang/gcc", Some(&args.out_path), false)?; |
| if result.ran_clone { |
| let gcc_commit = args.config_info.get_gcc_commit()?; |
| println!("Checking out GCC commit `{gcc_commit}`..."); |
| run_command_with_output( |
| &[&"git", &"checkout", &gcc_commit], |
| Some(Path::new(&result.repo_dir)), |
| )?; |
| } else { |
| println!( |
| "There is already a GCC folder in `{}`, leaving things as is...", |
| args.out_path.display() |
| ); |
| } |
| Ok(()) |
| } |