git_explore/manage/
init.rs

1use crate::*;
2
3#[derive(Debug, Serialize, Deserialize, Clone)]
4#[serde(deny_unknown_fields)]
5pub struct Config {
6    pub version: String,
7    pub git_repos: Vec<String>,
8    pub cargo_repos: Vec<String>,
9    pub pubspec_repos: Vec<String>,
10}
11impl Config {
12    // fn ok(self) -> std::result::Result<Self, ()> {
13    //     Ok(self)
14    // }
15    pub fn get(path: impl AsRef<Path>) -> Self {
16        let content = path.as_ref().to_str().unwrap().get_content();
17        toml::from_str(&content).unwrap()
18    }
19    pub fn set(&self, search_path: PathBuf) -> std::result::Result<(), std::io::Error> {
20        std::fs::write(search_path, toml::to_string(self).unwrap())
21    }
22}
23pub fn init(opt: &InitOption) -> std::result::Result<(), std::io::Error> {
24    let search_path = opt.base.base_dir.to_config_path();
25    let list_opts = ListOption {
26        base: opt.base.clone(),
27        filter: BaseFilterOptions {
28            // kind: FilterKind::Directory,
29            name: ".git".to_owned(),
30        },
31    };
32    let git_vec = find_git(&list_opts).unwrap();
33    let list_opts = ListOption {
34        base: opt.base.clone(),
35        filter: BaseFilterOptions {
36            // kind: FilterKind::File,
37            name: "Cargo.toml".to_owned(),
38        },
39    };
40    let cargo_vec = find_file(&list_opts).unwrap();
41    let list_opts = ListOption {
42        base: opt.base.clone(),
43        filter: BaseFilterOptions {
44            // kind: FilterKind::File,
45            name: "pubspec.yaml".to_owned(),
46        },
47    };
48    let pubspec_vec = find_file(&list_opts).unwrap();
49    let version = get_max_version(&cargo_vec).unwrap_or_else(|| Version::parse("0.0.1").unwrap());
50    Config {
51        version: (opt)
52            .version_opts
53            .commit_version
54            .to_owned()
55            .unwrap_or_else(|| version.to_string()),
56        git_repos: git_vec.to_string_vec(),
57        cargo_repos: cargo_vec.to_string_vec(),
58        pubspec_repos: pubspec_vec.to_string_vec(),
59    }
60    .set(search_path)
61}
62
63pub fn get_max_version(cargo_repos: &[PathBuf]) -> Option<Version> {
64    cargo_repos
65        .iter()
66        .map(|path| {
67            let p = path.to_str().unwrap();
68            p.cargo_version().unwrap()
69        })
70        .max()
71    // .unwrap()
72}
73#[test]
74fn run_init() {
75    let cli = RepoCli::parse_from([KEY_COMMAND, "init", "-d", KEY_BASEPATH]);
76    // println!("cli: {:#?}", cli);
77    if let Some(Command::Init(opt)) = cli.command {
78        init(&opt).unwrap();
79    }
80    let content = ("d:\\rust\\backend\\sdk1018\\".to_string() + KEY_CONFIG_PATH).get_content();
81
82    insta::assert_debug_snapshot!(content)
83}