Skip to main content

commit_graph_profile/
commit_graph_profile.rs

1//! Phase timings for object-backed and default indexed history queries.
2//!
3//! Opening includes default graph loading and attachment in every mode. Pack limits are trusted
4//! because Linux-sized pack indexes exceed the default bound. Object mode then removes
5//! the index before querying; indexed mode retains it. Verified mode additionally checks objects.
6//!
7//! Usage: `commit_graph_profile REPO TIP BASE objects|indexed|verified walk|range|ancestor`.
8use 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}