use crate::{
durable::{NamedWriteError, PublicationMode, WriteOptions, write_with},
read::open_regular_file,
};
use std::{
fs,
io::{self, Read as _, Write as _},
path::Path,
};
pub const SIGNATURE: &str = "Signature: 8a477f597d28d172789f06886806bc55";
pub fn ensure(
directory: &Path,
suffix: &[u8],
permissions: u32,
) -> Result<(), NamedWriteError<io::Error>> {
let path = directory.join("CACHEDIR.TAG");
let mut signature = [0_u8; SIGNATURE.len()];
if fs::symlink_metadata(&path).is_ok_and(|metadata| metadata.file_type().is_file())
&& open_regular_file(&path)
.and_then(|mut file| file.read_exact(&mut signature).map_err(Into::into))
.is_ok()
&& signature == SIGNATURE.as_bytes()
{
return Ok(());
}
write_with(
&path,
WriteOptions {
mode: PublicationMode::Replace,
permissions,
},
|file| {
file.write_all(SIGNATURE.as_bytes())?;
file.write_all(suffix)
},
)
}
#[cfg(test)]
mod tests;