Repository navigation
Expand file tree
/
Copy pathgc.rs
More file actions
53 lines (51 loc) · 1.95 KB
/
Copy pathgc.rs
File metadata and controls
53 lines (51 loc) · 1.95 KB
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
46
47
48
49
50
51
52
53
use std::{env, path::Path};
use git_rs::{GcOptions, HostFileSystem, Repository};
fn main() -> git_rs::Result<()> {
let repository_path = env::args().nth(1).unwrap_or_else(|| ".".to_owned());
let arguments = env::args().skip(2).collect::<Vec<_>>();
let object_expiry = |prefix: &str| {
arguments
.iter()
.find_map(|argument| argument.strip_prefix(prefix))
.map(str::parse::<u64>)
.transpose()
.expect("expiry must be Unix seconds")
};
let reflog_expiry = |prefix: &str| {
arguments
.iter()
.find_map(|argument| argument.strip_prefix(prefix))
.map(str::parse::<i64>)
.transpose()
.expect("reflog expiry must be Unix seconds")
};
let repository_path = std::fs::canonicalize(Path::new(&repository_path))?;
let repository = Repository::open(
HostFileSystem::new(repository_path.parent().expect("repository parent"))?,
repository_path.file_name().expect("repository name"),
)?;
let dry_run = !arguments.iter().any(|argument| argument == "--run");
let report = repository.gc(&GcOptions {
dry_run,
force: !dry_run,
reflog_expire_before: reflog_expiry("--reflog-before="),
reflog_expire_unreachable_before: reflog_expiry("--unreachable-reflog-before="),
worktree_expire_before: object_expiry("--worktree-before="),
prune_expire_before: object_expiry("--prune-before="),
..GcOptions::default()
})?;
println!(
"refs={} reflog-entries={} worktrees={} loose={}",
report.refs_selected,
report.reflog_entries_removed,
report.worktrees.len(),
report.loose_objects.len(),
);
if let Some(repack) = report.repack {
println!(
"packed={} pruned-loose={} removed-packs={}",
repack.packed_objects, repack.pruned_loose_objects, repack.removed_packs,
);
}
Ok(())
}