1#[cfg(windows)]
2use std::os::windows::fs::MetadataExt;
3
4#[cfg(unix)]
5use std::os::unix::fs::MetadataExt;
6use std::path::Path;
7use easy_archive::tool::{human_size, mode_to_string};
8
9use crate::{env::add_to_path, install::Output};
10
11pub fn get_bin_name(s: &str) -> String {
12 if cfg!(windows) && !s.ends_with(".exe") && !s.contains(".") {
13 return s.to_string() + ".exe";
14 }
15 s.to_string()
16}
17
18pub fn get_meta<P: AsRef<Path>>(s: P) -> (u32, u32, bool) {
19 let mut mode = 0;
20 let mut size = 0;
21 let mut is_dir = false;
22 if let Ok(meta) = std::fs::metadata(s) {
23 #[cfg(windows)]
24 {
25 mode = 0;
26 size = meta.file_size() as u32;
27 }
28
29 #[cfg(unix)]
30 {
31 mode = meta.mode();
32 size = meta.size() as u32;
33 }
34
35 is_dir = meta.is_dir()
36 }
37
38 (mode, size, is_dir)
39}
40
41pub fn display_output(output: &Output) -> String {
42 let mut v = vec![];
43 for i in output.values() {
44 let max_size_len = i
45 .files
46 .iter()
47 .fold(0, |pre, cur| pre.max(human_size(cur.size as usize).len()));
48
49 for k in &i.files {
50 let s = human_size(k.size as usize);
51 v.push(
52 [
53 mode_to_string(k.mode, k.is_dir),
54 " ".repeat(max_size_len - s.len()) + &s,
55 [k.origin_path.as_str(), k.install_path.as_str()].join(" -> "),
56 ]
57 .join(" "),
58 );
59 }
60 }
61 v.join("\n")
62}
63
64pub fn add_output_to_path(output: &Output) {
65 for v in output.values() {
66 for p in [&v.install_dir, &v.bin_dir] {
67 add_to_path(p);
68 }
69
70 #[cfg(unix)]
71 if v.files.len() == 1 {
72 let i = &v.files[0];
73 crate::install::add_execute_permission(&i.install_path)
74 .expect("failed to add_execute_permission");
75 }
76 }
77}
78
79pub fn get_filename(s: &str) -> Option<String> {
80 s.split("/").last().map(|i| i.to_string())
81}