weavatrix-worktree 0.2.1

Bounded, crash-recoverable multi-file worktree edits for source refactoring
Documentation
use std::io;

use cap_std::fs::Dir;

pub(crate) fn sync_directory(dir: &Dir) -> io::Result<()> {
    #[cfg(unix)]
    let result = {
        let file = dir.open(".")?;
        rustix::fs::fsync(&file).map_err(io::Error::from)
    };
    #[cfg(not(unix))]
    let result = dir.try_clone()?.into_std_file().sync_all();

    match result {
        Ok(()) => Ok(()),
        #[cfg(windows)]
        Err(error)
            if matches!(
                error.kind(),
                io::ErrorKind::PermissionDenied | io::ErrorKind::InvalidInput
            ) =>
        {
            Ok(())
        }
        Err(error) => Err(error),
    }
}

#[cfg(all(test, unix))]
mod tests {
    use cap_std::{ambient_authority, fs::Dir};

    use super::sync_directory;

    #[test]
    fn syncs_directory_opened_as_capability() {
        let temp = tempfile::tempdir().unwrap();
        let dir = Dir::open_ambient_dir(temp.path(), ambient_authority()).unwrap();

        sync_directory(&dir).unwrap();
    }
}