aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs48
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| {