diff options
author | Lars Wirzenius <liw@liw.fi> | 2022-10-15 10:54:13 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2022-10-15 10:54:13 +0300 |
commit | fb0bb3056fe4758fa166bd0e3fe2413540582326 (patch) | |
tree | d2b9c9f2bbfc435c3e262033dbe233da7ffef4a5 | |
parent | 21f885117660a3873c01864cb376fb32a521fc37 (diff) | |
download | riki-fb0bb3056fe4758fa166bd0e3fe2413540582326.tar.gz |
refactor: move source file modification time stamp into Name
Sponsored-by: author
-rw-r--r-- | src/name.rs | 27 | ||||
-rw-r--r-- | src/site.rs | 32 |
2 files changed, 26 insertions, 33 deletions
diff --git a/src/name.rs b/src/name.rs index 3cb0157..f4d1a2f 100644 --- a/src/name.rs +++ b/src/name.rs @@ -4,6 +4,7 @@ use std::cmp::Ordering; use std::ffi::OsStr; use std::fmt; use std::path::{Path, PathBuf}; +use std::time::SystemTime; #[derive(Debug, Clone, Eq, PartialEq)] pub struct Name { @@ -12,10 +13,11 @@ pub struct Name { dest: PathBuf, page: PathBuf, page_name: String, + mtime: SystemTime, } impl Name { - fn new(is_wikitext: bool, src: PathBuf, dest: PathBuf, page: PathBuf) -> Self { + fn new(is_wikitext: bool, src: PathBuf, dest: PathBuf, page: PathBuf, mtime: SystemTime) -> Self { trace!( "Name::new: is_wikitext={} src={} dest={} page={}", is_wikitext, @@ -34,6 +36,7 @@ impl Name { dest, page, page_name, + mtime, } } @@ -103,7 +106,7 @@ impl NameBuilder { &self.destdir } - pub fn page(&self, path: &Path) -> Name { + pub fn page(&self, path: &Path, mtime: SystemTime) -> Name { assert!(path.starts_with(&self.srcdir)); let src = path.into(); let relative = make_path_relative_to(&self.srcdir, path); @@ -128,16 +131,16 @@ impl NameBuilder { (dest, page) }; - Name::new(true, src, dest, page) + Name::new(true, src, dest, page, mtime) } - pub fn file(&self, path: &Path) -> Name { + pub fn file(&self, path: &Path, mtime: SystemTime) -> Name { assert!(path.starts_with(&self.srcdir)); let src = path.into(); let relative = make_path_relative_to(&self.srcdir, path); let page = make_path_absolute(&relative); let dest = join_subpath(&self.destdir, &relative); - Name::new(false, src, dest, page) + Name::new(false, src, dest, page, mtime) } } @@ -179,7 +182,7 @@ impl Names { #[cfg(test)] mod test { use super::{Name, NameBuilder, Names}; - use std::path::Path; + use std::{path::Path, time::UNIX_EPOCH}; fn builder() -> NameBuilder { NameBuilder::new(Path::new("/src"), Path::new("/dest")) @@ -187,7 +190,7 @@ mod test { #[test] fn builds_page_name() { - let name = builder().page(Path::new("/src/foo/bar.mdwn")); + let name = builder().page(Path::new("/src/foo/bar.mdwn"), UNIX_EPOCH); assert_eq!(name.source_path(), Path::new("/src/foo/bar.mdwn")); assert_eq!( name.destination_path(), @@ -199,7 +202,7 @@ mod test { #[test] fn builds_page_name_for_index_mdwn() { - let name = builder().page(Path::new("/src/foo/index.mdwn")); + let name = builder().page(Path::new("/src/foo/index.mdwn"), UNIX_EPOCH); assert_eq!(name.source_path(), Path::new("/src/foo/index.mdwn")); assert_eq!(name.destination_path(), Path::new("/dest/foo/index.html")); assert_eq!(name.page_path(), Path::new("/foo")); @@ -208,7 +211,7 @@ mod test { #[test] fn builds_file_name() { - let name = builder().file(Path::new("/src/foo/bar.jpg")); + let name = builder().file(Path::new("/src/foo/bar.jpg"), UNIX_EPOCH); assert_eq!(name.source_path(), Path::new("/src/foo/bar.jpg")); assert_eq!(name.destination_path(), Path::new("/dest/foo/bar.jpg")); assert_eq!(name.page_path(), Path::new("/foo/bar.jpg")); @@ -224,7 +227,7 @@ mod test { #[test] fn names_remembers_inserted() { let mut names = Names::default(); - let name = builder().page(Path::new("/src/foo/bar.mdwn")); + let name = builder().page(Path::new("/src/foo/bar.mdwn"), UNIX_EPOCH); names.insert(name.clone()); assert_eq!( names.get_source_path(Path::new("/src/foo/bar.mdwn")), @@ -236,8 +239,8 @@ mod test { #[test] fn names_remembers_inserted_pages_and_files() { let mut names = Names::default(); - let page = builder().page(Path::new("/src/foo/bar.mdwn")); - let file = builder().file(Path::new("/src/foo/bar.jpg")); + let page = builder().page(Path::new("/src/foo/bar.mdwn"), UNIX_EPOCH); + let file = builder().file(Path::new("/src/foo/bar.jpg"), UNIX_EPOCH); names.insert(page.clone()); names.insert(file.clone()); let pages: Vec<&Name> = names.pages().collect(); diff --git a/src/site.rs b/src/site.rs index c7bb736..ead31d2 100644 --- a/src/site.rs +++ b/src/site.rs @@ -9,11 +9,10 @@ use crate::util::make_relative_link; use log::{debug, info, trace}; use std::collections::{BinaryHeap, HashMap}; use std::path::{Path, PathBuf}; -use std::time::SystemTime; +use std::time::UNIX_EPOCH; pub struct Site { patterns: TokenPatterns, - whatchanged: HashMap<PathBuf, SystemTime>, shortcuts: HashMap<String, Shortcut>, builder: NameBuilder, unprocessed_pages: Vec<UnprocessedPage>, @@ -39,13 +38,11 @@ impl Site { patterns: TokenPatterns::default(), names_to_process: BinaryHeap::new(), pages_that_will_exist: PageSet::default(), - whatchanged: HashMap::new(), shortcuts: HashMap::new(), } } pub fn scan(&mut self) -> Result<(), SiteError> { - self.whatchanged = git_whatchanged(self.builder.srcdir())?; for name in self.all_files()? { trace!("scan: name={}", name); if name.is_wikitext_page() { @@ -95,10 +92,7 @@ impl Site { fn process_name(&mut self) -> Result<bool, SiteError> { if let Some(name) = self.names_to_process.pop() { debug!("loading wikitext page {}", name.source_path().display()); - let mut page = WikitextPage::read(&name)?; - if let Some(mtime) = self.git_commit_timestamp(&name) { - page.meta_mut().set_mtime(mtime); - } + let page = WikitextPage::read(&name)?; self.files.insert(name); self.add_wikitextpage(page)?; Ok(true) @@ -108,14 +102,6 @@ impl Site { } } - fn git_commit_timestamp(&self, name: &Name) -> Option<SystemTime> { - let relative = name - .source_path() - .strip_prefix(&self.builder.srcdir()) - .unwrap(); - self.whatchanged.get(relative).copied() - } - fn process_page(&mut self) -> Result<bool, SiteError> { if let Some(page) = self.unprocessed_pages.pop() { debug!( @@ -144,6 +130,8 @@ impl Site { } fn all_files(&self) -> Result<Vec<Name>, SiteError> { + let whatchanged = git_whatchanged(self.builder.srcdir())?; + let mut srcdir = SourceDir::new(self.builder.srcdir()); srcdir.scan()?; @@ -156,12 +144,14 @@ impl Site { trace!("all_files: path={}", path.display()); if filter.is_included(path) { debug!("include {}", path.display()); + let relative = path.strip_prefix(&self.builder.srcdir()).unwrap(); + let mtime = whatchanged.get(relative).copied().unwrap_or(UNIX_EPOCH); if Self::is_markdown(path) { trace!("it's markdown"); - names.push(self.builder.page(path)); + names.push(self.builder.page(path, mtime)); } else if path.is_file() { trace!("it's not markdown"); - names.push(self.builder.file(path)); + names.push(self.builder.file(path, mtime)); } else { trace!("it's not a file"); } @@ -338,7 +328,7 @@ mod test { use crate::page::MetaBuilder; use std::{ path::{Path, PathBuf}, - time::SystemTime, + time::{SystemTime, UNIX_EPOCH}, }; fn site() -> Site { @@ -350,7 +340,7 @@ mod test { } fn page(path: &str) -> WikitextPage { - let name = builder().page(Path::new(path)); + let name = builder().page(Path::new(path), UNIX_EPOCH); let mtime = SystemTime::now(); let meta = MetaBuilder::default().name(name).mtime(mtime).build(); WikitextPage::new(meta, "".into()) @@ -443,7 +433,7 @@ mod test { #[test] fn link_to_sibling_file_resolves_to_it() { let mut site = site(); - let name = builder().file(Path::new("/src/foo/bar.jpg")); + let name = builder().file(Path::new("/src/foo/bar.jpg"), UNIX_EPOCH); site.add_other_file(name); site.process().unwrap(); assert_eq!( |