dev_scripts/
main.rs

1use std::fs::remove_dir_all;
2
3use anyhow::{Context, Result};
4use clap::Parser;
5use cli::Cli;
6use log::LevelFilter;
7use simplelog::{Config, SimpleLogger};
8use strum::IntoEnumIterator;
9use sync::{PackageRepositories, mirror::MirrorDownloader, pkgsrc::PkgSrcDownloader};
10use testing::TestRunner;
11
12mod cli;
13mod cmd;
14pub mod sync;
15pub mod testing;
16mod ui;
17
18fn main() -> Result<()> {
19    // Parse commandline options.
20    let args = Cli::parse();
21
22    // Init and set the verbosity level of the logger.
23    let level = match args.verbose {
24        0 => LevelFilter::Info,
25        1 => LevelFilter::Debug,
26        _ => LevelFilter::Trace,
27    };
28    SimpleLogger::init(level, Config::default()).context("Failed to initialize simple logger")?;
29
30    match args.cmd {
31        cli::Command::TestFiles { cmd } => match cmd {
32            cli::TestFilesCmd::Test {
33                test_data_dir,
34                repositories,
35                file_type,
36            } => {
37                // Set a default download destination.
38                let test_data_dir = match test_data_dir {
39                    Some(test_data_dir) => test_data_dir,
40                    None => dirs::cache_dir()
41                        .context("Failed to determine home user cache directory.")?
42                        .join("alpm/testing"),
43                };
44                let repositories = PackageRepositories::iter()
45                    .filter(|v| repositories.clone().is_none_or(|r| r.contains(v)))
46                    .collect();
47                let runner = TestRunner {
48                    test_data_dir,
49                    file_type,
50                    repositories,
51                };
52                runner.run_tests()?;
53            }
54            cli::TestFilesCmd::Download {
55                destination,
56                repositories,
57                source,
58            } => {
59                // Set a default download destination.
60                let dest = match destination {
61                    Some(dest) => dest,
62                    None => dirs::cache_dir()
63                        .context("Failed to determine home user cache directory.")?
64                        .join("alpm/testing"),
65                };
66                let repositories = PackageRepositories::iter()
67                    .filter(|v| repositories.clone().is_none_or(|r| r.contains(v)))
68                    .collect();
69
70                match source {
71                    cli::DownloadCmd::PkgSrcRepositories {} => {
72                        let downloader = PkgSrcDownloader { dest };
73                        downloader.download_package_source_repositories()?;
74                    }
75                    cli::DownloadCmd::Databases { mirror } => {
76                        let downloader = MirrorDownloader {
77                            dest,
78                            mirror,
79                            repositories,
80                        };
81                        downloader.sync_remote_databases()?;
82                    }
83                    cli::DownloadCmd::Packages { mirror } => {
84                        let downloader = MirrorDownloader {
85                            dest,
86                            mirror,
87                            repositories,
88                        };
89                        downloader.sync_remote_packages()?;
90                    }
91                };
92            }
93            cli::TestFilesCmd::Clean {
94                destination,
95                source,
96            } => {
97                // Set a default download destination.
98                let dest = match destination {
99                    Some(dest) => dest,
100                    None => dirs::cache_dir()
101                        .context("Failed to determine home user cache directory.")?
102                        .join("alpm/testing"),
103                };
104
105                match source {
106                    cli::CleanCmd::PkgSrcRepositories => {
107                        remove_dir_all(dest.join("download").join("pkgsrc"))?;
108                        remove_dir_all(dest.join("pkgsrc"))?;
109                    }
110                    cli::CleanCmd::Databases => {
111                        remove_dir_all(dest.join("download").join("databases"))?;
112                        remove_dir_all(dest.join("databases"))?;
113                    }
114                    cli::CleanCmd::Packages => {
115                        remove_dir_all(dest.join("download").join("packages"))?;
116                        remove_dir_all(dest.join("packages"))?;
117                    }
118                };
119            }
120        },
121    }
122
123    Ok(())
124}