version.rs
55 lignes · 2079 octets
use std::fs; use std::path::Path; use std::process::Command; /// Nom du fichier de version dans les projets consommateurs. const VERSION_FILE: &str = ".rustwarden-version"; /// Lit la version actuelle du framework dans un projet consommateur. pub fn read_version(project_dir: &Path) -> Option<String> { let path = project_dir.join(VERSION_FILE); fs::read_to_string(path).ok().map(|s| s.trim().to_string()) } /// Ecrit la version du framework dans un projet consommateur. pub fn write_version(project_dir: &Path, version: &str) -> Result<(), Box<dyn std::error::Error>> { let path = project_dir.join(VERSION_FILE); fs::write(path, format!("{version}\n"))?; Ok(()) } /// Calcule la version actuelle du framework a partir du git hash et de la /// date du dernier commit, ou a defaut du Cargo.toml. pub fn compute_version(rustwarden_root: &Path) -> Result<String, Box<dyn std::error::Error>> { // Essayer git describe ou git log if let Ok(output) = Command::new("git") .args(["log", "-1", "--format=%h %ci"]) .current_dir(rustwarden_root) .output() { if output.status.success() { let info = String::from_utf8_lossy(&output.stdout).trim().to_string(); if !info.is_empty() { // Format: "d5ab015 2026-03-19 14:30:00 +0100" -> "d5ab015 (2026-03-19)" let parts: Vec<&str> = info.splitn(3, ' ').collect(); if parts.len() >= 2 { return Ok(format!("{} ({})", parts[0], parts[1])); } return Ok(info); } } } // Fallback : version du Cargo.toml de rustwarden-core let cargo_toml = rustwarden_root.join("crates/rustwarden-core/Cargo.toml"); let content = fs::read_to_string(cargo_toml)?; for line in content.lines() { if let Some(version) = line.strip_prefix("version = \"") { if let Some(version) = version.strip_suffix('"') { return Ok(format!("v{version}")); } } } Ok("inconnue".to_string()) }
GitRust