From e3a0708500684a388f6f131b44c26e0e0f750c94 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 3 Aug 2022 08:49:24 +0300 Subject: feat: tell user what the version of riki is Sponsored-by: author --- Cargo.toml | 1 + src/bin/riki.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b6a610b..b48ed36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ license = "GPL-3.0-or-later" [dependencies] anyhow = "1.0.52" clap = { version = "3.2.10", features = ["derive"] } +git-testament = "0.2.1" html-escape = "0.2.11" libc = "0.2.126" log = "0.4.17" diff --git a/src/bin/riki.rs b/src/bin/riki.rs index fe9b576..83d1a9c 100644 --- a/src/bin/riki.rs +++ b/src/bin/riki.rs @@ -1,4 +1,5 @@ -use clap::Parser; +use clap::{CommandFactory, FromArgMatches, Parser}; +use git_testament::{git_testament, render_testament, GitModification}; use log::{debug, error, info}; use riki::error::SiteError; use riki::site::Site; @@ -8,6 +9,8 @@ use std::path::PathBuf; const ENVLOG: &str = "RIKI_LOG"; +git_testament!(VERSION); + fn main() { if let Err(err) = real_main() { error!("ERROR: {}", err); @@ -29,16 +32,66 @@ fn real_main() -> Result<(), SiteError> { info!("riki starts"); - let args = Args::parse(); - match args.command { - Command::Build(cmd) => cmd.run()?, - Command::List(cmd) => cmd.run()?, + let version = version().map_err(SiteError::Format)?; + let long_version = long_version().map_err(SiteError::Format)?; + + { + let argparser = Args::command(); + let argparser = argparser.version(version.as_str()); + let argparser = argparser.long_version(long_version.as_str()); + + let args = argparser.get_matches(); + let args = Args::from_arg_matches(&args).unwrap(); + match args.command { + Command::Build(cmd) => cmd.run()?, + Command::List(cmd) => cmd.run()?, + } } info!("riki ends OK"); Ok(()) } +fn version() -> Result { + use std::fmt::Write as _; + let mut ret = String::new(); + writeln!(ret, "{}", render_testament!(VERSION))?; + writeln!( + ret, + "{} {}", + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION") + )?; + Ok(ret) +} + +fn long_version() -> Result { + use std::fmt::Write as _; + let mut ret = String::new(); + writeln!(ret, "{}", render_testament!(VERSION))?; + writeln!(ret, "Crate version: {}", env!("CARGO_PKG_VERSION"))?; + if let Some(branch) = VERSION.branch_name { + writeln!(ret, "Built from branch: {}", branch)?; + } else { + writeln!(ret, "Branch information is missing.")?; + } + writeln!(ret, "Commit info: {}", VERSION.commit)?; + if VERSION.modifications.is_empty() { + writeln!(ret, "Working tree is clean")?; + } else { + use GitModification::*; + for fmod in VERSION.modifications { + match fmod { + Added(f) => writeln!(ret, "Added: {}", String::from_utf8_lossy(f))?, + Removed(f) => writeln!(ret, "Removed: {}", String::from_utf8_lossy(f))?, + Modified(f) => writeln!(ret, "Modified: {}", String::from_utf8_lossy(f))?, + Untracked(f) => writeln!(ret, "Untracked: {}", String::from_utf8_lossy(f))?, + } + } + } + Ok(ret) +} + /// Static site generator. /// /// Riki generates a static web site from markdown files. It mostly -- cgit v1.2.1