forked from sdkman/sdkman-cli-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.rs
More file actions
113 lines (97 loc) · 3.02 KB
/
Copy pathmain.rs
File metadata and controls
113 lines (97 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use std::fs;
use std::path::PathBuf;
use std::process;
use clap::Parser;
use colored::Colorize;
use sdkman_cli_native::constants::{TMP_DIR, VAR_DIR};
use sdkman_cli_native::helpers::infer_sdkman_dir;
#[derive(Parser, Debug)]
#[command(
bin_name = "sdk flush",
about = "sdk subcommand to flush temporary files and metadata"
)]
struct Args {
#[arg(required(false))]
qualifier: Option<String>,
}
fn main() {
let args = Args::parse();
let sdkman_dir = infer_sdkman_dir();
match args.qualifier.as_deref() {
Some("version") => flush_version(sdkman_dir),
Some("tmp") | Some("temp") => cleanup_folder(sdkman_dir, TMP_DIR),
Some("metadata") => cleanup_folder(sdkman_dir, &format!("{}/metadata", VAR_DIR)),
_ => {
cleanup_folder(sdkman_dir.clone(), TMP_DIR);
cleanup_folder(sdkman_dir, &format!("{}/metadata", VAR_DIR));
}
}
}
fn flush_version(sdkman_dir: PathBuf) {
let version_file = sdkman_dir.join(VAR_DIR).join("version");
if version_file.exists() {
fs::remove_file(&version_file).expect("could not remove version file");
println!("{}", "Version file has been flushed.".green());
}
}
fn cleanup_folder(sdkman_dir: PathBuf, folder: &str) {
let cleanup_dir = sdkman_dir.join(folder);
if !cleanup_dir.exists() {
fs::create_dir_all(&cleanup_dir).unwrap_or_else(|e| {
eprintln!("could not create directory {}: {}", folder, e);
process::exit(1);
});
println!(
"{}",
format!("0 archive(s) flushed, freeing 0B for {}.", folder).green()
);
return;
}
let count = fs::read_dir(&cleanup_dir)
.map(|entries| entries.count())
.unwrap_or(0);
let disk_usage = get_disk_usage(&cleanup_dir);
fs::remove_dir_all(&cleanup_dir).unwrap_or_else(|e| {
eprintln!("could not remove directory {}: {}", folder, e);
process::exit(1);
});
fs::create_dir_all(&cleanup_dir).unwrap_or_else(|e| {
eprintln!("could not recreate directory {}: {}", folder, e);
process::exit(1);
});
println!(
"{}",
format!(
"{} archive(s) flushed, freeing {} for {}.",
count, disk_usage, folder
)
.green()
);
}
fn get_disk_usage(path: &PathBuf) -> String {
let total: u64 = fs::read_dir(path)
.ok()
.map(|entries| {
entries
.filter_map(|e| e.ok())
.filter_map(|e| e.metadata().ok())
.map(|m| m.len())
.sum()
})
.unwrap_or(0);
format_size(total)
}
fn format_size(bytes: u64) -> String {
const KB: u64 = 1024;
const MB: u64 = KB * 1024;
const GB: u64 = MB * 1024;
if bytes >= GB {
format!("{:.1}G", bytes as f64 / GB as f64)
} else if bytes >= MB {
format!("{:.1}M", bytes as f64 / MB as f64)
} else if bytes >= KB {
format!("{:.1}K", bytes as f64 / KB as f64)
} else {
format!("{}B", bytes)
}
}