commit_graph_profile/
commit_graph_profile.rs1use std::time::Instant;
9
10use girt::{HistoryLimits, ObjectId, PackLimits, Repository};
11
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 let mut args = std::env::args().skip(1);
14 let path = args.next().ok_or("repository path required")?;
15 let tip: ObjectId = args.next().ok_or("tip ID required")?.parse()?;
16 let base: ObjectId = args.next().ok_or("base ID required")?.parse()?;
17 let trust = args.next().ok_or("objects, indexed or verified required")?;
18 let query = args.next().ok_or("walk, range or ancestor required")?;
19 let start = Instant::now();
20 let repo = Repository::open(path)?;
21 let mut objects = repo.objects_with(PackLimits::trusted())?;
22 eprintln!("open={:?}", start.elapsed());
23 match trust.as_str() {
24 "objects" => objects = objects.without_commit_graph(),
25 "indexed" => {}
26 "verified" => {
27 let graph = repo.commit_graph()?.ok_or("commit-graph required")?;
28 let start = Instant::now();
29 graph.verify(&objects)?;
30 eprintln!("object_verification={:?}", start.elapsed());
31 }
32 _ => return Err("unknown trust choice".into()),
33 }
34 let start = Instant::now();
35 let limits = HistoryLimits::trusted();
36 match query.as_str() {
37 "walk" => println!("{}", objects.walk_with(&[tip], limits)?.len()),
38 "range" => println!(
39 "{}",
40 objects.walk_range_with(&[tip], &[base], limits)?.len()
41 ),
42 "ancestor" => println!("{}", objects.is_ancestor_with(base, tip, limits)?),
43 _ => return Err("unknown query".into()),
44 }
45 eprintln!("query={:?}", start.elapsed());
46 Ok(())
47}