diff --git a/cli/src/bin/pb.rs b/cli/src/bin/pb.rs deleted file mode 100644 index 45c15e2..0000000 --- a/cli/src/bin/pb.rs +++ /dev/null @@ -1,14 +0,0 @@ -use indicatif::{ProgressBar, ProgressStyle}; - -fn main() { - let pb = ProgressBar::new(1); - let spinner_style = ProgressStyle::with_template("{spinner} {wide_msg}").unwrap(); - pb.set_style(spinner_style); - for i in 0..100 { - pb.set_message(format!("{i}:")); - // pb.inc(1); - std::thread::sleep(std::time::Duration::from_millis(50)); - } - - pb.finish_with_message("Scan Finished..."); -} diff --git a/cli/Cargo.toml b/devclean/Cargo.toml similarity index 65% rename from cli/Cargo.toml rename to devclean/Cargo.toml index 6966c5b..fbe4967 100644 --- a/cli/Cargo.toml +++ b/devclean/Cargo.toml @@ -2,7 +2,10 @@ name = "devclean" version = "0.1.0" edition = "2021" -default-run = "devclean" +description = "A tool to clean up your development environment" +license = "MIT" +repository = "https://github.com/HuakunShen/devclean" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -10,9 +13,10 @@ clap = { version = "4.5.4", features = ["derive", "cargo"] } color-eyre = "0.6.3" dialoguer = "0.11.0" fs_extra = "1.3.0" +git2 = "0.18.3" human_bytes = "0.4.3" humantime = "2.1.0" indicatif = "0.17.8" -prettytable = "0.10.0" +prettytable-rs = "0.10.0" rayon = "1.10.0" -scanner = { path = "../scanner" } +walkdir = "2.5.0" diff --git a/cli/src/lib.rs b/devclean/src/cleaner.rs similarity index 92% rename from cli/src/lib.rs rename to devclean/src/cleaner.rs index 0136ddb..c460c3f 100644 --- a/cli/src/lib.rs +++ b/devclean/src/cleaner.rs @@ -2,8 +2,8 @@ use color_eyre::Result; use fs_extra::dir::get_size; use human_bytes::human_bytes; use indicatif::ProgressBar; -use scanner::results::AnalyzeTarget; -use std::{io::Write, time::Duration}; +use crate::results::AnalyzeTarget; +use std::io::Write; pub struct Cleaner { pub bytes_cleaned: u128, @@ -24,7 +24,9 @@ impl Cleaner { if !self.dry_run { std::fs::remove_dir_all(&target.path)?; } - let size = target.size.unwrap_or_else(|| get_size(target.path.clone()).unwrap_or(0)); + let size = target + .size + .unwrap_or_else(|| get_size(target.path.clone()).unwrap_or(0)); self.bytes_cleaned += size as u128; pb.inc(1); } diff --git a/scanner/src/lib.rs b/devclean/src/lib.rs similarity index 77% rename from scanner/src/lib.rs rename to devclean/src/lib.rs index b033995..457635a 100644 --- a/scanner/src/lib.rs +++ b/devclean/src/lib.rs @@ -1,3 +1,4 @@ pub mod predicates; pub mod results; pub mod scanner; +pub mod cleaner; \ No newline at end of file diff --git a/cli/src/main.rs b/devclean/src/main.rs similarity index 97% rename from cli/src/main.rs rename to devclean/src/main.rs index 57ddd2e..1a0d1bf 100644 --- a/cli/src/main.rs +++ b/devclean/src/main.rs @@ -1,12 +1,12 @@ use clap::{Parser, Subcommand}; use color_eyre::Result; -use devclean::Cleaner; -use dialoguer::{theme::ColorfulTheme, MultiSelect}; -use human_bytes::human_bytes; -use scanner::{ +use devclean::cleaner::Cleaner; +use devclean::{ results::AnalyzeTargets, scanner::{get_dirty_git_repo_scanner, get_project_garbage_scanner}, }; +use dialoguer::{theme::ColorfulTheme, MultiSelect}; +use human_bytes::human_bytes; use std::path::PathBuf; /// Simple program to greet a person @@ -62,7 +62,6 @@ fn main() -> Result<()> { } let removable_scanner = get_project_garbage_scanner(args.depth, true); let mut cleaner = Cleaner::new(args.dry_run, args.all); - let start = std::time::Instant::now(); let mut target_paths = removable_scanner.scan_parallel(&path, 0); target_paths.sort_by(|a, b| b.cmp(a)); let to_clean = if args.yes { diff --git a/scanner/src/predicates/general.rs b/devclean/src/predicates/general.rs similarity index 100% rename from scanner/src/predicates/general.rs rename to devclean/src/predicates/general.rs diff --git a/scanner/src/predicates/languages/git.rs b/devclean/src/predicates/languages/git.rs similarity index 100% rename from scanner/src/predicates/languages/git.rs rename to devclean/src/predicates/languages/git.rs diff --git a/scanner/src/predicates/languages/mod.rs b/devclean/src/predicates/languages/mod.rs similarity index 100% rename from scanner/src/predicates/languages/mod.rs rename to devclean/src/predicates/languages/mod.rs diff --git a/scanner/src/predicates/languages/node.rs b/devclean/src/predicates/languages/node.rs similarity index 100% rename from scanner/src/predicates/languages/node.rs rename to devclean/src/predicates/languages/node.rs diff --git a/scanner/src/predicates/languages/rust.rs b/devclean/src/predicates/languages/rust.rs similarity index 100% rename from scanner/src/predicates/languages/rust.rs rename to devclean/src/predicates/languages/rust.rs diff --git a/scanner/src/predicates/mod.rs b/devclean/src/predicates/mod.rs similarity index 100% rename from scanner/src/predicates/mod.rs rename to devclean/src/predicates/mod.rs diff --git a/scanner/src/predicates/stop.rs b/devclean/src/predicates/stop.rs similarity index 100% rename from scanner/src/predicates/stop.rs rename to devclean/src/predicates/stop.rs diff --git a/scanner/src/results.rs b/devclean/src/results.rs similarity index 100% rename from scanner/src/results.rs rename to devclean/src/results.rs diff --git a/scanner/src/scanner.rs b/devclean/src/scanner.rs similarity index 100% rename from scanner/src/scanner.rs rename to devclean/src/scanner.rs diff --git a/scanner/Cargo.toml b/scanner/Cargo.toml deleted file mode 100644 index e53a809..0000000 --- a/scanner/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "scanner" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -color-eyre = "0.6.3" -fs_extra = "1.3.0" -git2 = "0.18.3" -human_bytes = "0.4.3" -indicatif = "0.17.8" -prettytable-rs = "0.10.0" -rayon = "1.10.0" -walkdir = "2.5.0" diff --git a/scanner/src/bin/parallel.rs b/scanner/src/bin/parallel.rs deleted file mode 100644 index f1e4eeb..0000000 --- a/scanner/src/bin/parallel.rs +++ /dev/null @@ -1,72 +0,0 @@ -use fs_extra::dir::get_size; -use rayon::prelude::*; -use std::fs; -use std::path::{Path, PathBuf}; -use std::time::Duration; - -struct Scanner { - count: u64, - callbacks: Vec Vec + Send + Sync>>, -} - -impl Scanner { - fn scan_parallel(&self, path: PathBuf) -> Vec { - // self.count += 1; - // println!("Scanning: {:?}", path); - // std::thread::sleep(Duration::from_millis(10)); - get_size(path.clone()).unwrap(); - // let path_clone = path.clone(); - let entries = fs::read_dir(path) - .unwrap() - .filter_map(Result::ok) - .collect::>(); - - // We use `flat_map` here to concatenate all the results into a single vector - entries - .par_iter() - .flat_map(|entry| { - // get_size(path_clone).unwrap(); - let path = entry.path(); - if path.is_dir() { - // Recursively scan the directory in parallel - self.scan(path) - } else { - vec![path] - } - }) - .collect() - } - - fn scan(&self, path: PathBuf) -> Vec { - // std::thread::sleep(Duration::from_millis(10)); - get_size(path.clone()).unwrap(); - let mut results = vec![]; - let entries: Vec<_> = path.read_dir().unwrap().collect(); - for entry in entries { - let entry = entry.unwrap(); - let path = entry.path(); - if path.is_dir() { - results.extend(self.scan(path)); - } else { - results.push(path); - } - } - - results - } -} - -fn main() { - // let path = PathBuf::from("/Users/hacker/Dev/projects/"); - let path = PathBuf::from("/Users/hacker/Dev/learn"); - let start = std::time::Instant::now(); - let mut scanner = Scanner { - callbacks: vec![], - count: 0, - }; - let results = scanner.scan_parallel(path); - // let results = scanner.scan(path); - println!("Scan Finished in {:?}", start.elapsed()); - println!("Found {} files", results.len()); - // Optionally, print results -} diff --git a/scanner/src/bin/parallel_mut.rs b/scanner/src/bin/parallel_mut.rs deleted file mode 100644 index befd343..0000000 --- a/scanner/src/bin/parallel_mut.rs +++ /dev/null @@ -1,46 +0,0 @@ -use fs_extra::dir::get_size; -use rayon::prelude::*; -use std::fs; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; -use std::path::PathBuf; -use std::time::Duration; - -struct Scanner { - count: Arc, -} - -impl Scanner { - fn scan_parallel(&self, path: PathBuf) -> Vec { - self.count.fetch_add(1, Ordering::SeqCst); - get_size(path.clone()).unwrap(); - let entries = fs::read_dir(path) - .unwrap() - .filter_map(Result::ok) - .collect::>(); - - entries - .par_iter() - .flat_map(|entry| { - let path = entry.path(); - if path.is_dir() { - self.scan_parallel(path) - } else { - vec![path] - } - }) - .collect() - } -} - -fn main() { - let path = PathBuf::from("/Users/hacker/Dev/learn"); - let start = std::time::Instant::now(); - let scanner = Scanner { - count: Arc::new(AtomicU64::new(0)), - }; - let results = scanner.scan_parallel(path); - println!("Scan Finished in {:?}", start.elapsed()); - println!("Found {} files", results.len()); - println!("Directories scanned: {}", scanner.count.load(Ordering::SeqCst)); -}