nmuidi 0.1.5

Parallelizes deleting directories which can significantly speed up deleting large deeply nested directories with a large number of files on Windows
use log::{debug, trace};
#[doc(inline)]
use nmuidi::prelude::*;
use std::{env, time::Instant};

fn main() {
    pretty_env_logger::init();

    let mut directory_timings = Vec::new();
    let start_time = Instant::now();
    for dir in env::args().skip(1) {
        println!("Cleaning {dir}");
        let start = Instant::now();

        Cleaner::new(&dir).clean();
        directory_timings.push((dir, start.elapsed()));
    }

    let elapsed_time = start_time.elapsed();
    debug!("Total time: {:.2?}", elapsed_time);
    debug!("Directory timings:");
    for (dir, time_spent) in directory_timings {
        debug!("  dir {dir} took {:.2?}", time_spent);
    }
    trace!("Done.");
}

#[cfg(test)]
mod tests {
    use super::*;
    use jwalk::WalkDir;
    use std::fs;

    #[test]
    fn test_nested() {
        fs::create_dir_all("tmp/nested/dir1").unwrap();
        fs::write("tmp/nested/dir1/file1.txt", "File 1 content").unwrap();

        fs::create_dir_all("tmp/nested/dir1/dir2").unwrap();
        fs::write("tmp/nested/dir1/dir2/file2.txt", "File 2 content").unwrap();

        fs::create_dir_all("tmp/nested/dir1/dir2/dir3").unwrap();
        fs::write("tmp/nested/dir1/dir2/dir3/file3.txt", "File 3 content").unwrap();

        Cleaner::new("tmp/nested").clean();

        let num_files = WalkDir::new("tmp/nested")
            .skip_hidden(false)
            .into_iter()
            .collect::<Vec<_>>()
            .len();
        assert_eq!(num_files, 1);
    }

    #[test]
    fn test_dirs() {
        fs::create_dir_all("tmp/dirs/dir1").unwrap();
        fs::create_dir_all("tmp/dirs/dir1a").unwrap();
        fs::create_dir_all("tmp/dirs/dir1/dir2").unwrap();
        fs::create_dir_all("tmp/dirs/dir1/dir2a").unwrap();
        fs::create_dir_all("tmp/dirs/dir1/dir2/dir3").unwrap();
        fs::create_dir_all("tmp/dirs/dir1/dir2/dir3a").unwrap();

        Cleaner::new("tmp/dirs").clean();

        let num_files = WalkDir::new("tmp/dirs")
            .skip_hidden(false)
            .into_iter()
            .collect::<Vec<_>>()
            .len();
        assert_eq!(num_files, 1);
    }

    #[test]
    fn test_files() {
        fs::create_dir_all("tmp/files").unwrap();
        fs::write("tmp/files/file1.txt", "File 1 content").unwrap();
        fs::write("tmp/files/file2.txt", "File 2 content").unwrap();
        fs::write("tmp/files/file3.txt", "File 3 content").unwrap();
        fs::write("tmp/files/file4.txt", "File 4 content").unwrap();
        fs::write("tmp/files/file5.txt", "File 5 content").unwrap();
        fs::write("tmp/files/file6.txt", "File 6 content").unwrap();

        Cleaner::new("tmp/files").clean();

        let num_files = WalkDir::new("tmp/files")
            .skip_hidden(false)
            .into_iter()
            .collect::<Vec<_>>()
            .len();
        assert_eq!(num_files, 1);
    }
}