From c08667272967fda43d0b7efc93901258dbe97964 Mon Sep 17 00:00:00 2001 From: afterlifepro Date: Wed, 15 Oct 2025 13:46:27 +0100 Subject: [PATCH] upload: strip source dir prefix from key and minor refactor hashmap key no longer includes the source directory from the cli arguments source dir `./dist`: ./dist/index.html => index.html ./dist/assets/cat.jpg => cat.jpg etc refactor things and log the tree state in main bc its debugging info --- upload/src/main.rs | 27 ++++++++++++- upload/src/sitemap.rs | 92 +++++++++++++++++++++---------------------- 2 files changed, 71 insertions(+), 48 deletions(-) diff --git a/upload/src/main.rs b/upload/src/main.rs index fd10a94..6069054 100644 --- a/upload/src/main.rs +++ b/upload/src/main.rs @@ -1,6 +1,8 @@ use clap::{ArgAction, Parser}; use std::path::PathBuf; +use crate::utils::url_to_rkey; + mod sitemap; mod utils; @@ -50,7 +52,30 @@ gitignore: {}", ); // get local site info - let sitemap = sitemap::local_sitemap(config.dir, config.all_files, config.git_ignore); + let sitemap = + sitemap::local_sitemap(config.dir, config.all_files, config.git_ignore).or_else(|err| { + println!("Error: {}", err); + Err(()) + })?; + + println!( + "{}", + sitemap + .iter() + .map(|(k, v)| { + let rkey = url_to_rkey(k.to_string()); + if let Some(rkey) = rkey { + return format!( + "\t\t\t\t\t\t\t\t\t\t\t\t{:?}\r\t\t\t\t\t\t\t\t{}\r - {}", + v.blob, v.mime_type, rkey + ); + } else { + return String::new(); + } + }) + .collect::>() + .join("\n") + ); // create session diff --git a/upload/src/sitemap.rs b/upload/src/sitemap.rs index 73e2447..e313732 100644 --- a/upload/src/sitemap.rs +++ b/upload/src/sitemap.rs @@ -1,4 +1,5 @@ use ignore::WalkBuilder; +use mime_guess::mime; use std::{collections::HashMap, error::Error, fmt, path::PathBuf}; pub type Sitemap = HashMap; @@ -19,6 +20,8 @@ pub enum BlobRef { pub enum SitemapErr { IoErr(std::io::Error), IgnoreErr(ignore::Error), + StripPrefixErr(std::path::StripPrefixError), + NotUTF8Path, } impl From for SitemapErr { @@ -33,6 +36,12 @@ impl From for SitemapErr { } } +impl From for SitemapErr { + fn from(value: std::path::StripPrefixError) -> Self { + SitemapErr::StripPrefixErr(value) + } +} + impl Error for SitemapErr {} impl fmt::Display for SitemapErr { @@ -40,6 +49,8 @@ impl fmt::Display for SitemapErr { match self { SitemapErr::IoErr(err) => write!(f, "IO Error: {}", err), SitemapErr::IgnoreErr(err) => write!(f, "Ignore Error: {}", err), + SitemapErr::StripPrefixErr(err) => write!(f, "File Path Error: {}", err), + SitemapErr::NotUTF8Path => write!(f, "Found a path that was not UTF-8"), } } } @@ -49,58 +60,45 @@ pub fn local_sitemap<'a>( include_dotfiles: bool, use_gitignore: bool, ) -> Result { - let res = WalkBuilder::new(dir) + let prefix = dir.canonicalize()?; + + let mut res = HashMap::new(); + for file in WalkBuilder::new(dir) .hidden(!include_dotfiles) .git_ignore(use_gitignore) .git_exclude(use_gitignore) .git_global(use_gitignore) .follow_links(true) .build() - .filter_map(|x| { - let x = x - .or_else(|err| { - println!("Warning: {} ", err); - Err(()) - }) - .ok()?; - - let metadata = x - .metadata() - .or_else(|err| { - println!("Warning on file {}:\n{} ", x.path().display(), err); - Err(()) - }) - .ok()?; - - if !metadata.is_file() { - return None; - }; - - let key = x.path().to_str()?; - let key = String::from(key); - - let mime = mime_guess::from_path(&key); - let mime = mime.first()?; - let mime = mime.essence_str(); - - Some(( - key, - SitemapNode { - mime_type: String::from(mime), - blob: BlobRef::Local(x.path().to_owned()), - }, - )) - }) - .collect::>(); - - println!( - " - {}", - res - .iter() - .map(|(k, v)| format!("{}: {:?}", k, v)) - .collect::>() - .join("\n - ") - ); - + { + let file = file?; + + let metadata = file.metadata()?; + + if !metadata.is_file() { + continue; + }; + + // find the path of the files relative to the source directory + // source dir `./dist`: + // ./dist/index.html => index.html + // ./dist/assets/cat.jpg => cat.jpg + // etc + let key = file.path().canonicalize()?; + let key = key.strip_prefix(&prefix)?; + let key = String::from(key.to_str().ok_or_else(|| SitemapErr::NotUTF8Path)?); + + let mime = mime_guess::from_path(&key); + let mime = mime.first().unwrap_or(mime::APPLICATION_OCTET_STREAM); + let mime = mime.essence_str(); + + res.insert( + key, + SitemapNode { + mime_type: String::from(mime), + blob: BlobRef::Local(file.path().to_owned()), + }, + ); + } Ok(res) } -- 2.51.2