git_perf/
cli.rs

1use anyhow::Result;
2use clap::CommandFactory;
3use clap::{error::ErrorKind::ArgumentConflict, Parser};
4use env_logger::Env;
5use log::Level;
6
7use crate::audit;
8use crate::basic_measure::measure;
9use crate::config::bump_epoch;
10use crate::git::git_interop::check_git_version;
11use crate::git::git_interop::{prune, pull, push};
12use crate::measurement_storage::{add, remove_measurements_from_commits};
13use crate::reporting::report;
14use git_perf_cli_types::{Cli, Commands};
15
16pub fn handle_calls() -> Result<()> {
17    let cli = Cli::parse();
18    let logger_level = match cli.verbose {
19        0 => Level::Warn,
20        1 => Level::Info,
21        2 => Level::Debug,
22        _ => Level::Trace,
23    };
24    env_logger::Builder::from_env(Env::default().default_filter_or(logger_level.as_str())).init();
25
26    check_git_version()?;
27
28    match cli.command {
29        Commands::Measure {
30            repetitions,
31            command,
32            measurement,
33        } => measure(
34            &measurement.name,
35            repetitions,
36            &command,
37            &measurement.key_value,
38        ),
39        Commands::Add { value, measurement } => {
40            add(&measurement.name, value, &measurement.key_value)
41        }
42        Commands::Push {} => push(None),
43        Commands::Pull {} => pull(None),
44        Commands::Report {
45            output,
46            separate_by,
47            report_history,
48            measurement,
49            key_value,
50            aggregate_by,
51        } => report(
52            output,
53            separate_by,
54            report_history.max_count,
55            &measurement,
56            &key_value,
57            aggregate_by,
58        ),
59        Commands::Audit {
60            measurement,
61            report_history,
62            selectors,
63            min_measurements,
64            aggregate_by,
65            sigma,
66        } => {
67            if report_history.max_count < min_measurements.into() {
68                Cli::command().error(ArgumentConflict, format!("The minimal number of measurements ({}) cannot be more than the maximum number of measurements ({})", min_measurements, report_history.max_count)).exit()
69            }
70            audit::audit_multiple(
71                &measurement,
72                report_history.max_count,
73                min_measurements,
74                &selectors,
75                aggregate_by,
76                sigma,
77            )
78        }
79        Commands::BumpEpoch { measurement } => bump_epoch(&measurement),
80        Commands::Prune {} => prune(),
81        Commands::Remove { older_than } => remove_measurements_from_commits(older_than),
82    }
83}