diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-01-10 07:41:33 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-01-10 07:41:33 -0500 |
commit | 6a852678bd1ae36cd46a7fecd19fe4cdcce78b45 (patch) | |
tree | e1d3a77f929cb95c46a1d0f728cdfac7b7585f0b | |
parent | c1d51d5481236aabdaecbb7ac9db1d370418cc5d (diff) |
Convert to clap
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 68 |
2 files changed, 46 insertions, 23 deletions
@@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +clap = { version = "4.0.32", features = ["derive"] } git2 = "0.15.0" nom = "7.1.2" serde = "1.0.152" diff --git a/src/main.rs b/src/main.rs index 24a478f..7fe8539 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use std::collections::HashSet; -use std::env; use std::io; use std::io::Write; use std::error::Error; use std::process::Command; +use clap::{Parser, Subcommand}; use nom::number::complete::float; use serde_derive::{Serialize, Deserialize}; use toml; @@ -200,16 +200,27 @@ fn run_tests(repo: &git2::Repository, range: &str, test: &str) { } fn log_with_results(repo: &git2::Repository, + head: &Option<String>, results: &TestResultsMap) -> Result<TestResultsVec, git2::Error> { let mut walk = repo.revwalk().unwrap(); - if let Err(e) = walk.push_head() { - eprintln!("Error walking: {}", e); - return Err(e); + if let Some(head) = head { + let object = repo.revparse_single(head)?; + + if let Err(e) = walk.push(object.id()) { + eprintln!("Error walking {}: {}", head, e); + return Err(e); + } + } else { + if let Err(e) = walk.push_head() { + eprintln!("Error walking: {}", e); + return Err(e); + } } let mut v = Vec::new(); let mut nr_empty = 0; + let mut last_found_idx = 0; for i in walk .filter_map(|i| i.ok()) @@ -221,6 +232,7 @@ fn log_with_results(repo: &git2::Repository, if let Some(r) = r { i.data_points = r.clone(); nr_empty = 0; + last_found_idx = v.len(); } else { nr_empty += 1; } @@ -232,19 +244,13 @@ fn log_with_results(repo: &git2::Repository, v.push(i); } - while let Some(l) = v.last() { - if l.data_points.len() != 0 { - break; - } - v.pop(); - } - + v.truncate(last_found_idx + 1); Ok(v) } -fn list_tests(repo: &git2::Repository) { +fn list_tests(repo: &git2::Repository, head: &Option<String>) { let results = results_read(RESULTS).unwrap(); - let log = log_with_results(repo, &results).unwrap(); + let log = log_with_results(repo, head, &results).unwrap(); let mut columns = HashSet::new(); for r in log.iter() { @@ -273,18 +279,34 @@ fn list_tests(repo: &git2::Repository) { } } -fn main() { - let args: Vec<String> = env::args().collect(); - let repo = git2::Repository::open(".").unwrap(); +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Args { + #[command(subcommand)] + command: Option<Commands>, +} - let subcmd = args.get(1).unwrap(); +#[derive(Subcommand)] +enum Commands { + Run { + range: String, + test: String, + }, + List { + head: Option<String> + }, +} - if subcmd == "run" { - let range = args.get(2).unwrap(); - let test = args.get(3).unwrap(); +fn main() { + let args = Args::parse(); + let repo = git2::Repository::open(".").unwrap(); - run_tests(&repo, range, test); - } else if subcmd == "log" { - list_tests(&repo); + match &args.command { + Some(Commands::List { head } ) + => list_tests(&repo, head), + Some(Commands::Run { range, test} ) + => run_tests(&repo, range, test), + None + => {} } } |