zoi-rs 1.8.6

Universal Package Manager & Environment Setup Tool
Documentation
use anyhow::{Result, anyhow};
use sha2::{Digest, Sha512};
use std::fs;
use std::path::Path;
use walkdir::WalkDir;

pub fn calculate_dir_hash(path: &Path) -> Result<String> {
    if !path.is_dir() {
        return Err(anyhow!("Path is not a directory"));
    }

    let mut hasher = Sha512::new();
    let mut paths = Vec::new();

    for entry in WalkDir::new(path).into_iter().filter_map(|e| e.ok()) {
        if entry.file_type().is_file() {
            paths.push(entry.path().to_path_buf());
        }
    }

    paths.sort();

    for file_path in paths {
        let mut file = fs::File::open(&file_path)?;
        std::io::copy(&mut file, &mut hasher)?;
    }

    Ok(format!("{:x}", hasher.finalize()))
}