summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-01-10 07:41:33 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-01-10 07:41:33 -0500
commit6a852678bd1ae36cd46a7fecd19fe4cdcce78b45 (patch)
treee1d3a77f929cb95c46a1d0f728cdfac7b7585f0b
parentc1d51d5481236aabdaecbb7ac9db1d370418cc5d (diff)
Convert to clap
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs68
2 files changed, 46 insertions, 23 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 1898e7e..ee7d19d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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
+ => {}
}
}