From e74fe354d0141f8a32113c59309395510170d5aa Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Tue, 7 Apr 2026 11:09:14 -0500 Subject: [PATCH] feat: report version information --- Cargo.lock | 185 +++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + build.rs | 11 +++ e2e/pages/home.spec.ts | 1 - src/main.rs | 55 +++++++----- 5 files changed, 223 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c03174..8443327 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -400,6 +400,39 @@ dependencies = [ "litrs", ] +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "cargo_metadata" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] + [[package]] name = "cc" version = "1.2.29" @@ -582,6 +615,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.106", +] + [[package]] name = "debug-helper" version = "0.3.13" @@ -609,6 +677,37 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.106", +] + [[package]] name = "deunicode" version = "1.6.2" @@ -1189,6 +1288,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.4.0" @@ -1490,6 +1595,7 @@ dependencies = [ "tracing", "tracing-subscriber", "vcard", + "vergen-gitcl", ] [[package]] @@ -1649,9 +1755,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-integer" @@ -1683,6 +1789,15 @@ dependencies = [ "libm", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "object" version = "0.37.3" @@ -2213,6 +2328,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde" version = "1.0.228" @@ -2748,30 +2873,32 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -3194,6 +3321,46 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vergen" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" +dependencies = [ + "anyhow", + "cargo_metadata", + "derive_builder", + "regex", + "rustversion", + "time", + "vergen-lib", +] + +[[package]] +name = "vergen-gitcl" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ff3b5300a085d6bcd8fc96a507f706a28ae3814693236c9b409db71a1d15b9" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", + "time", + "vergen", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 5b03dc4..f2fdc22 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,3 +44,4 @@ vcard = "0.4.13" [build-dependencies] cache_bust = "0.2.0" +vergen-gitcl = { version = "9.1.0", features = ["build", "cargo"] } diff --git a/build.rs b/build.rs index 7195630..2c984c9 100644 --- a/build.rs +++ b/build.rs @@ -1,4 +1,5 @@ use cache_bust::CacheBust; +use vergen_gitcl::{BuildBuilder, Emitter, GitclBuilder}; fn main() { println!("cargo:rerun-if-changed=migrations"); @@ -9,4 +10,14 @@ fn main() { .build(); cache_bust.hash_dir().expect("Cache busting failed"); + + let build = BuildBuilder::all_build().expect("build information failed"); + let gitcl = GitclBuilder::all_git().expect("gitcl information failed"); + Emitter::default() + .add_instructions(&build) + .unwrap() + .add_instructions(&gitcl) + .unwrap() + .emit() + .unwrap(); } diff --git a/e2e/pages/home.spec.ts b/e2e/pages/home.spec.ts index db98bb1..cf9f50b 100644 --- a/e2e/pages/home.spec.ts +++ b/e2e/pages/home.spec.ts @@ -118,5 +118,4 @@ test('contact list is sorted ignoring case', async ({ page }) => { await verifyCreateUser(page, { names: ['Charlie'] }); await expect(page.locator('#contacts-sidebar')).toContainText(/alfa\s*bob\s*charlie/i); - }); diff --git a/src/main.rs b/src/main.rs index 9c86f81..6ebad84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,7 @@ use std::sync::{Arc, RwLock}; use tokio::net::TcpListener; use tokio::signal; use tokio::task::AbortHandle; -use tower_http::services::{ServeDir,ServeFile}; +use tower_http::services::{ServeDir, ServeFile}; use tower_sessions::{ExpiredDeletion, Expiry, SessionManagerLayer, cookie::Key}; use tower_sessions_sqlx_store::SqliteStore; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; @@ -124,6 +124,8 @@ enum Commands { ephemeral: bool, }, + /// print version information + Version, } async fn serve(port: &u32) -> Result<(), anyhow::Error> { @@ -181,7 +183,10 @@ async fn serve(port: &u32) -> Result<(), anyhow::Error> { .merge(auth::router()) .merge(ics::router()) .nest_service("/static", ServeDir::new("./hashed_static")) - .nest_service("/favicon.ico", ServeFile::new(format!("./hashed_static/{}", asset!("favicon.ico")))) + .nest_service( + "/favicon.ico", + ServeFile::new(format!("./hashed_static/{}", asset!("favicon.ico"))), + ) .layer(auth_layer) .layer(tower_http::trace::TraceLayer::new_for_http()) .with_state(state); @@ -231,7 +236,10 @@ async fn main() -> Result<(), anyhow::Error> { println!("No update was made; probably something went wrong."); } } - Some(Commands::SetEphemeral { username, ephemeral }) => { + Some(Commands::SetEphemeral { + username, + ephemeral, + }) => { let users_db = { let db_options = SqliteConnectOptions::from_str("users.db")? .create_if_missing(true) @@ -242,23 +250,24 @@ async fn main() -> Result<(), anyhow::Error> { db }; - let eph: Option = sqlx::query_scalar( - "select ephemeral from users where username = ?" - ) - .bind(&username) - .fetch_optional(&users_db) - .await?; - if let Some(eph) = eph { - if eph == *ephemeral { - println!("User {} is already {}.", username, if eph { "ephemeral" } else { "not ephemeral" }); - } else { - let update = sqlx::query( - "update users set ephemeral=$1 where username = $2", - ) - .bind(ephemeral) + let eph: Option = + sqlx::query_scalar("select ephemeral from users where username = ?") .bind(&username) - .execute(&users_db) + .fetch_optional(&users_db) .await?; + if let Some(eph) = eph { + if eph == *ephemeral { + println!( + "User {} is already {}.", + username, + if eph { "ephemeral" } else { "not ephemeral" } + ); + } else { + let update = sqlx::query("update users set ephemeral=$1 where username = $2") + .bind(ephemeral) + .bind(&username) + .execute(&users_db) + .await?; if update.rows_affected() > 0 { println!("Updated ephemerality for {}.", username); @@ -267,13 +276,19 @@ async fn main() -> Result<(), anyhow::Error> { } } } else { - println!("User {} does not exist. Create them first with set-password.", username); + println!( + "User {} does not exist. Create them first with set-password.", + username + ); } - } Some(Commands::Serve { port }) => { serve(port).await?; } + Some(Commands::Version) => { + println!("mascarpone v{}", env!("CARGO_PKG_VERSION")); + println!("from git commit {}", env!("VERGEN_GIT_SHA")); + } None => { serve(&3000).await?; }