diff --git a/src/main.rs b/src/main.rs index 7c47a31e3e5b85933951c5c3972ef893aadbf69f_c3JjL21haW4ucnM=..88251c94998351efaf63d3781b7cc4745e8e386c_c3JjL21haW4ucnM= 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,8 +4,7 @@ use sha2::{Digest, Sha256}; use std::io::Seek; use std::io::Write; -use std::path::Path; use std::path::PathBuf; use structopt::StructOpt; #[derive(StructOpt)] @@ -8,9 +7,20 @@ use std::path::PathBuf; use structopt::StructOpt; #[derive(StructOpt)] -enum Args { - NewDataset { directory: PathBuf }, +enum Command { + NewDataset(NewDataset), +} + +#[derive(StructOpt)] +struct NewDataset { + /// Skip confirmation prompts + #[structopt(long)] + no_confirm: bool, + + /// The directory to archive. + /// The dataset name is taken from the last component of this path. + directory: PathBuf, } struct Megafine { @@ -19,7 +29,7 @@ type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>; -impl Megafine { - fn new_dataset(&self, directory: &Path) -> Result<()> { +impl NewDataset { + fn run(&self, megafine: &Megafine) -> Result<()> { println!( "Creating a dataset from directory {}", @@ -24,4 +34,4 @@ println!( "Creating a dataset from directory {}", - style(directory.display()).bold() + style(self.directory.display()).bold() ); @@ -27,5 +37,5 @@ ); - if !std::fs::metadata(&directory)?.is_dir() { + if !std::fs::metadata(&self.directory)?.is_dir() { Err("Not a directory")? } @@ -29,7 +39,8 @@ Err("Not a directory")? } - let base_name = directory + let base_name = self + .directory .file_name() .ok_or("No base name")? .to_str() @@ -39,7 +50,7 @@ .arg("id") .arg("--id") .arg("-R") - .arg(&directory) + .arg(&self.directory) .output()?; let id = if hg_id_output.status.success() { format!("_{}", std::str::from_utf8(&hg_id_output.stdout)?.trim()) @@ -52,9 +63,9 @@ let archive_name = format!("{}_{}{}.tar.zst", base_name, today, id); let bold = style(&archive_name).bold(); - let archive_path = self.tmp_dir.join(&archive_name); + let archive_path = megafine.tmp_dir.join(&archive_name); if archive_path.exists() { Err(format!("tmp/{} already exists", bold))? } println!("About to create tmp/{}", bold); @@ -56,13 +67,15 @@ if archive_path.exists() { Err(format!("tmp/{} already exists", bold))? } println!("About to create tmp/{}", bold); - let proceed = Confirm::new() - .with_prompt("Continue?") - .default(false) - .interact()?; - if !proceed { - Err("")? + if !self.no_confirm { + let proceed = Confirm::new() + .with_prompt("Continue?") + .default(false) + .interact()?; + if !proceed { + Err("")? + } } @@ -67,6 +80,6 @@ } - let tmp_file = tempfile::NamedTempFile::new_in(&self.tmp_dir)?; + let tmp_file = tempfile::NamedTempFile::new_in(&megafine.tmp_dir)?; let sha = Sha256::new(); let tee = Tee(tmp_file, sha); let level = zstd::DEFAULT_COMPRESSION_LEVEL; @@ -74,7 +87,7 @@ zstd.multithread(num_cpus::get() as _)?; let mut tar = tar::Builder::new(zstd); tar.follow_symlinks(false); - tar.append_dir_all(base_name, directory)?; + tar.append_dir_all(base_name, &self.directory)?; // Peel the onion let zstd = tar.into_inner()?; let Tee(mut tmp_file, sha) = zstd.finish()?; @@ -88,4 +101,5 @@ Ok(()) } +} @@ -91,4 +105,5 @@ +impl Megafine { fn new() -> Result<Self> { let exe = std::fs::canonicalize(std::env::current_exe()?)?; @@ -117,8 +132,8 @@ fn main() -> Result<()> { let megafine = Megafine::new()?; - match Args::from_args() { - Args::NewDataset { directory } => megafine.new_dataset(&directory), + match Command::from_args() { + Command::NewDataset(c) => c.run(&megafine), } } }