summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-10-15 10:54:13 +0300
committerLars Wirzenius <liw@liw.fi>2022-10-15 10:54:13 +0300
commitfb0bb3056fe4758fa166bd0e3fe2413540582326 (patch)
treed2b9c9f2bbfc435c3e262033dbe233da7ffef4a5
parent21f885117660a3873c01864cb376fb32a521fc37 (diff)
downloadriki-fb0bb3056fe4758fa166bd0e3fe2413540582326.tar.gz
refactor: move source file modification time stamp into Name
Sponsored-by: author
-rw-r--r--src/name.rs27
-rw-r--r--src/site.rs32
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!(