1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use std::fmt::Write;
use lib::core::gc::find_dangling_references;
use tracing::instrument;
use lib::core::effects::Effects;
use lib::core::eventlog::{EventLogDb, EventReplayer};
use lib::core::formatting::Pluralize;
use lib::git::Repo;
#[instrument]
pub fn gc(effects: &Effects) -> eyre::Result<()> {
let repo = Repo::from_current_dir()?;
let conn = repo.get_db_conn()?;
let event_log_db = EventLogDb::new(&conn)?;
let event_replayer = EventReplayer::from_event_log_db(effects, &repo, &event_log_db)?;
let event_cursor = event_replayer.make_default_cursor();
writeln!(
effects.get_output_stream(),
"branchless: collecting garbage"
)?;
let dangling_references = find_dangling_references(&repo, &event_replayer, event_cursor)?;
let num_dangling_references = Pluralize {
determiner: None,
amount: dangling_references.len(),
unit: ("dangling reference", "dangling references"),
}
.to_string();
for mut reference in dangling_references.into_iter() {
reference.delete()?;
}
writeln!(
effects.get_output_stream(),
"branchless: {} deleted",
num_dangling_references,
)?;
Ok(())
}