diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs index 1872e31..6337b14 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ -#![feature(iterator_try_collect)] +#![feature(iterator_try_collect, absolute_path)] use anyhow::Result; use clap::Parser; use priority_queue::PriorityQueue; use sha2::{Sha512_256, Digest}; -use std::{cmp::Ordering, collections::HashMap, fs, io, io::Write, path::PathBuf}; +use std::{cmp::Ordering, collections::HashMap, fs, io, io::Write, path, path::PathBuf}; use embedders::*; use pure_embedders::*; @@ -28,11 +28,11 @@ struct Args { embedder: Embedder, /// Symlink the sorted images into this directory - #[arg(short = 'o', long)] + #[arg(short = 's', long)] symlink_dir: Option<PathBuf>, - /// Copy the sorted images into this directory. TODO uses COW when available - #[arg(short = 's', long)] + /// Copy the sorted images into this directory. Uses COW when available + #[arg(short = 'o', long)] copy_dir: Option<PathBuf>, /// Write sorted paths into stdout, one per line @@ -186,8 +186,36 @@ fn process_embedder<E>(mut e: E, args: &Args, cfg: &Config) -> Result<Vec<PathBu Ok(tsp_path.iter().map(|i| args.images[*i].clone()).collect()) } -fn symlink_into(tsp: &[PathBuf], target: &PathBuf) -> Result<()> {todo!()} -fn copy_into(tsp: &[PathBuf], target: &PathBuf) -> Result<()> {todo!()} +fn symlink_into(tsp: &[PathBuf], target: &PathBuf) -> Result<()> { + fs::create_dir_all(target)?; + + let pad_len = (tsp.len() as f64).log10().ceil() as usize; + for (i, p) in tsp.iter().enumerate() { + let ext: String = match p.extension() { + None => "".to_string(), + Some(e) => format!(".{}", e.to_str().unwrap()), + }; + let tp = target.join(format!("{:0pl$}{ext}", i, pl = pad_len, ext = ext)); + let rel_path = pathdiff::diff_paths(path::absolute(p)?, + path::absolute(target)?).unwrap(); + std::os::unix::fs::symlink(rel_path, tp); + } + Ok(()) +} +fn copy_into(tsp: &[PathBuf], target: &PathBuf) -> Result<()> { + fs::create_dir_all(target)?; + + let pad_len = (tsp.len() as f64).log10().ceil() as usize; + for (i, p) in tsp.iter().enumerate() { + let ext: String = match p.extension() { + None => "".to_string(), + Some(e) => format!(".{}", e.to_str().unwrap()), + }; + let tp = target.join(format!("{:0pl$}{ext}", i, pl = pad_len, ext = ext)); + reflink_copy::reflink_or_copy(p, tp)?; + } + Ok(()) +} fn main() -> Result<()> { let cfg = get_config()?; @@ -200,11 +228,11 @@ fn main() -> Result<()> { Embedder::Content => process_embedder(ContentEmbedder::new(&cfg), &args, &cfg), }?; - args.symlink_dir.into_iter().try_for_each(|p| symlink_into(&tsp_path, &p))?; - args.copy_dir .into_iter().try_for_each(|p| copy_into(&tsp_path, &p))?; + if let Some(p) = args.symlink_dir { symlink_into(&tsp_path, &p)? } + if let Some(p) = args.copy_dir { copy_into(&tsp_path, &p)? } let path_delim = if args.stdout0 { Some(0) } - else if args.stdout { Some(10) } + else if args.stdout { Some(b'\n') } else { None }; path_delim.into_iter().try_for_each(|delim| { |