Repository navigation
Expand file tree
/
Copy pathprune.rs
More file actions
45 lines (43 loc) · 1.58 KB
/
Copy pathprune.rs
File metadata and controls
45 lines (43 loc) · 1.58 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
use std::env;
use std::path::Path;
use git_rs::{HostFileSystem, PruneOptions, 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 force = arguments.iter().any(|argument| argument == "--force");
let expire_before = arguments
.iter()
.find_map(|argument| argument.strip_prefix("--expire-before="))
.map(str::parse::<u64>)
.transpose()
.expect("--expire-before must be Unix seconds");
let repository_path = std::fs::canonicalize(Path::new(&repository_path))?;
let storage_root = repository_path
.parent()
.expect("repository path must have a parent");
let repository_name = repository_path
.file_name()
.expect("repository path must name a directory");
let repository = Repository::open(HostFileSystem::new(storage_root)?, repository_name)?;
let entries = repository.prune(&PruneOptions {
expire_before,
prune_packed_copies: !arguments
.iter()
.any(|argument| argument == "--keep-packed-copies"),
force,
dry_run: !force,
..PruneOptions::default()
})?;
for entry in entries {
let id = entry
.id()
.map_or_else(|| "temporary".to_owned(), |id| id.to_string());
let action = if force { "removed" } else { "would remove" };
println!(
"{action} {id} {:?} {}",
entry.reason(),
entry.path().display()
);
}
Ok(())
}