(source_dir: &Path, target_dir: &Path)
| 3850 | } |
| 3851 | |
| 3852 | fn merge_layer_directory(source_dir: &Path, target_dir: &Path) -> Result<(), String> { |
| 3853 | fs::create_dir_all(target_dir) |
| 3854 | .map_err(|err| format!("create {}: {err}", target_dir.display()))?; |
| 3855 | |
| 3856 | let mut entries = fs::read_dir(source_dir) |
| 3857 | .map_err(|err| format!("read {}: {err}", source_dir.display()))? |
| 3858 | .collect::<Result<Vec<_>, _>>() |
| 3859 | .map_err(|err| format!("read {}: {err}", source_dir.display()))?; |
| 3860 | entries.sort_by_key(fs::DirEntry::file_name); |
| 3861 | |
| 3862 | if entries |
| 3863 | .iter() |
| 3864 | .any(|entry| entry.file_name().to_string_lossy() == ".wh..wh..opq") |
| 3865 | { |
| 3866 | clear_directory_contents(target_dir)?; |
| 3867 | } |
| 3868 | |
| 3869 | for entry in entries { |
| 3870 | let file_name = entry.file_name(); |
| 3871 | let name = file_name.to_string_lossy(); |
| 3872 | if name == ".wh..wh..opq" { |
| 3873 | continue; |
| 3874 | } |
| 3875 | if let Some(hidden_name) = name.strip_prefix(".wh.") { |
| 3876 | remove_path_if_exists(&target_dir.join(hidden_name))?; |
| 3877 | continue; |
| 3878 | } |
| 3879 | |
| 3880 | let source_path = entry.path(); |
| 3881 | let dest_path = target_dir.join(&file_name); |
| 3882 | let metadata = fs::symlink_metadata(&source_path) |
| 3883 | .map_err(|err| format!("stat {}: {err}", source_path.display()))?; |
| 3884 | let file_type = metadata.file_type(); |
| 3885 | |
| 3886 | if file_type.is_dir() { |
| 3887 | if let Ok(dest_metadata) = fs::symlink_metadata(&dest_path) |
| 3888 | && !dest_metadata.file_type().is_dir() |
| 3889 | && !path_is_dir_or_symlink_to_dir(&dest_path)? |
| 3890 | { |
| 3891 | remove_path_if_exists(&dest_path)?; |
| 3892 | } |
| 3893 | fs::create_dir_all(&dest_path) |
| 3894 | .map_err(|err| format!("create {}: {err}", dest_path.display()))?; |
| 3895 | merge_layer_directory(&source_path, &dest_path)?; |
| 3896 | if fs::symlink_metadata(&dest_path) |
| 3897 | .map_err(|err| format!("stat {}: {err}", dest_path.display()))? |
| 3898 | .file_type() |
| 3899 | .is_dir() |
| 3900 | { |
| 3901 | fs::set_permissions(&dest_path, metadata.permissions()) |
| 3902 | .map_err(|err| format!("chmod {}: {err}", dest_path.display()))?; |
| 3903 | } |
| 3904 | } else if file_type.is_file() { |
| 3905 | remove_path_if_exists(&dest_path)?; |
| 3906 | if let Some(parent) = dest_path.parent() { |
| 3907 | fs::create_dir_all(parent) |
| 3908 | .map_err(|err| format!("create {}: {err}", parent.display()))?; |
| 3909 | } |
no test coverage detected