48 lines
1.3 KiB
Rust
48 lines
1.3 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use anyhow::{bail, Error};
|
|
|
|
use pbs_datastore::DataStore;
|
|
|
|
fn run() -> Result<(), Error> {
|
|
let base: PathBuf = match std::env::args().skip(1).next() {
|
|
Some(path) => path.into(),
|
|
None => bail!("no path passed!\n\nusage: ls-snapshots <path> [<max-depth>]"),
|
|
};
|
|
let max_depth: Option<usize> = match std::env::args().skip(2).next() {
|
|
Some(depth) => match depth.parse::<usize>() {
|
|
Ok(depth) if depth < 8 => Some(depth),
|
|
Ok(_) => bail!("max-depth must be < 8"),
|
|
Err(err) => bail!("couldn't parse max-depth from {depth} - {err}"),
|
|
},
|
|
None => None,
|
|
};
|
|
|
|
let store = unsafe { DataStore::open_path("", &base, None)? };
|
|
|
|
for ns in store.recursive_iter_backup_ns_ok(Default::default(), max_depth)? {
|
|
println!("found namespace store:/{}", ns);
|
|
|
|
for group in store.iter_backup_groups(ns)? {
|
|
let group = group?;
|
|
println!(" found group {}", group);
|
|
|
|
for snapshot in group.iter_snapshots()? {
|
|
println!("\t{}", snapshot?);
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
std::process::exit(match run() {
|
|
Ok(_) => 0,
|
|
Err(err) => {
|
|
eprintln!("error: {}", err);
|
|
1
|
|
}
|
|
});
|
|
}
|