dev_scripts/
main.rs

1use std::fs::remove_dir_all;
2
3use anyhow::{Context, Result};
4use clap::Parser;
5use cli::Cli;
6use log::{LevelFilter, warn};
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 {
76                        mirror,
77                        force_extract,
78                    } => {
79                        let downloader = MirrorDownloader {
80                            dest,
81                            mirror,
82                            repositories,
83                            extract_all: force_extract,
84                        };
85                        warn!(
86                            "Beginning database retrieval\nIf the process is unexpectedly halted, rerun with `--force-extract` flag"
87                        );
88                        downloader.sync_remote_databases()?;
89                    }
90                    cli::DownloadCmd::Packages {
91                        mirror,
92                        force_extract,
93                    } => {
94                        let downloader = MirrorDownloader {
95                            dest,
96                            mirror,
97                            repositories,
98                            extract_all: force_extract,
99                        };
100                        warn!(
101                            "Beginning package retrieval\nIf the process is unexpectedly halted, rerun with `--force-extract` flag"
102                        );
103                        downloader.sync_remote_packages()?;
104                    }
105                };
106            }
107            cli::TestFilesCmd::Clean {
108                destination,
109                source,
110            } => {
111                // Set a default download destination.
112                let dest = match destination {
113                    Some(dest) => dest,
114                    None => dirs::cache_dir()
115                        .context("Failed to determine home user cache directory.")?
116                        .join("alpm/testing"),
117                };
118
119                match source {
120                    cli::CleanCmd::PkgSrcRepositories => {
121                        remove_dir_all(dest.join("download").join("pkgsrc"))?;
122                        remove_dir_all(dest.join("pkgsrc"))?;
123                    }
124                    cli::CleanCmd::Databases => {
125                        remove_dir_all(dest.join("download").join("databases"))?;
126                        remove_dir_all(dest.join("databases"))?;
127                    }
128                    cli::CleanCmd::Packages => {
129                        remove_dir_all(dest.join("download").join("packages"))?;
130                        remove_dir_all(dest.join("packages"))?;
131                    }
132                };
133            }
134        },
135    }
136
137    Ok(())
138}