easy_install/
tool.rs

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}