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 let args = Cli::parse();
21
22 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 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 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 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}