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 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 {
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 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}