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())
}