Lines
97.62 %
Functions
37.5 %
use review_harvest::{git::harvest, gpg::load_keys};
use std::path::PathBuf;
const HELP: &str = "\
harvest
USAGE:
harvest [OPTIONS]
FLAGS:
-h, --help Prints help information
OPTIONS:
--input PATH File with a list of git urls
--output-dir PATH Directory to check out the git repositories in
--gpg-dir PATH Provide a GPG directory to verify signatures
";
#[derive(Debug)]
struct Args {
input: PathBuf,
output_dir: PathBuf,
gpg_dir: Option<PathBuf>,
}
fn parse_path(s: &std::ffi::OsStr) -> Result<std::path::PathBuf, &'static str> {
Ok(s.into())
fn parse_args() -> Result<Args, pico_args::Error> {
let mut pargs = pico_args::Arguments::from_env();
// Help has a higher priority and should be handled separately.
if pargs.contains(["-h", "--help"]) {
print!("{}", HELP);
std::process::exit(0);
let args = Args {
input: pargs.value_from_os_str("--input", parse_path)?,
output_dir: pargs.value_from_os_str("--output-dir", parse_path)?,
gpg_dir: pargs.opt_value_from_os_str("--gpg-dir", parse_path)?,
};
let remaining_arguments = pargs.finish();
if !remaining_arguments.is_empty() {
eprintln!("There are unused arguments:");
for remaining in remaining_arguments {
if let Ok(remaining) = remaining.into_string() {
eprintln!("Unused argument: {}", remaining);
std::process::exit(1);
Ok(args)
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = match parse_args() {
Ok(v) => v,
Err(e) => {
eprintln!("Error: {}.", e);
let certs = if let Some(gpg_dir) = args.gpg_dir {
load_keys(&gpg_dir)?
} else {
Vec::new()
let results = harvest(&args.input, &args.output_dir, &certs);
let json = serde_json::to_string_pretty(&results)?;
std::fs::write("harvest_output.json", json)?;
Ok(())