Skip to main content

commit_graph_open_phases/
commit_graph_open_phases.rs

1//! Phase timings for loading a repository's commit-graph.
2//! Usage: `commit_graph_open_phases REPO [ROUNDS]`.
3use std::time::Instant;
4
5use girt::commit_graph::CommitGraph;
6use girt::{PackLimits, Repository};
7
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    let mut args = std::env::args().skip(1);
10    let path = args.next().ok_or("repository path required")?;
11    let rounds: usize = args.next().map_or(Ok(3), |r| r.parse())?;
12    for _ in 0..rounds {
13        let start = Instant::now();
14        let repo = Repository::open(&path)?;
15        let objects = repo
16            .objects_with(PackLimits::trusted())?
17            .without_commit_graph();
18        let opened = start.elapsed();
19        let start = Instant::now();
20        let bytes = std::fs::read(repo.object_dir().join("info/commit-graph"))?;
21        let read = start.elapsed();
22        let start = Instant::now();
23        let graph = CommitGraph::parse(&bytes, repo.object_format())?;
24        let parsed = start.elapsed();
25        let start = Instant::now();
26        let objects = objects.with_commit_graph(graph)?;
27        let attached = start.elapsed();
28        let start = Instant::now();
29        drop(objects);
30        let dropped = start.elapsed();
31        let start = Instant::now();
32        let full = Repository::open(&path)?.objects_with(PackLimits::trusted())?;
33        let total = start.elapsed();
34        drop(full);
35        eprintln!(
36            "repo+packs={opened:?} read={read:?} parse={parsed:?} attach={attached:?} drop={dropped:?} default_open={total:?}"
37        );
38    }
39    Ok(())
40}