summaryrefslogtreecommitdiff
path: root/src/bin/riki.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/riki.rs')
-rw-r--r--src/bin/riki.rs45
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)
+ }
+}