in src/nodes/dir.rs [520:554]
fn map(&self, components: &[Component], underlying_path: &Path, writable: bool,
ids: &IdGenerator, cache: &dyn Cache) -> Fallible<ArcNode> {
debug_assert!(
!components.is_empty(),
"Must not be reached because we don't have the containing ArcNode to return it");
let (name, remainder) = split_components(components);
let mut state = self.state.lock().unwrap();
if let Some(dirent) = state.children.get(name) {
// TODO(jmmv): We should probably mark this dirent as an explicit mapping if it already
// wasn't, but the Go variant of this code doesn't do this -- so investigate later.
ensure!(dirent.node.file_type_cached() == fuse::FileType::Directory
&& !remainder.is_empty(), "Already mapped");
return dirent.node.map(remainder, underlying_path, writable, ids, cache);
}
let child = if remainder.is_empty() {
let fs_attr = fs::symlink_metadata(underlying_path)
.with_context(|_| format!("Stat failed for {:?}", underlying_path))?;
cache.get_or_create(ids, underlying_path, &fs_attr, writable)
} else {
self.new_scaffold_child(state.underlying_path.as_ref(), name, ids, time::get_time())
};
let dirent = Dirent { node: child.clone(), explicit_mapping: true };
state.children.insert(name.to_os_string(), dirent);
if remainder.is_empty() {
Ok(child)
} else {
ensure!(child.file_type_cached() == fuse::FileType::Directory, "Already mapped");
child.map(remainder, underlying_path, writable, ids, cache)
}
}