use log::debug;
use std::path::Path;
use std::time::{Duration, SystemTime};
use crate::fs_utils::security::FileIdentity;
#[allow(unused_variables)]
pub fn matches_stdout(
entry_path: &Path,
metadata: &std::fs::Metadata,
stdout_id: &FileIdentity,
) -> bool {
#[cfg(unix)]
{
use std::os::unix::fs::MetadataExt;
let file_id = FileIdentity {
dev: metadata.dev(),
ino: metadata.ino(),
};
if log::log_enabled!(log::Level::Debug) {
debug!(
"Comparing {} (dev={}, ino={}) vs stdout (dev={}, ino={})",
entry_path.display(),
file_id.dev,
file_id.ino,
stdout_id.dev,
stdout_id.ino
);
}
if file_id == *stdout_id {
debug!(
"Skipping output file (inode match): {}",
entry_path.display()
);
return true;
}
}
false
}
pub fn is_recently_created_empty(
entry_path: &Path,
metadata: &std::fs::Metadata,
threshold: Duration,
) -> bool {
if metadata.len() != 0 {
return false;
}
let dominated = metadata
.modified()
.ok()
.and_then(|modified| SystemTime::now().duration_since(modified).ok())
.is_some_and(|elapsed| elapsed < threshold);
if dominated {
debug!(
"Skipping potential output file (heuristic): {}",
entry_path.display()
);
}
dominated
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::TempDir;
#[test]
fn test_recently_created_empty_skips_new_empty() {
let temp = TempDir::new().unwrap();
let path = temp.path().join("empty.txt");
fs::write(&path, "").unwrap();
let metadata = fs::metadata(&path).unwrap();
assert!(is_recently_created_empty(
&path,
&metadata,
Duration::from_secs(3600),
));
}
#[test]
fn test_recently_created_empty_keeps_non_empty() {
let temp = TempDir::new().unwrap();
let path = temp.path().join("nonempty.txt");
fs::write(&path, "content").unwrap();
let metadata = fs::metadata(&path).unwrap();
assert!(!is_recently_created_empty(
&path,
&metadata,
Duration::from_secs(3600),
));
}
#[test]
fn test_recently_created_empty_keeps_old_empty() {
let temp = TempDir::new().unwrap();
let path = temp.path().join("old_empty.txt");
fs::write(&path, "").unwrap();
let metadata = fs::metadata(&path).unwrap();
assert!(!is_recently_created_empty(
&path,
&metadata,
Duration::from_secs(0),
));
}
}