summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-08-03 08:49:24 +0300
committerLars Wirzenius <liw@liw.fi>2022-08-03 08:49:24 +0300
commite3a0708500684a388f6f131b44c26e0e0f750c94 (patch)
tree4ae6c820739fdb6f44cd8cebd1ba3afbfce322eb
parentaf7f898721bb6c7ffd6c4761006b70bba8831d4f (diff)
downloadriki-e3a0708500684a388f6f131b44c26e0e0f750c94.tar.gz
feat: tell user what the version of riki is
Sponsored-by: author
-rw-r--r--Cargo.toml1
-rw-r--r--src/bin/riki.rs63
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<String, std::fmt::Error> {
+ 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<String, std::fmt::Error> {
+ 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