Skip to content

Commit

Permalink
continue data gathering past individual failures
Browse files Browse the repository at this point in the history
  • Loading branch information
TeFiLeDo committed Sep 24, 2023
1 parent 02166a0 commit 5ad2ece
Showing 1 changed file with 41 additions and 29 deletions.
70 changes: 41 additions & 29 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{fs::read_dir, os::linux::fs::MetadataExt, path::Path};

use anyhow::{anyhow, ensure, Context, Result};
use anyhow::{anyhow, ensure, Context, Error, Result};
use clap::Parser;

use crate::{cli::Args, summary::Summary};
Expand All @@ -14,25 +14,15 @@ fn main() -> Result<()> {

let mut summary = Summary::default();
for root in args.roots {
fs_entry(&root, &mut summary)?;
fs_entry(&root, &mut summary);
}

if !args.raw {
let (uf, gf) = summary.lookup_names();

for (uid, e) in uf {
eprintln!(
"{:#}",
anyhow!(e).context(format!("failed to get name for user {uid}"))
);
}

for (gid, e) in gf {
eprintln!(
"{:#}",
anyhow!(e).context(format!("failed to get name for group {gid}"))
);
}
uf.into_iter()
.for_each(|(uid, e)| print_err(e, format!("failed to get name for user {uid}")));
gf.into_iter()
.for_each(|(gid, e)| print_err(e, format!("failed to get name for group {gid}")));
}
let output = match args.json {
false => summary.to_string(),
Expand All @@ -44,26 +34,48 @@ fn main() -> Result<()> {
}

/// Perform gid & uid gathering for a file, or a directory and its children.
fn fs_entry(entry: &Path, summary: &mut Summary) -> Result<()> {
fn fs_entry(entry: &Path, summary: &mut Summary) {
let display = entry.display();
ensure!(
entry.is_symlink() || entry.exists(),
format!("{} doesn't exist", display)
);
if !entry.exists() && !entry.is_symlink() {
print_root_err(format!("{display} doesn't exist"));
}

let meta = match entry.symlink_metadata() {
Ok(meta) => meta,
Err(e) => {
print_err(e, format!("failed to get metadata for {display}"));
return;
}
};

let meta = entry
.symlink_metadata()
.context(format!("failed to get metadata for {}", display))?;
summary.add_user(meta.st_uid());
summary.add_group(meta.st_gid());

if entry.is_dir() {
let children = read_dir(entry).context(format!("failed to read dir {}", display))?;
for e in children {
let e = e.context(format!("invalid child for {}", display))?;
fs_entry(&e.path(), summary)?;
let children = match read_dir(entry) {
Ok(children) => children,
Err(e) => {
print_err(e, format!("failed to read dir {display}"));
return;
}
};

for child in children {
match child {
Ok(child) => fs_entry(&child.path(), summary),
Err(e) => {
print_err(e, format!("invalid child for {display}"));
return;
}
}
}
}
}

Ok(())
fn print_root_err(message: String) {
eprintln!("{:#}", anyhow!("{message}"));
}

fn print_err(err: impl Into<Error>, message: String) {
eprintln!("{:#}", err.into().context(message));
}

0 comments on commit 5ad2ece

Please sign in to comment.