diff options
Diffstat (limited to 'src/bin/riki.rs')
-rw-r--r-- | src/bin/riki.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/bin/riki.rs b/src/bin/riki.rs index 70bf71c..271cbb1 100644 --- a/src/bin/riki.rs +++ b/src/bin/riki.rs @@ -2,11 +2,12 @@ use clap::{CommandFactory, FromArgMatches, Parser}; use git_testament::{git_testament, render_testament, GitModification}; use log::{debug, error, info}; use riki::error::SiteError; +use riki::git::{git_dirty, git_whatchanged}; use riki::name::Name; use riki::site::Site; -use riki::util::{canonicalize, copy_file_from_source, mkdir, set_mtime}; +use riki::util::{canonicalize, copy_file_from_source, get_mtime, mkdir, set_mtime}; use std::error::Error; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; const ENVLOG: &str = "RIKI_LOG"; @@ -46,6 +47,7 @@ fn real_main() -> Result<(), SiteError> { match args.command { Command::Build(cmd) => cmd.run()?, Command::List(cmd) => cmd.run()?, + Command::Timestamps(cmd) => cmd.run()?, } } @@ -108,6 +110,7 @@ struct Args { enum Command { Build(Build), List(List), + Timestamps(Timestamps), } /// Build the site. @@ -180,3 +183,41 @@ impl List { Ok(()) } } + +/// Show the timestamp for each source file. +#[derive(Parser)] +struct Timestamps { + /// Directory where source files are. + srcdir: PathBuf, +} + +impl Timestamps { + fn run(&self) -> Result<(), SiteError> { + let srcdir = canonicalize(&self.srcdir)?; + let mut site = Site::new(&srcdir, &srcdir); + site.scan()?; + let mut names: Vec<&Name> = site.pages_and_files().collect(); + names.sort_by_cached_key(|name| name.page_path()); + + let whatchanged = git_whatchanged(&srcdir)?; + eprintln!("whatchanged: {:#?}", whatchanged); + + let dirty = git_dirty(&srcdir)?; + eprintln!("dirty: {:#?}", dirty); + + println!(); + for name in names { + let relative = name.source_path().strip_prefix(&srcdir).unwrap(); + if Self::is_dirty(relative, &dirty) { + println!("dirty: {} {:?}", name, get_mtime(name.source_path())?); + } else if let Some(timestamp) = whatchanged.get(relative) { + println!("git: {} {:?}", name, timestamp); + } + } + Ok(()) + } + + fn is_dirty(filename: &Path, dirty: &[PathBuf]) -> bool { + dirty.iter().any(|x| *x == filename) + } +} |